diff --git a/src/net/java/sip/communicator/impl/protocol/sip/CallPeerMediaHandler.java b/src/net/java/sip/communicator/impl/protocol/sip/CallPeerMediaHandler.java
index b42cbff5f..d107dea32 100644
--- a/src/net/java/sip/communicator/impl/protocol/sip/CallPeerMediaHandler.java
+++ b/src/net/java/sip/communicator/impl/protocol/sip/CallPeerMediaHandler.java
@@ -15,8 +15,10 @@
import net.java.sip.communicator.impl.protocol.sip.sdp.*;
import net.java.sip.communicator.service.neomedia.*;
-//disambiguates VideoListener which is also available in protocol.event
+//the following two disambiguate VideoListener which is also available in
+//protocol.event
import net.java.sip.communicator.service.neomedia.event.SimpleAudioLevelListener;
+import net.java.sip.communicator.service.neomedia.event.CsrcAudioLevelListener;
import net.java.sip.communicator.service.neomedia.device.*;
import net.java.sip.communicator.service.neomedia.format.*;
@@ -213,6 +215,18 @@ public void videoRemoved(net.java.sip.communicator.service.neomedia
*/
private Object streamAudioLevelListenerLock = new Object();
+ /**
+ * The listener that our CallPeer registers for CSRC audio level
+ * events.
+ */
+ private CsrcAudioLevelListener csrcAudioLevelListener = null;
+
+ /**
+ * The object that we are using to sync operations on
+ * csrcAudioLevelListener.
+ */
+ private Object csrcAudioLevelListenerLock = new Object();
+
/**
* Holds the zrtp controls used for the current call.
*/
@@ -768,25 +782,7 @@ private MediaStream configureAndStartStream(
{
this.audioStream = (AudioMediaStream)stream;
- // if we already have a local level listener - register it now.
- synchronized (localAudioLevelListenerLock)
- {
- if (localAudioLevelListener != null)
- {
- audioStream.setLocalUserAudioLevelListener(
- localAudioLevelListener);
- }
- }
-
- // if we already have a stream level listener - register it now.
- synchronized (streamAudioLevelListenerLock)
- {
- if (streamAudioLevelListener != null)
- {
- audioStream.setStreamAudioLevelListener(
- streamAudioLevelListener);
- }
- }
+ registerAudioLevelListeners(audioStream);
}
else
setVideoStream((VideoMediaStream)stream);
@@ -807,6 +803,45 @@ private MediaStream configureAndStartStream(
return stream;
}
+ /**
+ * Registers all audio level listeners currently known to this media handler
+ * with the specified audioStream.
+ *
+ * @param audioStream the AudioMediaStream that we'd like to
+ * register our audio level listeners with.
+ */
+ private void registerAudioLevelListeners(AudioMediaStream audioStream)
+ {
+ // if we already have a local level listener - register it now.
+ synchronized (localAudioLevelListenerLock)
+ {
+ if (localAudioLevelListener != null)
+ {
+ audioStream.setLocalUserAudioLevelListener(
+ localAudioLevelListener);
+ }
+ }
+
+ // if we already have a stream level listener - register it now.
+ synchronized (streamAudioLevelListenerLock)
+ {
+ if (streamAudioLevelListener != null)
+ {
+ audioStream.setStreamAudioLevelListener(
+ streamAudioLevelListener);
+ }
+ }
+
+ // if we already have a csrc level listener - register it now.
+ synchronized (csrcAudioLevelListenerLock)
+ {
+ if (csrcAudioLevelListener != null)
+ {
+ audioStream.setCsrcAudioLevelListener(csrcAudioLevelListener);
+ }
+ }
+ }
+
/**
* Registers all dynamic payload mappings known to this
* MediaHandler with the specified MediaStream.
@@ -1706,30 +1741,25 @@ public void setStreamAudioLevelListener(SimpleAudioLevelListener listener)
}
/**
- * Adds a specific ConferenceMembersSoundLevelListener to the list
- * of listeners interested in and notified about changes in conference
- * members sound level.
+ * Sets csrcAudioLevelListener as the listener that will be
+ * receiving notifications for changes in the audio levels of the remote
+ * participants that our peer is mixing.
*
- * @param listener the ConferenceMembersSoundLevelListener to add
+ * @param csrcAudioLevelListener the CsrcAudioLevelListener to set
+ * to our audio streams.
*/
- public void addConferenceMembersSoundLevelListener(
- SoundLevelListener listener)
- {
-
- }
-
- /**
- * Removes a specific ConferenceMembersSoundLevelListener of the
- * list of listeners interested in and notified about changes in conference
- * members sound level.
- *
- * @param listener the ConferenceMembersSoundLevelListener to
- * remove
- */
- public void removeConferenceMembersSoundLevelListener(
- SoundLevelListener listener)
+ public void setCsrcAudioLevelListener(
+ CsrcAudioLevelListener csrcAudioLevelListener)
{
+ synchronized(csrcAudioLevelListenerLock)
+ {
+ this.csrcAudioLevelListener = csrcAudioLevelListener;
+ if(audioStream != null)
+ {
+ audioStream.setCsrcAudioLevelListener(csrcAudioLevelListener);
+ }
+ }
}
/**
@@ -1771,8 +1801,12 @@ boolean isSecure()
}
/**
+ * Passes multiStreamData to the video stream that we are using
+ * in this media handler (if any) so that the underlying ZRTP lib could
+ * properly handle stream security.
*
- * @param multiStreamData
+ * @param multiStreamData the data that we are supposed to pass to our
+ * video stream.
*/
void startZrtpMultistream(byte[] multiStreamData)
{
diff --git a/src/net/java/sip/communicator/impl/protocol/sip/CallPeerSipImpl.java b/src/net/java/sip/communicator/impl/protocol/sip/CallPeerSipImpl.java
index 64bc1b7fe..9ffdb495a 100644
--- a/src/net/java/sip/communicator/impl/protocol/sip/CallPeerSipImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/sip/CallPeerSipImpl.java
@@ -1802,6 +1802,8 @@ public void removeConferenceMembersSoundLevelListener(
*/
public void audioLevelsReceived(long[][] audioLevels)
{
+ if ( getConferenceMemberCount() == 0 )
+ return;
//ConferenceMembersSoundLevelEvent evt
// = new ConferenceMembersSoundLevelEvent(this, levels);
diff --git a/src/net/java/sip/communicator/impl/protocol/sip/ConferenceMemberSipImpl.java b/src/net/java/sip/communicator/impl/protocol/sip/ConferenceMemberSipImpl.java
index 66e15c046..d59cbed1f 100644
--- a/src/net/java/sip/communicator/impl/protocol/sip/ConferenceMemberSipImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/sip/ConferenceMemberSipImpl.java
@@ -65,7 +65,7 @@ public class ConferenceMemberSipImpl
/**
* The SSRC value if transmitted by the focus of the conference.
*/
- private String ssrc;
+ private long ssrc = -1;
/**
* Initializes a new ConferenceMemberSipImpl instance with a
@@ -141,19 +141,21 @@ else if (PENDING.equalsIgnoreCase(endpointStatus))
}
/**
- * Return the SSRC value;
+ * Returns the SSRC value associated with this participant;
+ *
* @return the ssrc
*/
- public String getSSRC()
+ public long getSSRC()
{
return ssrc;
}
/**
- * Changes SSRC value;
- * @param ssrc the ssrc to set
+ * Sets the SSRC identifier of this member.
+ *
+ * @param ssrc the SSRC ID to set for this member.
*/
- public void setSSRC(String ssrc)
+ public void setSSRC(long ssrc)
{
this.ssrc = ssrc;
}
diff --git a/src/net/java/sip/communicator/impl/protocol/sip/OperationSetTelephonyConferencingSipImpl.java b/src/net/java/sip/communicator/impl/protocol/sip/OperationSetTelephonyConferencingSipImpl.java
index c4b202ea9..36e04bafc 100644
--- a/src/net/java/sip/communicator/impl/protocol/sip/OperationSetTelephonyConferencingSipImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/sip/OperationSetTelephonyConferencingSipImpl.java
@@ -1067,15 +1067,16 @@ private void setConferenceInfoDocument(
else if (ELEMENT_ENDPOINT.equals(userChildName))
{
endpointStatus = getEndpointStatus(userChild);
- ssrc
- = getEndpointMediaSrcId(
+ ssrc = getEndpointMediaSrcId(
userChild,
MediaType.AUDIO);
}
}
existingConferenceMember.setDisplayName(displayName);
existingConferenceMember.setEndpointStatus(endpointStatus);
- existingConferenceMember.setSSRC(ssrc);
+
+ if (ssrc != null)
+ existingConferenceMember.setSSRC(Long.parseLong(ssrc));
if (addConferenceMember)
callPeer.addConferenceMember(existingConferenceMember);
diff --git a/src/net/java/sip/communicator/service/neomedia/event/CsrcAudioLevelListener.java b/src/net/java/sip/communicator/service/neomedia/event/CsrcAudioLevelListener.java
index 8f46b213d..084ed2632 100644
--- a/src/net/java/sip/communicator/service/neomedia/event/CsrcAudioLevelListener.java
+++ b/src/net/java/sip/communicator/service/neomedia/event/CsrcAudioLevelListener.java
@@ -17,7 +17,6 @@
*/
public interface CsrcAudioLevelListener
{
-
/**
* Called by the media service implementation after it has received audio
* levels for the various participants (Contributing SouRCes) that are