2007-03-09 18:43:28 +01:00
|
|
|
package org.jivesoftware.smackx.jingle.mediaimpl;
|
|
|
|
|
2008-10-30 22:20:29 +01:00
|
|
|
import java.awt.Frame;
|
|
|
|
import java.awt.TextArea;
|
|
|
|
import java.awt.Toolkit;
|
|
|
|
import java.util.Vector;
|
2007-03-09 18:43:28 +01:00
|
|
|
|
|
|
|
import javax.media.Format;
|
2008-10-30 22:20:29 +01:00
|
|
|
import javax.media.PlugInManager;
|
|
|
|
import javax.media.Renderer;
|
|
|
|
import javax.media.format.AudioFormat;
|
|
|
|
|
|
|
|
import org.jivesoftware.smackx.jingle.SmackLogger;
|
|
|
|
|
|
|
|
import com.sun.media.ExclusiveUse;
|
|
|
|
import com.sun.media.util.Registry;
|
2007-03-09 18:43:28 +01:00
|
|
|
|
|
|
|
public class JMFInit extends Frame implements Runnable {
|
|
|
|
|
2012-10-26 12:47:55 +02:00
|
|
|
private static final long serialVersionUID = 6476412003260641680L;
|
|
|
|
|
2008-10-30 22:20:29 +01:00
|
|
|
private static final SmackLogger LOGGER = SmackLogger.getLogger(JMFInit.class);
|
|
|
|
|
|
|
|
private String tempDir = "/tmp";
|
2007-03-09 18:43:28 +01:00
|
|
|
|
|
|
|
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", true);
|
|
|
|
Registry.set("secure.allowSaveFileFromApplets", 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");
|
2012-10-26 12:47:55 +02:00
|
|
|
Class<?> dsauto;
|
2007-03-09 18:43:28 +01:00
|
|
|
try {
|
|
|
|
dsauto = Class.forName("DirectSoundAuto");
|
|
|
|
dsauto.newInstance();
|
|
|
|
message("Finished detecting DirectSound capturer");
|
|
|
|
}
|
|
|
|
catch (ThreadDeath td) {
|
|
|
|
throw td;
|
|
|
|
}
|
|
|
|
catch (Throwable t) {
|
|
|
|
//Do nothing
|
|
|
|
}
|
|
|
|
|
2012-10-26 12:47:55 +02:00
|
|
|
Class<?> jsauto;
|
2007-03-09 18:43:28 +01:00
|
|
|
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() {
|
2012-10-26 12:47:55 +02:00
|
|
|
Class<?> cls;
|
2007-03-09 18:43:28 +01:00
|
|
|
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
|
2012-10-26 12:47:55 +02:00
|
|
|
Vector<String> rendList = PlugInManager.getPlugInList(null, null,
|
2007-03-09 18:43:28 +01:00
|
|
|
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) {
|
|
|
|
//Do nothing
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void detectS8DirectAudio() {
|
2012-10-26 12:47:55 +02:00
|
|
|
Class<?> cls;
|
2007-03-09 18:43:28 +01:00
|
|
|
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
|
2012-10-26 12:47:55 +02:00
|
|
|
Vector<String> rendList = PlugInManager.getPlugInList(null, null,
|
2007-03-09 18:43:28 +01:00
|
|
|
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) {
|
|
|
|
//Do nothing
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void message(String mesg) {
|
2008-10-30 22:20:29 +01:00
|
|
|
LOGGER.debug(mesg);
|
2007-03-09 18:43:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
|
|
|
new JMFInit(null, visible);
|
|
|
|
}
|
|
|
|
}
|