From b6975b44a87e8f0a386dc89ed7e843dea2d8d933 Mon Sep 17 00:00:00 2001 From: Thiago Camargo Date: Tue, 6 Feb 2007 20:03:51 +0000 Subject: [PATCH] JMFInit Custom Class git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@7006 b35dd754-fafc-0310-a699-88a17e54d16e --- .../org/jivesoftware/jingleaudio/JMFInit.java | 272 ++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/JMFInit.java diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/JMFInit.java b/jingle/media/source/org/jivesoftware/jingleaudio/JMFInit.java new file mode 100644 index 000000000..a7cdb69dd --- /dev/null +++ b/jingle/media/source/org/jivesoftware/jingleaudio/JMFInit.java @@ -0,0 +1,272 @@ +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); + } +}