diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java index c53ab1f1b..ac80f39a6 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java @@ -27,15 +27,15 @@ import java.util.List; /** * This class provides necessary Jingle Session jmf methods and behavior. - * + *

* The goal of this class is to provide a flexible way to make JingleManager control jmf streaming APIs without implement them. * For instance you can implement a file transfer using java sockets or a VOIP Media Manager using JMF. - * You can implement many JingleMediaManager according to you necessity. + * You can implement many JingleMediaManager according to you necessity. * * @author Thiago Camargo */ public abstract class JingleMediaManager { - + /** * Return all supported Payloads for this Manager * @@ -43,6 +43,15 @@ public abstract class JingleMediaManager { */ public abstract List getPayloads(); + /** + * Returns the Preferred PayloadType of the Media Manager + * + * @return The PayloadType + */ + public PayloadType getPreferredPayloadType() { + return getPayloads().size() > 0 ? getPayloads().get(0) : null; + } + /** * Create a Media Session Implementation * diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java index d82d9d875..e16f11235 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java @@ -211,27 +211,34 @@ public class MediaNegotiator extends JingleNegotiator { if (!commonAudioPtsHere.isEmpty() && !commonAudioPtsThere.isEmpty()) { - PayloadType.Audio bestPtHere = null; - + if (session.getInitiator().equals(session.getConnection().getUser())) { + PayloadType.Audio bestPtHere = null; - if (bestPtHere == null) - for (PayloadType payloadType : commonAudioPtsHere) + PayloadType payload = this.session.getMediaManager().getPreferredPayloadType(); + + if (payload != null && payload instanceof PayloadType.Audio) + if (commonAudioPtsHere.contains(payload)) + bestPtHere = (PayloadType.Audio) payload; + + if (bestPtHere == null) + for (PayloadType payloadType : commonAudioPtsHere) + if (payloadType instanceof PayloadType.Audio) { + bestPtHere = (PayloadType.Audio) payloadType; + break; + } + + result = bestPtHere; + } + else { + PayloadType.Audio bestPtThere = null; + for (PayloadType payloadType : commonAudioPtsThere) if (payloadType instanceof PayloadType.Audio) { - bestPtHere = (PayloadType.Audio) payloadType; + bestPtThere = (PayloadType.Audio) payloadType; break; } - PayloadType.Audio bestPtThere = null; - for (PayloadType payloadType : commonAudioPtsThere) - if (payloadType instanceof PayloadType.Audio) { - bestPtThere = (PayloadType.Audio) payloadType; - break; - } - - if (session.getInitiator().equals(session.getConnection().getUser())) - result = bestPtHere; - else result = bestPtThere; + } } } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/multi/MultiMediaManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/multi/MultiMediaManager.java index 929306cc1..c0f29fcc7 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/multi/MultiMediaManager.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/multi/MultiMediaManager.java @@ -38,6 +38,8 @@ public class MultiMediaManager extends JingleMediaManager { private List managers = new ArrayList(); + private PayloadType preferredPayloadType = null; + public MultiMediaManager() { } @@ -56,9 +58,10 @@ public class MultiMediaManager extends JingleMediaManager { */ public List getPayloads() { List list = new ArrayList(); + if (preferredPayloadType != null) list.add(preferredPayloadType); for (JingleMediaManager manager : managers) { for (PayloadType payloadType : manager.getPayloads()) { - if (!list.contains(payloadType)) + if (!list.contains(payloadType) && !payloadType.equals(preferredPayloadType)) list.add(payloadType); } } @@ -69,8 +72,8 @@ public class MultiMediaManager extends JingleMediaManager { * Returns a new JingleMediaSession * * @param payloadType payloadType - * @param remote remote Candidate - * @param local local Candidate + * @param remote remote Candidate + * @param local local Candidate * @return JingleMediaSession JingleMediaSession */ public JingleMediaSession createMediaSession(PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { @@ -81,4 +84,14 @@ public class MultiMediaManager extends JingleMediaManager { } return null; } + + public PayloadType getPreferredPayloadType() { + if (preferredPayloadType != null) return preferredPayloadType; + return super.getPreferredPayloadType(); + } + + public void setPreferredPayloadType(PayloadType preferredPayloadType) { + this.preferredPayloadType = preferredPayloadType; + } + } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java index 3089d9e42..0db2bd80c 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java @@ -259,14 +259,11 @@ public abstract class TransportCandidate { public boolean isNull() { if (ip == null) { return true; - } - else if (ip.length() == 0) { + } else if (ip.length() == 0) { return true; - } - else if (port < 0) { + } else if (port < 0) { return true; - } - else { + } else { return false; } } @@ -349,8 +346,7 @@ public abstract class TransportCandidate { if (other.getIp() != null) { return false; } - } - else if (!getIp().equals(other.getIp())) { + } else if (!getIp().equals(other.getIp())) { return false; } @@ -362,8 +358,7 @@ public abstract class TransportCandidate { if (other.getName() != null) { return false; } - } - else if (!getName().equals(other.getName())) { + } else if (!getName().equals(other.getName())) { return false; } if (getPort() != other.getPort()) { @@ -507,20 +502,15 @@ public abstract class TransportCandidate { value = value.toLowerCase(); if (value.equals("udp")) { return UDP; - } - else if (value.equals("tcp")) { + } else if (value.equals("tcp")) { return TCP; - } - else if (value.equals("tcp-act")) { + } else if (value.equals("tcp-act")) { return TCPACT; - } - else if (value.equals("tcp-pass")) { + } else if (value.equals("tcp-pass")) { return TCPPASS; - } - else if (value.equals("ssltcp")) { + } else if (value.equals("ssltcp")) { return SSLTCP; - } - else { + } else { return UDP; } } @@ -545,8 +535,7 @@ public abstract class TransportCandidate { if (other.value != null) { return false; } - } - else if (!value.equals(other.value)) { + } else if (!value.equals(other.value)) { return false; } return true; @@ -560,11 +549,9 @@ public abstract class TransportCandidate { public boolean isNull() { if (value == null) { return true; - } - else if (value.length() == 0) { + } else if (value.length() == 0) { return true; - } - else { + } else { return false; } } @@ -599,11 +586,9 @@ public abstract class TransportCandidate { value = value.toLowerCase(); if (value.equals("myrtpvoice")) { return MYRTPVOICE; - } - else if (value.equals("tcp")) { + } else if (value.equals("tcp")) { return MYRTCPVOICE; - } - else { + } else { return MYRTPVOICE; } } @@ -628,8 +613,7 @@ public abstract class TransportCandidate { if (other.value != null) { return false; } - } - else if (!value.equals(other.value)) { + } else if (!value.equals(other.value)) { return false; } return true; @@ -643,11 +627,9 @@ public abstract class TransportCandidate { public boolean isNull() { if (value == null) { return true; - } - else if (value.length() == 0) { + } else if (value.length() == 0) { return true; - } - else { + } else { return false; } } @@ -687,8 +669,7 @@ public abstract class TransportCandidate { this.send = local.getBytes("UTF-8"); this.receive = remote.getBytes("UTF-8"); - } - else { + } else { this.receive = local.getBytes("UTF-8"); this.send = remote.getBytes("UTF-8"); } @@ -798,6 +779,7 @@ public abstract class TransportCandidate { public boolean datagramReceived(DatagramPacket datagramPacket) { try { + System.out.println("Content Received: " + new String(datagramPacket.getData(), "UTF-8")); String str[] = new String(datagramPacket.getData(), "UTF-8").split(";"); String pass = str[0]; String addr[] = str[1].split(":"); diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleMediaTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleMediaTest.java index 70f7d414b..3144b6787 100644 --- a/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleMediaTest.java +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleMediaTest.java @@ -56,57 +56,57 @@ public class JingleMediaTest extends SmackTestCase { XMPPConnection x0 = getConnection(0); XMPPConnection x1 = getConnection(1); - for(int i=0;i<3;i++) - try { + for (int i = 0; i < 3; i++) + try { - ICETransportManager icetm0 = new ICETransportManager(x0, "jivesoftware.com", 3478); - ICETransportManager icetm1 = new ICETransportManager(x1, "jivesoftware.com", 3478); + 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); + final JingleManager jm0 = new JingleManager( + x0, icetm0); + final JingleManager jm1 = new JingleManager( + x1, icetm1); - jm0.addCreationListener(icetm0); - jm1.addCreationListener(icetm1); + jm0.addCreationListener(icetm0); + jm1.addCreationListener(icetm1); - JingleMediaManager jingleMediaManager0 = new JmfMediaManager(); - JingleMediaManager jingleMediaManager1 = new JmfMediaManager(); + JingleMediaManager jingleMediaManager0 = new JmfMediaManager(); + JingleMediaManager jingleMediaManager1 = new JmfMediaManager(); - jm0.setMediaManager(jingleMediaManager0); - jm1.setMediaManager(jingleMediaManager1); + jm0.setMediaManager(jingleMediaManager0); + jm1.setMediaManager(jingleMediaManager1); - JingleSessionRequestListener jingleSessionRequestListener = new JingleSessionRequestListener() { - public void sessionRequested(final JingleSessionRequest request) { + JingleSessionRequestListener jingleSessionRequestListener = new JingleSessionRequestListener() { + public void sessionRequested(final JingleSessionRequest request) { + + try { + IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); + session.start(request); + } + catch (XMPPException e) { + e.printStackTrace(); + } - try { - IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); - session.start(request); - } - catch (XMPPException e) { - e.printStackTrace(); } + }; - } - }; + jm1.addJingleSessionRequestListener(jingleSessionRequestListener); - jm1.addJingleSessionRequestListener(jingleSessionRequestListener); + OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); - OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); + js0.start(); - js0.start(); + Thread.sleep(50000); + js0.terminate(); - Thread.sleep(50000); - js0.terminate(); + jm1.removeJingleSessionRequestListener(jingleSessionRequestListener); - jm1.removeJingleSessionRequestListener(jingleSessionRequestListener); + Thread.sleep(6000); - Thread.sleep(6000); - - } - catch (Exception e) { - e.printStackTrace(); - } + } + catch (Exception e) { + e.printStackTrace(); + } } @@ -128,19 +128,21 @@ public class JingleMediaTest extends SmackTestCase { jm0.addCreationListener(icetm0); jm1.addCreationListener(icetm1); -/* - final JingleManager jm0 = new JingleManager( - x0, new BasicTransportManager()); - final JingleManager jm1 = new JingleManager( - x1, new BasicTransportManager()); - */ +/* + 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()); + jingleMediaManager0.addMediaManager(new SpeexMediaManager()); MultiMediaManager jingleMediaManager1 = new MultiMediaManager(); jingleMediaManager1.addMediaManager(new JmfMediaManager()); jingleMediaManager1.addMediaManager(new SpeexMediaManager()); + jingleMediaManager1.setPreferredPayloadType(jingleMediaManager1.getPayloads().get(2)); jm0.setMediaManager(jingleMediaManager0); jm1.setMediaManager(jingleMediaManager1);