* The default implementation returns false. *
* * @return true if an audio stream is being sent to this peer and * it is currently mute; false, otherwise */ public boolean isMute() { return isMute; } /** * Sets the mute property for this call peer. * * @param newMuteValue the new value of the mute property for this call peer */ public void setMute(boolean newMuteValue) { this.isMute = newMuteValue; firePropertyChange(MUTE_PROPERTY_NAME, isMute, newMuteValue); } /** * Determines whether this call peer is currently a conference focus. * * @return true if this peer is a conference focus and * false otherwise. */ public boolean isConferenceFocus() { return conferenceFocus; } /** * Specifies whether this peer is a conference focus. * * @param conferenceFocus true if this peer is to become a * conference focus and false otherwise. */ public void setConferenceFocus(boolean conferenceFocus) { if (this.conferenceFocus != conferenceFocus) { this.conferenceFocus = conferenceFocus; fireCallPeerConferenceEvent( new CallPeerConferenceEvent( this, CallPeerConferenceEvent.CONFERENCE_FOCUS_CHANGED)); } } /** * Implements CallPeer#getConferenceMembers(). In order to reduce * allocations, returns #NO_CONFERENCE_MEMBERS if #conferenceMembers * contains no ConferenceMember instances. * * @return an array of the conference members */ public ConferenceMember[] getConferenceMembers() { ConferenceMember[] conferenceMembers; synchronized (this.conferenceMembers) { int conferenceMemberCount = getConferenceMemberCount(); if (conferenceMemberCount <= 0) conferenceMembers = NO_CONFERENCE_MEMBERS; else conferenceMembers = this.conferenceMembers .toArray( new ConferenceMember[conferenceMemberCount]); } return conferenceMembers; } /** * Returns the count of the members contained in this peer. ** Implements CallPeer#getConferenceMemberCount(). * * @return the count of the members contained in this peer */ public int getConferenceMemberCount() { return isConferenceFocus() ? conferenceMembers.size() : 0; } /** * Adds a specific ConferenceMember to the list of * ConferenceMembers reported by this peer through * {@link #getConferenceMembers()} and {@link #getConferenceMemberCount()} * and fires * CallPeerConferenceEvent#CONFERENCE_MEMBER_ADDED to * the currently registered CallPeerConferenceListeners. * * @param conferenceMember a ConferenceMember to be added to the * list of ConferenceMember reported by this peer. If the specified * ConferenceMember is already contained in the list, it is not * added again and no event is fired. */ public void addConferenceMember(ConferenceMember conferenceMember) { if (conferenceMember == null) throw new NullPointerException("conferenceMember"); synchronized (conferenceMembers) { if (conferenceMembers.contains(conferenceMember)) return; conferenceMembers.add(conferenceMember); } fireCallPeerConferenceEvent( new CallPeerConferenceEvent( this, CallPeerConferenceEvent.CONFERENCE_MEMBER_ADDED, conferenceMember)); } /** * Removes a specific ConferenceMember from the list of * ConferenceMembers reported by this peer through * {@link #getConferenceMembers()} and {@link #getConferenceMemberCount()} * if it is contained and fires * CallPeerConferenceEvent#CONFERENCE_MEMBER_REMOVED to * the currently registered CallPeerConferenceListeners. * * @param conferenceMember a ConferenceMember to be removed from * the list of ConferenceMember reported by this peer. If the * specified ConferenceMember is no contained in the list, no event * is fired. */ public void removeConferenceMember(ConferenceMember conferenceMember) { if (conferenceMember == null) throw new NullPointerException("conferenceMember"); synchronized (conferenceMembers) { if (!conferenceMembers.remove(conferenceMember)) return; } fireCallPeerConferenceEvent( new CallPeerConferenceEvent( this, CallPeerConferenceEvent.CONFERENCE_MEMBER_REMOVED, conferenceMember)); } /** * Implements * CallPeer#addCallPeerConferenceListener( * CallPeerConferenceListener). In the fashion of the addition of the * other listeners, does not throw an exception on attempting to add a * null listeners and just ignores the call. * * @param listener the CallPeerConferenceListener to add */ public void addCallPeerConferenceListener( CallPeerConferenceListener listener) { if (listener != null) synchronized (callPeerConferenceListeners) { if (!callPeerConferenceListeners.contains(listener)) callPeerConferenceListeners.add(listener); } } /** * Implements * CallPeer#removeCallPeerConferenceListener( * CallPeerConferenceListener). * * @param listener the CallPeerConferenceListener to remove */ public void removeCallPeerConferenceListener( CallPeerConferenceListener listener) { if (listener != null) synchronized (callPeerConferenceListeners) { callPeerConferenceListeners.remove(listener); } } /** * Fires a specific CallPeerConferenceEvent to the * CallPeerConferenceListeners interested in changes in the * conference-related information provided by this peer. * * @param conferenceEvent a CallPeerConferenceEvent to be fired and * carrying the event data */ protected void fireCallPeerConferenceEvent( CallPeerConferenceEvent conferenceEvent) { CallPeerConferenceListener[] listeners; synchronized (callPeerConferenceListeners) { listeners = callPeerConferenceListeners .toArray( new CallPeerConferenceListener[ callPeerConferenceListeners.size()]); } int eventID = conferenceEvent.getEventID(); if (logger.isDebugEnabled()) { String eventIDString; switch (eventID) { case CallPeerConferenceEvent.CONFERENCE_FOCUS_CHANGED: eventIDString = "CONFERENCE_FOCUS_CHANGED"; break; case CallPeerConferenceEvent.CONFERENCE_MEMBER_ADDED: eventIDString = "CONFERENCE_MEMBER_ADDED"; break; case CallPeerConferenceEvent.CONFERENCE_MEMBER_REMOVED: eventIDString = "CONFERENCE_MEMBER_REMOVED"; break; default: eventIDString = "UNKNOWN"; break; } logger .debug( "Firing CallPeerConferenceEvent with ID " + eventIDString + " to " + listeners.length + " listeners"); } for (CallPeerConferenceListener listener : listeners) switch (eventID) { case CallPeerConferenceEvent.CONFERENCE_FOCUS_CHANGED: listener.conferenceFocusChanged(conferenceEvent); break; case CallPeerConferenceEvent.CONFERENCE_MEMBER_ADDED: listener.conferenceMemberAdded(conferenceEvent); break; case CallPeerConferenceEvent.CONFERENCE_MEMBER_REMOVED: listener.conferenceMemberRemoved(conferenceEvent); break; } } /** * Returns the ConferenceMember with the specified ssrc * ID or null if there is no such ConferenceMember. The * method is meant for very frequent use and every call simply iterates * through the conference members collection without creating an iterator * or other object that may have an impact on garbage collection when used * frequently. * * @param ssrc the SSRC identifier of the RTP streams transmitted by the * ConferenceMember that we are looking for. * * @return the ConferenceMember with the specified ssrc * ID or null if there is no such member. */ protected ConferenceMember findConferenceMember(long ssrc) { synchronized (conferenceMembers) { int conferenceMemberCount = conferenceMembers.size(); for (int i = 0; i < conferenceMemberCount; i++) { ConferenceMember mmbr = conferenceMembers.get(i); if (mmbr.getSSRC() == ssrc) return mmbr; } return null; } } /** * Returns the currently used security settings of this CallPeer. * * @return the CallPeerSecurityStatusEvent that contains the * current security settings. */ public CallPeerSecurityStatusEvent getCurrentSecuritySettings() { return lastSecurityEvent; } /** * Returns a reference to the call that this peer belongs to. * * @return a reference to the call containing this peer. */ public abstract T getCall(); /** * Returns the protocol provider that this peer belongs to. * * @return a reference to the ProtocolProviderService that this peer * belongs to. */ public abstract U getProtocolProvider(); }