mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-19 05:02:04 +01:00
273 lines
8.3 KiB
Java
273 lines
8.3 KiB
Java
|
package org.jivesoftware.jingleaudio;
|
||
|
|
||
|
import com.sun.media.util.Registry;
|
||
|
import com.sun.media.ExclusiveUse;
|
||
|
|
||
|
import javax.media.format.AudioFormat;
|
||
|
import javax.media.Renderer;
|
||
|
import javax.media.PlugInManager;
|
||
|
import javax.media.Format;
|
||
|
import java.awt.*;
|
||
|
import java.util.Vector;
|
||
|
|
||
|
public class JMFInit extends Frame implements Runnable {
|
||
|
|
||
|
private String tempDir = "/tmp";
|
||
|
|
||
|
private boolean done = false;
|
||
|
|
||
|
private String userHome;
|
||
|
|
||
|
private boolean visible = false;
|
||
|
|
||
|
public JMFInit(String[] args, boolean visible) {
|
||
|
super("Initializing JMF...");
|
||
|
|
||
|
this.visible = visible;
|
||
|
|
||
|
Registry.set("secure.allowCaptureFromApplets", new Boolean(true));
|
||
|
Registry.set("secure.allowSaveFileFromApplets", new Boolean(true));
|
||
|
|
||
|
updateTemp(args);
|
||
|
|
||
|
try {
|
||
|
Registry.commit();
|
||
|
}
|
||
|
catch (Exception e) {
|
||
|
|
||
|
message("Failed to commit to JMFRegistry!");
|
||
|
}
|
||
|
|
||
|
Thread detectThread = new Thread(this);
|
||
|
detectThread.run();
|
||
|
|
||
|
/*
|
||
|
* int slept = 0; while (!done && slept < 60 * 1000 * 2) { try {
|
||
|
* Thread.currentThread().sleep(500); } catch (InterruptedException ie) { }
|
||
|
* slept += 500; }
|
||
|
*
|
||
|
* if (!done) { console.error("Detection is taking too long!
|
||
|
* Aborting!"); message("Detection is taking too long! Aborting!"); }
|
||
|
*
|
||
|
* try { Thread.currentThread().sleep(2000); } catch
|
||
|
* (InterruptedException ie) { }
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
public void run() {
|
||
|
detectDirectAudio();
|
||
|
detectS8DirectAudio();
|
||
|
detectCaptureDevices();
|
||
|
done = true;
|
||
|
}
|
||
|
|
||
|
private void updateTemp(String[] args) {
|
||
|
if (args != null && args.length > 0) {
|
||
|
tempDir = args[0];
|
||
|
|
||
|
message("Setting cache directory to " + tempDir);
|
||
|
Registry r = new Registry();
|
||
|
try {
|
||
|
r.set("secure.cacheDir", tempDir);
|
||
|
r.commit();
|
||
|
|
||
|
message("Updated registry");
|
||
|
}
|
||
|
catch (Exception e) {
|
||
|
message("Couldn't update registry!");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void detectCaptureDevices() {
|
||
|
// check if JavaSound capture is available
|
||
|
message("Looking for Audio capturer");
|
||
|
Class dsauto = null;
|
||
|
try {
|
||
|
dsauto = Class.forName("DirectSoundAuto");
|
||
|
dsauto.newInstance();
|
||
|
message("Finished detecting DirectSound capturer");
|
||
|
}
|
||
|
catch (ThreadDeath td) {
|
||
|
throw td;
|
||
|
}
|
||
|
catch (Throwable t) {
|
||
|
}
|
||
|
|
||
|
Class jsauto = null;
|
||
|
try {
|
||
|
jsauto = Class.forName("JavaSoundAuto");
|
||
|
jsauto.newInstance();
|
||
|
message("Finished detecting javasound capturer");
|
||
|
}
|
||
|
catch (ThreadDeath td) {
|
||
|
throw td;
|
||
|
}
|
||
|
catch (Throwable t) {
|
||
|
message("JavaSound capturer detection failed!");
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
// Check if VFWAuto or SunVideoAuto is available
|
||
|
message("Looking for video capture devices");
|
||
|
Class auto = null;
|
||
|
Class autoPlus = null;
|
||
|
try {
|
||
|
auto = Class.forName("VFWAuto");
|
||
|
}
|
||
|
catch (Exception e) {
|
||
|
}
|
||
|
if (auto == null) {
|
||
|
try {
|
||
|
auto = Class.forName("SunVideoAuto");
|
||
|
}
|
||
|
catch (Exception ee) {
|
||
|
|
||
|
}
|
||
|
try {
|
||
|
autoPlus = Class.forName("SunVideoPlusAuto");
|
||
|
}
|
||
|
catch (Exception ee) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
if (auto == null) {
|
||
|
try {
|
||
|
auto = Class.forName("V4LAuto");
|
||
|
}
|
||
|
catch (Exception ee) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
try {
|
||
|
Object instance = auto.newInstance();
|
||
|
if (autoPlus != null) {
|
||
|
Object instancePlus = autoPlus.newInstance();
|
||
|
}
|
||
|
|
||
|
message("Finished detecting video capture devices");
|
||
|
}
|
||
|
catch (ThreadDeath td) {
|
||
|
throw td;
|
||
|
}
|
||
|
catch (Throwable t) {
|
||
|
|
||
|
message("Capture device detection failed!");
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
private void detectDirectAudio() {
|
||
|
Class cls;
|
||
|
int plType = PlugInManager.RENDERER;
|
||
|
String dar = "com.sun.media.renderer.audio.DirectAudioRenderer";
|
||
|
try {
|
||
|
// Check if this is the Windows Performance Pack - hack
|
||
|
cls = Class.forName("VFWAuto");
|
||
|
// Check if DS capture is supported, otherwise fail DS renderer
|
||
|
// since NT doesn't have capture
|
||
|
cls = Class.forName("com.sun.media.protocol.dsound.DSound");
|
||
|
// Find the renderer class and instantiate it.
|
||
|
cls = Class.forName(dar);
|
||
|
|
||
|
Renderer rend = (Renderer)cls.newInstance();
|
||
|
try {
|
||
|
// Set the format and open the device
|
||
|
AudioFormat af = new AudioFormat(AudioFormat.LINEAR, 44100, 16,
|
||
|
2);
|
||
|
rend.setInputFormat(af);
|
||
|
rend.open();
|
||
|
Format[] inputFormats = rend.getSupportedInputFormats();
|
||
|
// Register the device
|
||
|
PlugInManager.addPlugIn(dar, inputFormats, new Format[0],
|
||
|
plType);
|
||
|
// Move it to the top of the list
|
||
|
Vector rendList = PlugInManager.getPlugInList(null, null,
|
||
|
plType);
|
||
|
int listSize = rendList.size();
|
||
|
if (rendList.elementAt(listSize - 1).equals(dar)) {
|
||
|
rendList.removeElementAt(listSize - 1);
|
||
|
rendList.insertElementAt(dar, 0);
|
||
|
PlugInManager.setPlugInList(rendList, plType);
|
||
|
PlugInManager.commit();
|
||
|
// Log.debug("registered");
|
||
|
}
|
||
|
rend.close();
|
||
|
}
|
||
|
catch (Throwable t) {
|
||
|
// Log.debug("Error " + t);
|
||
|
}
|
||
|
}
|
||
|
catch (Throwable tt) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void detectS8DirectAudio() {
|
||
|
Class cls;
|
||
|
int plType = PlugInManager.RENDERER;
|
||
|
String dar = "com.sun.media.renderer.audio.DirectAudioRenderer";
|
||
|
try {
|
||
|
// Check if this is the solaris Performance Pack - hack
|
||
|
cls = Class.forName("SunVideoAuto");
|
||
|
|
||
|
// Find the renderer class and instantiate it.
|
||
|
cls = Class.forName(dar);
|
||
|
|
||
|
Renderer rend = (Renderer)cls.newInstance();
|
||
|
|
||
|
if (rend instanceof ExclusiveUse
|
||
|
&& !((ExclusiveUse)rend).isExclusive()) {
|
||
|
// sol8+, DAR supports mixing
|
||
|
Vector rendList = PlugInManager.getPlugInList(null, null,
|
||
|
plType);
|
||
|
int listSize = rendList.size();
|
||
|
boolean found = false;
|
||
|
String rname = null;
|
||
|
|
||
|
for (int i = 0; i < listSize; i++) {
|
||
|
rname = (String)(rendList.elementAt(i));
|
||
|
if (rname.equals(dar)) { // DAR is in the registry
|
||
|
found = true;
|
||
|
rendList.removeElementAt(i);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (found) {
|
||
|
rendList.insertElementAt(dar, 0);
|
||
|
PlugInManager.setPlugInList(rendList, plType);
|
||
|
PlugInManager.commit();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch (Throwable tt) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void message(String mesg) {
|
||
|
System.out.println(mesg);
|
||
|
}
|
||
|
|
||
|
private void createGUI() {
|
||
|
TextArea textBox = new TextArea(5, 50);
|
||
|
add("Center", textBox);
|
||
|
textBox.setEditable(false);
|
||
|
addNotify();
|
||
|
pack();
|
||
|
|
||
|
int scrWidth = (int)Toolkit.getDefaultToolkit().getScreenSize()
|
||
|
.getWidth();
|
||
|
int scrHeight = (int)Toolkit.getDefaultToolkit().getScreenSize()
|
||
|
.getHeight();
|
||
|
|
||
|
setLocation((scrWidth - getWidth()) / 2, (scrHeight - getHeight()) / 2);
|
||
|
|
||
|
setVisible(visible);
|
||
|
|
||
|
}
|
||
|
|
||
|
public static void start(boolean visible) {
|
||
|
JMFInit init = new JMFInit(null, visible);
|
||
|
}
|
||
|
}
|