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