src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java
/**
     * Removes a specific <tt>SoundLevelListener</tt> from the list of listeners
     * interested in and notified about changes in local sound level related
     * information. If <tt>l</tt> is the last listener that we had here we are
     * also going to unregister our own level event delegate in order to stop
     * level calculations.
     *
     * @param l the <tt>SoundLevelListener</tt> to remove
     */
Removes a specific SoundLevelListener from the list of listeners
interested in and notified about changes in local sound level related
information. If l is the last listener that we had here we are
also going to unregister our own level event delegate in order to stop
level calculations.

@param l the SoundLevelListener to remove
Removes a specific SoundLevelListener from the list of listeners interested in and notified about changes in local sound level related information . If l is the last listener that we had here we are also going to unregister our own level event delegate in order to stop level calculations . @param l the SoundLevelListener to remove
@Override
    public void removeLocalUserSoundLevelListener(SoundLevelListener l)
    {
        synchronized (localUserAudioLevelListenersSyncRoot)
        {
            /*
             * Implement localUserAudioLevelListeners as a copy-on-write storage
             * so that iterators over it can iterate over it without
             * ConcurrentModificationExceptions.
             */
            if (localUserAudioLevelListeners != null)
            {
                localUserAudioLevelListeners
                    = new ArrayList<SoundLevelListener>(
                            localUserAudioLevelListeners);
                if (localUserAudioLevelListeners.remove(l)
                        && localUserAudioLevelListeners.isEmpty())
                    localUserAudioLevelListeners = null;
            }
            if ((localUserAudioLevelListeners == null)
                    || localUserAudioLevelListeners.isEmpty())
            {
                Iterator<T> callPeerIter = getCallPeers();
                while (callPeerIter.hasNext())
                {
                    callPeerIter
                        .next()
                            .getMediaHandler()
                                .setLocalUserAudioLevelListener(null);
                }
            }
        }
    }
@ Override public void removeLocalUserSoundLevelListener ( SoundLevelListener l ) { synchronized ( localUserAudioLevelListenersSyncRoot ) { /*
             * Implement localUserAudioLevelListeners as a copy-on-write storage
             * so that iterators over it can iterate over it without
             * ConcurrentModificationExceptions.
             */ if ( localUserAudioLevelListeners != null ) { localUserAudioLevelListeners = new ArrayList < SoundLevelListener > ( localUserAudioLevelListeners ) ; if ( localUserAudioLevelListeners . remove ( l ) && localUserAudioLevelListeners . isEmpty ( ) ) localUserAudioLevelListeners = null ; } if ( ( localUserAudioLevelListeners == null ) || localUserAudioLevelListeners . isEmpty ( ) ) { Iterator < T > callPeerIter = getCallPeers ( ) ; while ( callPeerIter . hasNext ( ) ) { callPeerIter . next ( ) . getMediaHandler ( ) . setLocalUserAudioLevelListener ( null ) ; } } } }
Removes a specific <tt>SoundLevelListener</tt> from the list of listeners
 interested in and notified about changes in local sound level related
 information.
Removes a specific <tt > SoundLevelListener< / tt > from the list of listeners interested in and notified about changes in local sound level related information .
//if this was the last listener that was registered with us then //no long need to have a delegator registered with the call //peer media handlers. We therefore remove it so that audio //level calculations would be ceased.