diff --git a/jingle/media/build/lib/Speex.jar b/jingle/media/build/lib/Speex.jar deleted file mode 100644 index f8abcbb0b..000000000 Binary files a/jingle/media/build/lib/Speex.jar and /dev/null differ diff --git a/jingle/media/build/lib/commons-logging-1.1.jar b/jingle/media/build/lib/commons-logging-1.1.jar deleted file mode 100644 index 2ff9bbd90..000000000 Binary files a/jingle/media/build/lib/commons-logging-1.1.jar and /dev/null differ diff --git a/jingle/media/build/lib/commons-logging-adapters-1.1.jar b/jingle/media/build/lib/commons-logging-adapters-1.1.jar deleted file mode 100644 index 6eec9a525..000000000 Binary files a/jingle/media/build/lib/commons-logging-adapters-1.1.jar and /dev/null differ diff --git a/jingle/media/build/lib/commons-logging-api-1.1.jar b/jingle/media/build/lib/commons-logging-api-1.1.jar deleted file mode 100644 index d1abcbb47..000000000 Binary files a/jingle/media/build/lib/commons-logging-api-1.1.jar and /dev/null differ diff --git a/jingle/media/build/lib/jmf.jar b/jingle/media/build/lib/jmf.jar deleted file mode 100644 index 556b508ef..000000000 Binary files a/jingle/media/build/lib/jmf.jar and /dev/null differ diff --git a/jingle/media/build/lib/jspeex-0.9.7-jfcom.jar b/jingle/media/build/lib/jspeex-0.9.7-jfcom.jar deleted file mode 100644 index f2631b1f4..000000000 Binary files a/jingle/media/build/lib/jspeex-0.9.7-jfcom.jar and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmacm.dll b/jingle/media/build/lib/windows/jmacm.dll deleted file mode 100644 index 3edd7ebf2..000000000 Binary files a/jingle/media/build/lib/windows/jmacm.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmam.dll b/jingle/media/build/lib/windows/jmam.dll deleted file mode 100644 index 46c0ddc2a..000000000 Binary files a/jingle/media/build/lib/windows/jmam.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmcvid.dll b/jingle/media/build/lib/windows/jmcvid.dll deleted file mode 100644 index fad506adf..000000000 Binary files a/jingle/media/build/lib/windows/jmcvid.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmdaud.dll b/jingle/media/build/lib/windows/jmdaud.dll deleted file mode 100644 index 61a18d633..000000000 Binary files a/jingle/media/build/lib/windows/jmdaud.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmdaudc.dll b/jingle/media/build/lib/windows/jmdaudc.dll deleted file mode 100644 index 5847317cd..000000000 Binary files a/jingle/media/build/lib/windows/jmdaudc.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmddraw.dll b/jingle/media/build/lib/windows/jmddraw.dll deleted file mode 100644 index 4001890dc..000000000 Binary files a/jingle/media/build/lib/windows/jmddraw.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmfjawt.dll b/jingle/media/build/lib/windows/jmfjawt.dll deleted file mode 100644 index b44df82af..000000000 Binary files a/jingle/media/build/lib/windows/jmfjawt.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmg723.dll b/jingle/media/build/lib/windows/jmg723.dll deleted file mode 100644 index d1172fd21..000000000 Binary files a/jingle/media/build/lib/windows/jmg723.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmgdi.dll b/jingle/media/build/lib/windows/jmgdi.dll deleted file mode 100644 index a68e16cf9..000000000 Binary files a/jingle/media/build/lib/windows/jmgdi.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmgsm.dll b/jingle/media/build/lib/windows/jmgsm.dll deleted file mode 100644 index 4317ffb55..000000000 Binary files a/jingle/media/build/lib/windows/jmgsm.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmh263enc.dll b/jingle/media/build/lib/windows/jmh263enc.dll deleted file mode 100644 index 8c25686bf..000000000 Binary files a/jingle/media/build/lib/windows/jmh263enc.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmjpeg.dll b/jingle/media/build/lib/windows/jmjpeg.dll deleted file mode 100644 index 3a42e9261..000000000 Binary files a/jingle/media/build/lib/windows/jmjpeg.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmmci.dll b/jingle/media/build/lib/windows/jmmci.dll deleted file mode 100644 index e17df4082..000000000 Binary files a/jingle/media/build/lib/windows/jmmci.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmmpa.dll b/jingle/media/build/lib/windows/jmmpa.dll deleted file mode 100644 index 5356ba37a..000000000 Binary files a/jingle/media/build/lib/windows/jmmpa.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmmpegv.dll b/jingle/media/build/lib/windows/jmmpegv.dll deleted file mode 100644 index d44f1889b..000000000 Binary files a/jingle/media/build/lib/windows/jmmpegv.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmutil.dll b/jingle/media/build/lib/windows/jmutil.dll deleted file mode 100644 index c22b26f9b..000000000 Binary files a/jingle/media/build/lib/windows/jmutil.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmvcm.dll b/jingle/media/build/lib/windows/jmvcm.dll deleted file mode 100644 index 45711f019..000000000 Binary files a/jingle/media/build/lib/windows/jmvcm.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmvfw.dll b/jingle/media/build/lib/windows/jmvfw.dll deleted file mode 100644 index d77e7cde7..000000000 Binary files a/jingle/media/build/lib/windows/jmvfw.dll and /dev/null differ diff --git a/jingle/media/build/lib/windows/jmvh263.dll b/jingle/media/build/lib/windows/jmvh263.dll deleted file mode 100644 index e554d0c19..000000000 Binary files a/jingle/media/build/lib/windows/jmvh263.dll and /dev/null differ diff --git a/jingle/media/build/projects/JingleMedia.iml b/jingle/media/build/projects/JingleMedia.iml deleted file mode 100644 index 51c69d967..000000000 --- a/jingle/media/build/projects/JingleMedia.iml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jingle/media/source/org/jivesoftware/demo/Demo.java b/jingle/media/source/org/jivesoftware/demo/Demo.java deleted file mode 100644 index c170cf101..000000000 --- a/jingle/media/source/org/jivesoftware/demo/Demo.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.jivesoftware.demo; - -import org.jivesoftware.jingleaudio.jmf.JmfMediaManager; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smackx.jingle.IncomingJingleSession; -import org.jivesoftware.smackx.jingle.JingleManager; -import org.jivesoftware.smackx.jingle.JingleSessionRequest; -import org.jivesoftware.smackx.jingle.OutgoingJingleSession; -import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; -import org.jivesoftware.smackx.jingle.nat.BridgedTransportManager; -import org.jivesoftware.smackx.jingle.nat.JingleTransportManager; -import org.jivesoftware.smackx.jingle.nat.RTPBridge; -import org.jivesoftware.smackx.jingle.nat.STUNTransportManager; - -import javax.swing.*; -import java.awt.event.ActionEvent; - -/** - * $RCSfile$ - * $Revision: $ - * $Date: 28/12/2006 - * - * Copyright 2003-2006 Jive Software. - * - * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -public class Demo extends JFrame { - - private JingleTransportManager transportManager = null; - private XMPPConnection xmppConnection = null; - - private String server = null; - private String user = null; - private String pass = null; - - private JingleManager jm = null; - private IncomingJingleSession incoming = null; - private OutgoingJingleSession outgoing = null; - - private JTextField jid = new JTextField(30); - - public Demo(String server, String user, String pass) { - - this.server = server; - this.user = user; - this.pass = pass; - - xmppConnection = new XMPPConnection(server); - try { - xmppConnection.connect(); - xmppConnection.login(user, pass); - initialize(); - } catch (XMPPException e) { - e.printStackTrace(); - } - } - - public void initialize() { - if (RTPBridge.serviceAvailable(xmppConnection)) - transportManager = new BridgedTransportManager(xmppConnection); - else - transportManager = new STUNTransportManager(); - - jm = new JingleManager(xmppConnection, transportManager, new JmfMediaManager()); - - if (transportManager instanceof BridgedTransportManager) - jm.addCreationListener((BridgedTransportManager) transportManager); - - jm.addJingleSessionRequestListener(new JingleSessionRequestListener() { - public void sessionRequested(JingleSessionRequest request) { - - if (incoming != null) - return; - - try { - // Accept the call - incoming = request.accept(); - - // Start the call - incoming.start(); - } - catch (XMPPException e) { - e.printStackTrace(); - } - - } - }); - createGUI(); - } - - public void createGUI() { - - JPanel jPanel = new JPanel(); - - jPanel.add(jid); - - jPanel.add(new JButton(new AbstractAction("Call") { - public void actionPerformed(ActionEvent e) { - if (outgoing != null) return; - try { - outgoing = jm.createOutgoingJingleSession(jid.getText()); - } catch (XMPPException e1) { - e1.printStackTrace(); - } - } - })); - - jPanel.add(new JButton(new AbstractAction("Hangup") { - public void actionPerformed(ActionEvent e) { - if (outgoing != null) - try { - outgoing.terminate(); - } catch (XMPPException e1) { - e1.printStackTrace(); - } finally { - outgoing = null; - } - if (incoming != null) - try { - incoming.terminate(); - } catch (XMPPException e1) { - e1.printStackTrace(); - } finally { - incoming = null; - } - } - })); - - this.add(jPanel); - - } - - public static void main(String args[]) { - - Demo demo = null; - - if (args.length > 2) { - demo = new Demo(args[0], args[1], args[2]); - demo.pack(); - demo.setVisible(true); - demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - } - - } - -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/JMFInit.java b/jingle/media/source/org/jivesoftware/jingleaudio/JMFInit.java deleted file mode 100644 index a7cdb69dd..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/JMFInit.java +++ /dev/null @@ -1,272 +0,0 @@ -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); - } -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioChannel.java b/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioChannel.java deleted file mode 100644 index 2daede606..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioChannel.java +++ /dev/null @@ -1,440 +0,0 @@ -/** - * $RCSfile$ - * $Revision: $ - * $Date: 08/11/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jivesoftware.jingleaudio.jmf; - -import javax.media.*; -import javax.media.control.TrackControl; -import javax.media.format.AudioFormat; -import javax.media.protocol.ContentDescriptor; -import javax.media.protocol.DataSource; -import javax.media.protocol.PushBufferDataSource; -import javax.media.protocol.PushBufferStream; -import javax.media.rtp.RTPManager; -import javax.media.rtp.SendStream; -import javax.media.rtp.SessionAddress; -import javax.media.rtp.rtcp.SourceDescription; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; - -/** - * An Easy to use Audio Channel implemented using JMF. - * It sends and receives jmf for and from desired IPs and ports. - * Also has a rport Symetric behavior for better NAT Traversal. - * It send data from a defined port and receive data in the same port, making NAT binds easier. - *

- * Send from portA to portB and receive from portB in portA. - *

- * Sending - * portA ---> portB - *

- * Receiving - * portB ---> portA - *

- * Transmit and Receive are interdependents. To receive you MUST trasmit. - * - * @author Thiago Camargo - */ -public class AudioChannel { - - private MediaLocator locator; - private String localIpAddress; - private String ipAddress; - private int localPort; - private int portBase; - private Format format; - - private Processor processor = null; - private RTPManager rtpMgrs[]; - private DataSource dataOutput = null; - private AudioReceiver audioReceiver; - - private List sendStreams = new ArrayList(); - - private boolean started = false; - - /** - * Creates an Audio Channel for a desired jmf locator. For instance: new MediaLocator("dsound://") - * - * @param locator - * @param ipAddress - * @param localPort - * @param remotePort - * @param format - */ - public AudioChannel(MediaLocator locator, - String localIpAddress, - String ipAddress, - int localPort, - int remotePort, - Format format) { - - this.locator = locator; - this.localIpAddress = localIpAddress; - this.ipAddress = ipAddress; - this.localPort = localPort; - this.portBase = remotePort; - this.format = format; - } - - /** - * Starts the transmission. Returns null if transmission started ok. - * Otherwise it returns a string with the reason why the setup failed. - * Starts receive also. - */ - public synchronized String start() { - if (started) return null; - started = true; - String result; - - // Create a processor for the specified jmf locator - result = createProcessor(); - if (result != null) { - started = false; - return result; - } - - // Create an RTP session to transmit the output of the - // processor to the specified IP address and port no. - result = createTransmitter(); - if (result != null) { - processor.close(); - processor = null; - started = false; - return result; - } - - // Start the transmission - processor.start(); - - return null; - } - - /** - * Stops the transmission if already started. - * Stops the receiver also. - */ - public void stop() { - if (!started) return; - synchronized (this) { - try { - started = false; - if (processor != null) { - processor.stop(); - processor = null; - - for (int i = 0; i < rtpMgrs.length; i++) { - rtpMgrs[i].removeReceiveStreamListener(audioReceiver); - rtpMgrs[i].removeSessionListener(audioReceiver); - rtpMgrs[i].removeTargets("Session ended."); - rtpMgrs[i].dispose(); - } - - sendStreams.clear(); - - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private String createProcessor() { - if (locator == null) - return "Locator is null"; - - DataSource ds; - - try { - ds = javax.media.Manager.createDataSource(locator); - } catch (Exception e) { - e.printStackTrace(); - return "Couldn't create DataSource"; - } - - // Try to create a processor to handle the input jmf locator - try { - processor = javax.media.Manager.createProcessor(ds); - } catch (NoProcessorException npe) { - npe.printStackTrace(); - return "Couldn't create processor"; - } catch (IOException ioe) { - ioe.printStackTrace(); - return "IOException creating processor"; - } - - // Wait for it to configure - boolean result = waitForState(processor, Processor.Configured); - if (result == false) - return "Couldn't configure processor"; - - // Get the tracks from the processor - TrackControl[] tracks = processor.getTrackControls(); - - // Do we have atleast one track? - if (tracks == null || tracks.length < 1) - return "Couldn't find tracks in processor"; - - // Set the output content descriptor to RAW_RTP - // This will limit the supported formats reported from - // Track.getSupportedFormats to only valid RTP formats. - ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP); - processor.setContentDescriptor(cd); - - Format supported[]; - Format chosen = null; - boolean atLeastOneTrack = false; - - // Program the tracks. - for (int i = 0; i < tracks.length; i++) { - if (tracks[i].isEnabled()) { - - supported = tracks[i].getSupportedFormats(); - - if (supported.length > 0) { - for (Format format : supported) { - if (format instanceof AudioFormat) { - if (this.format.matches(format)) - chosen = format; - } - } - if (chosen != null) { - tracks[i].setFormat(chosen); - System.err.println("Track " + i + " is set to transmit as:"); - System.err.println(" " + chosen); - atLeastOneTrack = true; - } else - tracks[i].setEnabled(false); - } else - tracks[i].setEnabled(false); - } - } - - if (!atLeastOneTrack) - return "Couldn't set any of the tracks to a valid RTP format"; - - result = waitForState(processor, Controller.Realized); - if (result == false) - return "Couldn't realize processor"; - - // Get the output data source of the processor - dataOutput = processor.getDataOutput(); - - return null; - } - - - /** - * Use the RTPManager API to create sessions for each jmf - * track of the processor. - */ - private String createTransmitter() { - - // Cheated. Should have checked the type. - PushBufferDataSource pbds = (PushBufferDataSource) dataOutput; - PushBufferStream pbss[] = pbds.getStreams(); - - rtpMgrs = new RTPManager[pbss.length]; - SessionAddress localAddr, destAddr; - InetAddress ipAddr; - SendStream sendStream; - audioReceiver = new AudioReceiver(this); - int port; - SourceDescription srcDesList[]; - - for (int i = 0; i < pbss.length; i++) { - try { - rtpMgrs[i] = RTPManager.newInstance(); - - port = portBase + 2 * i; - ipAddr = InetAddress.getByName(ipAddress); - - localAddr = new SessionAddress(InetAddress.getByName(this.localIpAddress), - localPort); - - destAddr = new SessionAddress(ipAddr, port); - - rtpMgrs[i].addReceiveStreamListener(audioReceiver); - rtpMgrs[i].addSessionListener(audioReceiver); - - rtpMgrs[i].initialize(localAddr); - - rtpMgrs[i].addTarget(destAddr); - - System.err.println("Created RTP session at " + localPort + " to: " + ipAddress + " " + port); - - sendStream = rtpMgrs[i].createSendStream(dataOutput, i); - - sendStreams.add(sendStream); - - sendStream.start(); - - } catch (Exception e) { - e.printStackTrace(); - return e.getMessage(); - } - } - - return null; - } - - /** - * Set transmit activity. If the active is true, the instance should trasmit. - * If it is set to false, the instance should pause transmit. - * - * @param active - */ - public void setTrasmit(boolean active) { - for (SendStream sendStream : sendStreams) { - try { - if (active) { - sendStream.start(); - System.out.println("START"); - } else { - sendStream.stop(); - System.out.println("STOP"); - } - } - catch (IOException e) { - e.printStackTrace(); - } - - } - } - - /** - * ************************************************************* - * Convenience methods to handle processor's state changes. - * ************************************************************** - */ - - private Integer stateLock = new Integer(0); - private boolean failed = false; - - Integer getStateLock() { - return stateLock; - } - - void setFailed() { - failed = true; - } - - private synchronized boolean waitForState(Processor p, int state) { - p.addControllerListener(new StateListener()); - failed = false; - - // Call the required method on the processor - if (state == Processor.Configured) { - p.configure(); - } else if (state == Processor.Realized) { - p.realize(); - } - - // Wait until we get an event that confirms the - // success of the method, or a failure event. - // See StateListener inner class - while (p.getState() < state && !failed) { - synchronized (getStateLock()) { - try { - getStateLock().wait(); - } catch (InterruptedException ie) { - return false; - } - } - } - - if (failed) - return false; - else - return true; - } - - /** - * ************************************************************* - * Inner Classes - * ************************************************************** - */ - - class StateListener implements ControllerListener { - - public void controllerUpdate(ControllerEvent ce) { - - // If there was an error during configure or - // realize, the processor will be closed - if (ce instanceof ControllerClosedEvent) - setFailed(); - - // All controller events, send a notification - // to the waiting thread in waitForState method. - if (ce instanceof ControllerEvent) { - synchronized (getStateLock()) { - getStateLock().notifyAll(); - } - } - } - } - - public static void main(String args[]) { - - InetAddress localhost; - try { - localhost = InetAddress.getLocalHost(); - - AudioChannel audioChannel0 = new AudioChannel(new MediaLocator("javasound://8000"), localhost.getHostAddress(), localhost.getHostAddress(), 7002, 7020, new AudioFormat(AudioFormat.GSM_RTP)); - AudioChannel audioChannel1 = new AudioChannel(new MediaLocator("javasound://8000"), localhost.getHostAddress(), localhost.getHostAddress(), 7020, 7002, new AudioFormat(AudioFormat.GSM_RTP)); - - audioChannel0.start(); - audioChannel1.start(); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - audioChannel0.setTrasmit(false); - audioChannel1.setTrasmit(false); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - audioChannel0.setTrasmit(true); - audioChannel1.setTrasmit(true); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - audioChannel0.stop(); - audioChannel1.stop(); - - } catch (UnknownHostException e) { - e.printStackTrace(); - } - - } -} \ No newline at end of file diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioFormatUtils.java b/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioFormatUtils.java deleted file mode 100644 index 86bcc0d81..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioFormatUtils.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * $RCSfile$ - * $Revision: $ - * $Date: 08/11/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jivesoftware.jingleaudio.jmf; - -import org.jivesoftware.smackx.jingle.media.PayloadType; - -import javax.media.format.AudioFormat; - -/** - * Audio Format Utils. - * - * @author Thiago Camargo - */ -public class AudioFormatUtils { - - /** - * Return a JMF AudioFormat for a given Jingle Payload type. - * Return null if the payload is not supported by this jmf API. - * - * @param payloadtype - * @return - */ - public static AudioFormat getAudioFormat(PayloadType payloadtype) { - - switch (payloadtype.getId()) { - case 0: - return new AudioFormat(AudioFormat.ULAW_RTP); - case 3: - return new AudioFormat(AudioFormat.GSM_RTP); - case 4: - return new AudioFormat(AudioFormat.G723_RTP); - default: - return null; - } - - } - -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioMediaSession.java b/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioMediaSession.java deleted file mode 100644 index c0dfc7b2a..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioMediaSession.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.jivesoftware.jingleaudio.jmf; /** - * $RCSfile$ - * $Revision: $ - * $Date: 08/11/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.jivesoftware.jingleaudio.jmf.AudioChannel; -import org.jivesoftware.jingleaudio.jmf.AudioFormatUtils; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; -import org.jivesoftware.smackx.jingle.media.PayloadType; -import org.jivesoftware.smackx.jingle.nat.TransportCandidate; - -import javax.media.MediaLocator; -import javax.media.format.AudioFormat; -import java.io.IOException; -import java.net.ServerSocket; - -/** - * This Class implements a complete JingleMediaSession. - * It sould be used to transmit and receive audio captured from the Mic. - * This Class should be automaticly controlled by JingleSession. - * But you could also use in any VOIP application. - * For better NAT Traversal support this implementation donīt support only receive or only transmit. - * To receive you MUST transmit. So the only implemented and functionally methods are startTransmit() and stopTransmit() - * - * @author Thiago Camargo - */ -public class AudioMediaSession extends JingleMediaSession { - - private AudioFormat format; - private AudioChannel audioChannel; - private String locator = "javasound://"; - - /** - * Creates a org.jivesoftware.jingleaudio.jmf.AudioMediaSession with defined payload type, remote and local candidates - * - * @param payloadType Payload of the jmf - * @param remote The remote information. The candidate that the jmf will be sent to. - * @param local The local information. The candidate that will receive the jmf - */ - public AudioMediaSession(final PayloadType payloadType, final TransportCandidate remote, - final TransportCandidate local) { - this(payloadType, remote, local, "javasound://"); - } - - /** - * Creates a org.jivesoftware.jingleaudio.jmf.AudioMediaSession with defined payload type, remote and local candidates - * - * @param payloadType Payload of the jmf - * @param remote The remote information. The candidate that the jmf will be sent to. - * @param local The local information. The candidate that will receive the jmf - */ - public AudioMediaSession(final PayloadType payloadType, final TransportCandidate remote, - final TransportCandidate local, String locator) { - super(payloadType, remote, local); - if (locator != null && !locator.equals("")) - this.locator = locator; - initialize(); - } - - /** - * Initialize the Audio Channel to make it able to send and receive audio - */ - public void initialize() { - - String ip; - String localIp; - int localPort; - int remotePort; - - if (this.getLocal().getSymmetric() != null) { - ip = this.getLocal().getIp(); - localIp = this.getLocal().getLocalIp(); - localPort = getFreePort(); - remotePort = this.getLocal().getSymmetric().getPort(); - - System.out.println(this.getLocal().getConnection() + " " + ip + ": " + localPort + "->" + remotePort); - - } - else { - ip = this.getRemote().getIp(); - localIp = this.getLocal().getLocalIp(); - localPort = this.getLocal().getPort(); - remotePort = this.getRemote().getPort(); - } - - audioChannel = new AudioChannel(new MediaLocator(locator), localIp, ip, localPort, remotePort, AudioFormatUtils.getAudioFormat(this.getPayloadType())); - } - - /** - * Starts transmission and for NAT Traversal reasons start receiving also. - */ - public void startTrasmit() { - audioChannel.start(); - } - - /** - * Set transmit activity. If the active is true, the instance should trasmit. - * If it is set to false, the instance should pause transmit. - * - * @param active - */ - public void setTrasmit(boolean active) { - audioChannel.setTrasmit(active); - } - - /** - * For NAT Reasons this method does nothing. Use startTransmit() to start transmit and receive jmf - */ - public void startReceive() { - // Do nothing - } - - /** - * Stops transmission and for NAT Traversal reasons stop receiving also. - */ - public void stopTrasmit() { - if (audioChannel != null) - audioChannel.stop(); - } - - /** - * For NAT Reasons this method does nothing. Use startTransmit() to start transmit and receive jmf - */ - public void stopReceive() { - // Do nothing - } - - /** - * Obtain a free port we can use. - * - * @return A free port number. - */ - protected int getFreePort() { - ServerSocket ss; - int freePort = 0; - - for (int i = 0; i < 10; i++) { - freePort = (int) (10000 + Math.round(Math.random() * 10000)); - freePort = freePort % 2 == 0 ? freePort : freePort + 1; - try { - ss = new ServerSocket(freePort); - freePort = ss.getLocalPort(); - ss.close(); - return freePort; - } - catch (IOException e) { - e.printStackTrace(); - } - } - try { - ss = new ServerSocket(0); - freePort = ss.getLocalPort(); - ss.close(); - } - catch (IOException e) { - e.printStackTrace(); - } - return freePort; - } -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioReceiver.java b/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioReceiver.java deleted file mode 100644 index 3d1cf5851..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioReceiver.java +++ /dev/null @@ -1,147 +0,0 @@ -/** - * $RCSfile$ - * $Revision: $ - * $Date: 08/11/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jivesoftware.jingleaudio.jmf; - -import javax.media.*; -import javax.media.protocol.DataSource; -import javax.media.rtp.*; -import javax.media.rtp.event.*; - -/** - * This class implements receive methods and listeners to be used in AudioChannel - * - * @author Thiago Camargo - */ -public class AudioReceiver implements ReceiveStreamListener, SessionListener, - ControllerListener { - - boolean dataReceived = false; - - Object dataSync; - - public AudioReceiver(Object dataSync) { - this.dataSync = dataSync; - } - - /** - * JingleSessionListener. - */ - public synchronized void update(SessionEvent evt) { - if (evt instanceof NewParticipantEvent) { - Participant p = ((NewParticipantEvent) evt).getParticipant(); - System.err.println(" - A new participant had just joined: " + p.getCNAME()); - } - } - - /** - * ReceiveStreamListener - */ - public synchronized void update(ReceiveStreamEvent evt) { - - RTPManager mgr = (RTPManager) evt.getSource(); - Participant participant = evt.getParticipant(); // could be null. - ReceiveStream stream = evt.getReceiveStream(); // could be null. - - if (evt instanceof RemotePayloadChangeEvent) { - - System.err.println(" - Received an RTP PayloadChangeEvent."); - System.err.println("Sorry, cannot handle payload change."); - // System.exit(0); - - } else if (evt instanceof NewReceiveStreamEvent) { - - try { - stream = ((NewReceiveStreamEvent) evt).getReceiveStream(); - DataSource ds = stream.getDataSource(); - - // Find out the formats. - RTPControl ctl = (RTPControl) ds.getControl("javax.jmf.rtp.RTPControl"); - if (ctl != null) { - System.err.println(" - Recevied new RTP stream: " + ctl.getFormat()); - } else - System.err.println(" - Recevied new RTP stream"); - - if (participant == null) - System.err.println(" The sender of this stream had yet to be identified."); - else { - System.err.println(" The stream comes from: " + participant.getCNAME()); - } - - // create a player by passing datasource to the Media Manager - Player p = javax.media.Manager.createPlayer(ds); - if (p == null) - return; - - p.addControllerListener(this); - p.realize(); - - // Notify intialize() that a new stream had arrived. - synchronized (dataSync) { - dataReceived = true; - dataSync.notifyAll(); - } - - } catch (Exception e) { - System.err.println("NewReceiveStreamEvent exception " + e.getMessage()); - return; - } - - } else if (evt instanceof StreamMappedEvent) { - - if (stream != null && stream.getDataSource() != null) { - DataSource ds = stream.getDataSource(); - // Find out the formats. - RTPControl ctl = (RTPControl) ds.getControl("javax.jmf.rtp.RTPControl"); - System.err.println(" - The previously unidentified stream "); - if (ctl != null) - System.err.println(" " + ctl.getFormat()); - System.err.println(" had now been identified as sent by: " + participant.getCNAME()); - } - } else if (evt instanceof ByeEvent) { - - System.err.println(" - Got \"bye\" from: " + participant.getCNAME()); - - } - - } - - /** - * ControllerListener for the Players. - */ - public synchronized void controllerUpdate(ControllerEvent ce) { - - Player p = (Player) ce.getSourceController(); - - if (p == null) - return; - - // Get this when the internal players are realized. - if (ce instanceof RealizeCompleteEvent) { - p.start(); - } - - if (ce instanceof ControllerErrorEvent) { - p.removeControllerListener(this); - System.err.println("Receiver internal error: " + ce); - } - - } -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/JmfMediaManager.java b/jingle/media/source/org/jivesoftware/jingleaudio/jmf/JmfMediaManager.java deleted file mode 100644 index f43d87dfa..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/jmf/JmfMediaManager.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.jivesoftware.jingleaudio.jmf; - -/** - * $RCSfile$ - * $Revision: $ - * $Date: 08/11/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.jivesoftware.smackx.jingle.media.JingleMediaManager; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; -import org.jivesoftware.smackx.jingle.media.PayloadType; -import org.jivesoftware.smackx.jingle.nat.TransportCandidate; -import org.jivesoftware.jingleaudio.JMFInit; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.ArrayList; - -/** - * Implements a jingleMediaManager using JMF based API. - * It supports GSM and G723 codecs. - * This API only currently works on windows and Mac. - * - * @author Thiago Camargo - */ -public class JmfMediaManager extends JingleMediaManager { - - private List payloads = new ArrayList(); - - /** - * Creates a Media Manager instance - */ - public JmfMediaManager() { - setupPayloads(); - } - - /** - * Returns a new jingleMediaSession - * - * @param payloadType - * @param remote - * @param local - * @return - */ - public JingleMediaSession createMediaSession(final PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { - return new AudioMediaSession(payloadType, remote, local); - } - - /** - * Setup API supported Payloads - */ - private void setupPayloads() { - payloads.add(new PayloadType.Audio(3, "gsm")); - payloads.add(new PayloadType.Audio(4, "g723")); - payloads.add(new PayloadType.Audio(0, "PCMU", 16000)); - } - - /** - * Return all supported Payloads for this Manager - * - * @return The Payload List - */ - public List getPayloads() { - return payloads; - } - - /** - * Runs JMFInit the first time the application is started so that capture - * devices are properly detected and initialized by JMF. - */ - public static void setupJMF() { - // .jmf is the place where we store the jmf.properties file used - // by JMF. if the directory does not exist or it does not contain - // a jmf.properties file. or if the jmf.properties file has 0 length - // then this is the first time we're running and should continue to - // with JMFInit - String homeDir = System.getProperty("user.home"); - File jmfDir = new File(homeDir, ".jmf"); - String classpath = System.getProperty("java.class.path"); - classpath += System.getProperty("path.separator") - + jmfDir.getAbsolutePath(); - System.setProperty("java.class.path", classpath); - - if (!jmfDir.exists()) - jmfDir.mkdir(); - - File jmfProperties = new File(jmfDir, "jmf.properties"); - - if (!jmfProperties.exists()) { - try { - jmfProperties.createNewFile(); - } - catch (IOException ex) { - System.out.println("Failed to create jmf.properties"); - ex.printStackTrace(); - } - } - - // if we're running on linux checkout that libjmutil.so is where it - // should be and put it there. - runLinuxPreInstall(); - - //if (jmfProperties.length() == 0) { - new JMFInit(null, false); - //} - - } - - private static void runLinuxPreInstall() { - // @TODO Implement Linux Pre-Install - } -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/jspeex/AudioMediaSession.java b/jingle/media/source/org/jivesoftware/jingleaudio/jspeex/AudioMediaSession.java deleted file mode 100644 index 5169fd127..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/jspeex/AudioMediaSession.java +++ /dev/null @@ -1,225 +0,0 @@ -/** - * $RCSfile$ - * $Revision: $ - * $Date: 25/12/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jivesoftware.jingleaudio.jspeex; - -import mil.jfcom.cie.media.session.MediaSession; -import mil.jfcom.cie.media.session.MediaSessionListener; -import mil.jfcom.cie.media.session.StreamPlayer; -import mil.jfcom.cie.media.srtp.packetizer.SpeexFormat; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; -import org.jivesoftware.smackx.jingle.media.PayloadType; -import org.jivesoftware.smackx.jingle.nat.TransportCandidate; - -import javax.media.NoProcessorException; -import javax.media.format.UnsupportedFormatException; -import javax.media.rtp.rtcp.SenderReport; -import javax.media.rtp.rtcp.SourceDescription; -import java.io.IOException; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.security.GeneralSecurityException; - -/** - * This Class implements a complete JingleMediaSession. - * It sould be used to transmit and receive audio captured from the Mic. - * This Class should be automaticly controlled by JingleSession. - * But you could also use in any VOIP application. - * For better NAT Traversal support this implementation donīt support only receive or only transmit. - * To receive you MUST transmit. So the only implemented and functionally methods are startTransmit() and stopTransmit() - * - * @author Thiago Camargo - */ - -public class AudioMediaSession extends JingleMediaSession implements MediaSessionListener { - - private MediaSession mediaSession; - - /** - * Create session for test program. - * - * @param micOn microphone turned on - */ - public static MediaSession createSession(String localhost, int localPort, String remoteHost, int remotePort, MediaSessionListener eventHandler, int quality, boolean secure, boolean micOn) throws NoProcessorException, UnsupportedFormatException, IOException, GeneralSecurityException { - - SpeexFormat.setFramesPerPacket(1); - /** - * The master key. Hardcoded for now. - */ - byte[] masterKey = new byte[]{(byte) 0xE1, (byte) 0xF9, 0x7A, 0x0D, 0x3E, 0x01, (byte) 0x8B, (byte) 0xE0, (byte) 0xD6, 0x4F, (byte) 0xA3, 0x2C, 0x06, (byte) 0xDE, 0x41, 0x39}; - - /** - * The master salt. Hardcoded for now. - */ - byte[] masterSalt = new byte[]{0x0E, (byte) 0xC6, 0x75, (byte) 0xAD, 0x49, (byte) 0x8A, (byte) 0xFE, (byte) 0xEB, (byte) 0xB6, (byte) 0x96, 0x0B, 0x3A, (byte) 0xAB, (byte) 0xE6}; - - DatagramSocket[] localPorts = MediaSession.getLocalPorts(InetAddress.getByName(localhost), localPort); - MediaSession session = MediaSession.createInstance(remoteHost, remotePort, localPorts, quality, secure, masterKey, masterSalt); - session.setListener(eventHandler); - - session.setSourceDescription(new SourceDescription[]{new SourceDescription(SourceDescription.SOURCE_DESC_NAME, "Superman", 1, false), new SourceDescription(SourceDescription.SOURCE_DESC_EMAIL, "cdcie.tester@je.jfcom.mil", 1, false), new SourceDescription(SourceDescription.SOURCE_DESC_LOC, InetAddress.getByName(localhost) + " Port " + session.getLocalDataPort(), 1, false), new SourceDescription(SourceDescription.SOURCE_DESC_TOOL, "JFCOM CDCIE Audio Chat", 1, false)}); - return session; - } - - - /** - * Creates a org.jivesoftware.jingleaudio.jmf.AudioMediaSession with defined payload type, remote and local candidates - * - * @param payloadType Payload of the jmf - * @param remote The remote information. The candidate that the jmf will be sent to. - * @param local The local information. The candidate that will receive the jmf - */ - public AudioMediaSession(final PayloadType payloadType, final TransportCandidate remote, - final TransportCandidate local) { - super(payloadType, remote, local); - initialize(); - } - - /** - * Initialize the Audio Channel to make it able to send and receive audio - */ - public void initialize() { - - String ip; - String localIp; - int localPort; - int remotePort; - - if (this.getLocal().getSymmetric() != null) { - ip = this.getLocal().getIp(); - localIp = this.getLocal().getLocalIp(); - localPort = getFreePort(); - remotePort = this.getLocal().getSymmetric().getPort(); - - System.out.println(this.getLocal().getConnection() + " " + ip + ": " + localPort + "->" + remotePort); - - } - else { - ip = this.getRemote().getIp(); - localIp = this.getLocal().getLocalIp(); - localPort = this.getLocal().getPort(); - remotePort = this.getRemote().getPort(); - } - - try { - mediaSession = createSession(localIp, localPort, ip, remotePort, this, 2, false, true); - } - catch (NoProcessorException e) { - e.printStackTrace(); - } - catch (UnsupportedFormatException e) { - e.printStackTrace(); - } - catch (IOException e) { - e.printStackTrace(); - } - catch (GeneralSecurityException e) { - e.printStackTrace(); - } - } - - /** - * Starts transmission and for NAT Traversal reasons start receiving also. - */ - public void startTrasmit() { - try { - System.out.println("start"); - mediaSession.start(true); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * Set transmit activity. If the active is true, the instance should trasmit. - * If it is set to false, the instance should pause transmit. - * - * @param active - */ - public void setTrasmit(boolean active) { - // Do nothing - } - - /** - * For NAT Reasons this method does nothing. Use startTransmit() to start transmit and receive jmf - */ - public void startReceive() { - // Do nothing - } - - /** - * Stops transmission and for NAT Traversal reasons stop receiving also. - */ - public void stopTrasmit() { - if (mediaSession != null) - mediaSession.close(); - } - - /** - * For NAT Reasons this method does nothing. Use startTransmit() to start transmit and receive jmf - */ - public void stopReceive() { - // Do nothing - } - - public void newStreamIdentified(StreamPlayer streamPlayer) { - } - - public void senderReportReceived(SenderReport report) { - } - - public void streamClosed(StreamPlayer stream, boolean timeout) { - } - - /** - * Obtain a free port we can use. - * - * @return A free port number. - */ - protected int getFreePort() { - ServerSocket ss; - int freePort = 0; - - for (int i = 0; i < 10; i++) { - freePort = (int) (10000 + Math.round(Math.random() * 10000)); - freePort = freePort % 2 == 0 ? freePort : freePort + 1; - try { - ss = new ServerSocket(freePort); - freePort = ss.getLocalPort(); - ss.close(); - return freePort; - } - catch (IOException e) { - e.printStackTrace(); - } - } - try { - ss = new ServerSocket(0); - freePort = ss.getLocalPort(); - ss.close(); - } - catch (IOException e) { - e.printStackTrace(); - } - return freePort; - } -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/jspeex/SpeexMediaManager.java b/jingle/media/source/org/jivesoftware/jingleaudio/jspeex/SpeexMediaManager.java deleted file mode 100644 index 7b02fc406..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/jspeex/SpeexMediaManager.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * $RCSfile$ - * $Revision: $ - * $Date: 25/12/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jivesoftware.jingleaudio.jspeex; - -import org.jivesoftware.smackx.jingle.media.JingleMediaManager; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; -import org.jivesoftware.smackx.jingle.media.PayloadType; -import org.jivesoftware.smackx.jingle.nat.TransportCandidate; -import org.jivesoftware.jingleaudio.JMFInit; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.ArrayList; - -/** - * Implements a jingleMediaManager using JMF based API and JSpeex. - * It supports Speex codec. - * This API only currently works on windows. - * - * @author Thiago Camargo - */ -public class SpeexMediaManager extends JingleMediaManager { - - private List payloads = new ArrayList(); - - public SpeexMediaManager() { - setupPayloads(); - setupJMF(); - } - - public JingleMediaSession createMediaSession(PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { - return new AudioMediaSession(payloadType, remote, local); - } - - /** - * Setup API supported Payloads - */ - private void setupPayloads() { - payloads.add(new PayloadType.Audio(15, "speex")); - } - - /** - * Return all supported Payloads for this Manager - * - * @return The Payload List - */ - public List getPayloads() { - return payloads; - } - - /** - * Runs JMFInit the first time the application is started so that capture - * devices are properly detected and initialized by JMF. - */ - public static void setupJMF() { - // .jmf is the place where we store the jmf.properties file used - // by JMF. if the directory does not exist or it does not contain - // a jmf.properties file. or if the jmf.properties file has 0 length - // then this is the first time we're running and should continue to - // with JMFInit - String homeDir = System.getProperty("user.home"); - File jmfDir = new File(homeDir, ".jmf"); - String classpath = System.getProperty("java.class.path"); - classpath += System.getProperty("path.separator") - + jmfDir.getAbsolutePath(); - System.setProperty("java.class.path", classpath); - - if (!jmfDir.exists()) - jmfDir.mkdir(); - - File jmfProperties = new File(jmfDir, "jmf.properties"); - - if (!jmfProperties.exists()) { - try { - jmfProperties.createNewFile(); - } - catch (IOException ex) { - System.out.println("Failed to create jmf.properties"); - ex.printStackTrace(); - } - } - - // if we're running on linux checkout that libjmutil.so is where it - // should be and put it there. - runLinuxPreInstall(); - - if (jmfProperties.length() == 0) { - new JMFInit(null, false); - } - - } - - private static void runLinuxPreInstall() { - // @TODO Implement Linux Pre-Install - } -} diff --git a/jingle/media/source/org/jivesoftware/jingleaudio/multi/MultiMediaManager.java b/jingle/media/source/org/jivesoftware/jingleaudio/multi/MultiMediaManager.java deleted file mode 100644 index 590d84888..000000000 --- a/jingle/media/source/org/jivesoftware/jingleaudio/multi/MultiMediaManager.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.jivesoftware.jingleaudio.multi; - -import org.jivesoftware.smackx.jingle.media.JingleMediaManager; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; -import org.jivesoftware.smackx.jingle.media.PayloadType; -import org.jivesoftware.smackx.jingle.nat.TransportCandidate; - -import java.util.*; - -/** - * Implements a MultiMediaManager using other JingleMediaManager implementations. - * It supports every Codecs that JingleMediaManagers added has. - * - * @author Thiago Camargo - */ - -public class MultiMediaManager extends JingleMediaManager { - - private List managers = new ArrayList(); - - public MultiMediaManager() { - } - - public void addMediaManager(JingleMediaManager manager) { - managers.add(manager); - } - - public void removeMediaManager(JingleMediaManager manager) { - managers.remove(manager); - } - - /** - * Return all supported Payloads for this Manager. - * - * @return The Payload List - */ - public List getPayloads() { - List list = new ArrayList(); - for (JingleMediaManager manager : managers) { - for (PayloadType payloadType : manager.getPayloads()) { - if (!list.contains(payloadType)) - list.add(payloadType); - } - } - return list; - } - - /** - * Returns a new JingleMediaSession - * - * @param payloadType - * @param remote - * @param local - * @return JingleMediaSession - */ - public JingleMediaSession createMediaSession(PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { - for (JingleMediaManager manager : managers) { - if (manager.getPayloads().contains(payloadType)) { - return manager.createMediaSession(payloadType, remote, local); - } - } - return null; - } -} diff --git a/jingle/media/test/JingleMediaTest.java b/jingle/media/test/JingleMediaTest.java deleted file mode 100644 index 335d9bed8..000000000 --- a/jingle/media/test/JingleMediaTest.java +++ /dev/null @@ -1,440 +0,0 @@ -import junit.framework.TestCase; -import org.jivesoftware.jingleaudio.jmf.AudioChannel; -import org.jivesoftware.jingleaudio.jmf.JmfMediaManager; -import org.jivesoftware.jingleaudio.jspeex.SpeexMediaManager; -import org.jivesoftware.jingleaudio.multi.MultiMediaManager; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.test.SmackTestCase; -import org.jivesoftware.smackx.jingle.IncomingJingleSession; -import org.jivesoftware.smackx.jingle.JingleManager; -import org.jivesoftware.smackx.jingle.JingleSessionRequest; -import org.jivesoftware.smackx.jingle.OutgoingJingleSession; -import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; -import org.jivesoftware.smackx.jingle.media.JingleMediaManager; -import org.jivesoftware.smackx.jingle.nat.BridgedTransportManager; -import org.jivesoftware.smackx.jingle.nat.ICETransportManager; -import org.jivesoftware.smackx.jingle.nat.STUNTransportManager; -import org.jivesoftware.smackx.jingle.nat.BasicTransportManager; - -import javax.media.MediaLocator; -import javax.media.format.AudioFormat; -import java.net.InetAddress; - -/** - * $RCSfile$ - * $Revision: $ - * $Date: 09/11/2006 - *

- * Copyright 2003-2006 Jive Software. - *

- * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -public class JingleMediaTest extends SmackTestCase { - - public JingleMediaTest(final String name) { - super(name); - } - - public void testCompleteJmf() { - - try { - - XMPPConnection x0 = getConnection(0); - XMPPConnection x1 = getConnection(1); - - ICETransportManager icetm0 = new ICETransportManager(x0, "jivesoftware.com", 3478); - ICETransportManager icetm1 = new ICETransportManager(x1, "jivesoftware.com", 3478); - - final JingleManager jm0 = new JingleManager( - x0, icetm0); - final JingleManager jm1 = new JingleManager( - x1, icetm1); - - jm0.addCreationListener(icetm0); - jm1.addCreationListener(icetm1); - - JingleMediaManager jingleMediaManager0 = new JmfMediaManager(); - JingleMediaManager jingleMediaManager1 = new JmfMediaManager(); - - jm0.setMediaManager(jingleMediaManager0); - jm1.setMediaManager(jingleMediaManager1); - - jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { - public void sessionRequested(final JingleSessionRequest request) { - - try { - IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); - session.start(request); - } - catch (XMPPException e) { - e.printStackTrace(); - } - - } - }); - - OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); - - js0.start(); - - Thread.sleep(60000); - js0.terminate(); - - Thread.sleep(6000); - - x0.disconnect(); - x1.disconnect(); - - } - catch (Exception e) { - e.printStackTrace(); - } - - } - - public void testCompleteMulti() { - - try { - - XMPPConnection x0 = getConnection(0); - XMPPConnection x1 = getConnection(1); - - - ICETransportManager icetm0 = new ICETransportManager(x0, "jivesoftware.com", 3478); - ICETransportManager icetm1 = new ICETransportManager(x1, "jivesoftware.com", 3478); - - final JingleManager jm0 = new JingleManager( - x0, icetm0); - final JingleManager jm1 = new JingleManager( - x1, icetm1); - - jm0.addCreationListener(icetm0); - jm1.addCreationListener(icetm1); -/* - - final JingleManager jm0 = new JingleManager( - x0, new BasicTransportManager()); - final JingleManager jm1 = new JingleManager( - x1, new BasicTransportManager()); - */ - MultiMediaManager jingleMediaManager0 = new MultiMediaManager(); - jingleMediaManager0.addMediaManager(new SpeexMediaManager()); - jingleMediaManager0.addMediaManager(new JmfMediaManager()); - MultiMediaManager jingleMediaManager1 = new MultiMediaManager(); - jingleMediaManager1.addMediaManager(new JmfMediaManager()); - jingleMediaManager1.addMediaManager(new SpeexMediaManager()); - - jm0.setMediaManager(jingleMediaManager0); - jm1.setMediaManager(jingleMediaManager1); - - jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { - public void sessionRequested(final JingleSessionRequest request) { - - try { - IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); - session.start(request); - } - catch (XMPPException e) { - e.printStackTrace(); - } - - } - }); - - OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); - - js0.start(); - - Thread.sleep(60000); - js0.terminate(); - - Thread.sleep(6000); - - x0.disconnect(); - x1.disconnect(); - - } - catch (Exception e) { - e.printStackTrace(); - } - - } - - public void testCompleteSpeex() { - - try { - - //XMPPConnection.DEBUG_ENABLED = true; - - XMPPConnection x0 = getConnection(0); - XMPPConnection x1 = getConnection(1); - - final JingleManager jm0 = new JingleManager( - x0, new STUNTransportManager()); - final JingleManager jm1 = new JingleManager( - x1, new STUNTransportManager()); - - JingleMediaManager jingleMediaManager0 = new SpeexMediaManager(); - JingleMediaManager jingleMediaManager1 = new SpeexMediaManager(); - - jm0.setMediaManager(jingleMediaManager0); - jm1.setMediaManager(jingleMediaManager1); - - jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { - public void sessionRequested(final JingleSessionRequest request) { - - try { - - IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); - - session.start(request); - } - catch (XMPPException e) { - e.printStackTrace(); - } - - } - }); - - OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); - - js0.start(); - - Thread.sleep(150000); - js0.terminate(); - - Thread.sleep(6000); - - x0.disconnect(); - x1.disconnect(); - - } - catch (Exception e) { - e.printStackTrace(); - } - - } - - public void testCompleteWithBridge() { - - for (int i = 0; i < 1; i += 2) { - final int n = i; - Thread t = new Thread(new Runnable() { - public void run() { - try { - - XMPPConnection x0 = getConnection(n); - XMPPConnection x1 = getConnection(n + 1); - - BridgedTransportManager btm0 = new BridgedTransportManager(x0); - BridgedTransportManager btm1 = new BridgedTransportManager(x1); - - final JingleManager jm0 = new JingleManager(x0, btm0); - final JingleManager jm1 = new JingleManager(x1, btm1); - - jm0.addCreationListener(btm0); - jm1.addCreationListener(btm1); - - JingleMediaManager jingleMediaManager = new JmfMediaManager(); - JingleMediaManager jingleMediaManager2 = new JmfMediaManager(); - - jm0.setMediaManager(jingleMediaManager); - jm1.setMediaManager(jingleMediaManager2); - - jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { - public void sessionRequested(final JingleSessionRequest request) { - - try { - IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); - - session.start(request); - } - catch (XMPPException e) { - e.printStackTrace(); - } - - } - }); - - OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); - - js0.start(); - - Thread.sleep(55000); - - js0.terminate(); - - Thread.sleep(3000); - - x0.disconnect(); - x1.disconnect(); - - } - catch (Exception e) { - e.printStackTrace(); - } - } - }); - - t.start(); - } - - try { - Thread.sleep(250000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public void testCompleteWithBridgeB() { - try { - - //XMPPConnection.DEBUG_ENABLED = true; - - XMPPConnection x0 = getConnection(0); - XMPPConnection x1 = getConnection(1); - - BridgedTransportManager btm0 = new BridgedTransportManager(x0); - BridgedTransportManager btm1 = new BridgedTransportManager(x1); - - final JingleManager jm0 = new JingleManager(x0, btm0); - final JingleManager jm1 = new JingleManager(x1, btm1); - - jm0.addCreationListener(btm0); - jm1.addCreationListener(btm1); - - JingleMediaManager jingleMediaManager = new JmfMediaManager(); - - jm0.setMediaManager(jingleMediaManager); - jm1.setMediaManager(jingleMediaManager); - - jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { - public void sessionRequested(final JingleSessionRequest request) { - - try { - - IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); - - session.start(request); - } - catch (XMPPException e) { - e.printStackTrace(); - } - - } - }); - - OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); - - js0.start(); - - Thread.sleep(20000); - - js0.terminate(); - - Thread.sleep(3000); - - js0 = jm0.createOutgoingJingleSession(x1.getUser()); - - js0.start(); - - Thread.sleep(20000); - - js0.terminate(); - - Thread.sleep(3000); - - x0.disconnect(); - x1.disconnect(); - - } - catch (Exception e) { - e.printStackTrace(); - } - - } - - public void testAudioChannelOpenClose - () { - for (int i = 0; i < 5; i++) { - try { - AudioChannel audioChannel0 = new AudioChannel(new MediaLocator("javasound://"), InetAddress.getLocalHost().getHostAddress(), InetAddress.getLocalHost().getHostAddress(), 7002, 7020, new AudioFormat(AudioFormat.GSM_RTP)); - AudioChannel audioChannel1 = new AudioChannel(new MediaLocator("javasound://"), InetAddress.getLocalHost().getHostAddress(), InetAddress.getLocalHost().getHostAddress(), 7020, 7002, new AudioFormat(AudioFormat.GSM_RTP)); - - audioChannel0.start(); - audioChannel1.start(); - - try { - Thread.sleep(10000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } - - audioChannel0.stop(); - audioChannel1.stop(); - - try { - Thread.sleep(3000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } - } - catch (Exception e) { - e.printStackTrace(); - } - } - } - - public void testAudioChannelStartStop - () { - - try { - AudioChannel audioChannel0 = new AudioChannel(new MediaLocator("javasound://"), InetAddress.getLocalHost().getHostAddress(), InetAddress.getLocalHost().getHostAddress(), 7002, 7020, new AudioFormat(AudioFormat.GSM_RTP)); - AudioChannel audioChannel1 = new AudioChannel(new MediaLocator("javasound://"), InetAddress.getLocalHost().getHostAddress(), InetAddress.getLocalHost().getHostAddress(), 7020, 7002, new AudioFormat(AudioFormat.GSM_RTP)); - - for (int i = 0; i < 5; i++) { - - audioChannel0.start(); - audioChannel1.start(); - - try { - Thread.sleep(10000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } - - audioChannel0.stop(); - audioChannel1.stop(); - - try { - Thread.sleep(3000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - catch (Exception e) { - e.printStackTrace(); - } - } - - protected int getMaxConnections() { - return 2; - } -} \ No newline at end of file