From bb578b64da0c1d050359ecf96d69931e8a347b12 Mon Sep 17 00:00:00 2001 From: Vincent Lucas <chenzo@jitsi.org> Date: Tue, 18 Dec 2012 13:06:36 +0000 Subject: [PATCH] Enables audio system changes during on-going calls. --- .../impl/neomedia/AudioMediaStreamImpl.java | 42 ++++++++++++++++++- .../jitsi/impl/neomedia/MediaServiceImpl.java | 3 +- .../jitsi/impl/neomedia/MediaStreamImpl.java | 4 +- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/AudioMediaStreamImpl.java b/src/org/jitsi/impl/neomedia/AudioMediaStreamImpl.java index 3d213881..b5bfc20c 100644 --- a/src/org/jitsi/impl/neomedia/AudioMediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/AudioMediaStreamImpl.java @@ -6,6 +6,7 @@ */ package org.jitsi.impl.neomedia; +import java.beans.*; import java.util.*; import javax.media.*; @@ -22,6 +23,7 @@ import org.jitsi.service.neomedia.event.*; import org.jitsi.service.protocol.*; import org.jitsi.util.*; +import org.jitsi.util.event.*; /** * Extends <tt>MediaStreamImpl</tt> in order to provide an implementation of @@ -32,7 +34,8 @@ */ public class AudioMediaStreamImpl extends MediaStreamImpl - implements AudioMediaStream + implements AudioMediaStream, + PropertyChangeListener { /** @@ -85,6 +88,14 @@ public class AudioMediaStreamImpl */ private CsrcAudioLevelListener csrcAudioLevelListener = null; + /** + * A property change notifier which will inform this stream if a selected + * audio device (capture, playback or notification device) has changed. We + * want to listen to these events, especially for those generated after the + * audio system has changed. + */ + private PropertyChangeNotifier audioSystemChangeNotifier; + /** * Initializes a new <tt>AudioMediaStreamImpl</tt> instance which will use * the specified <tt>MediaDevice</tt> for both capture and playback of audio @@ -97,12 +108,20 @@ public class AudioMediaStreamImpl * <tt>StreamConnector</tt> * @param srtpControl a control which is already created, used to control * the srtp operations. + * @param audioSystemChangeNotifier A property change notifier which will + * inform this stream if a selected audio device (capture, playback or + * notification device) has changed. We want to listen to these events, + * especially for those generated after the audio system has changed. */ public AudioMediaStreamImpl(StreamConnector connector, MediaDevice device, - SrtpControl srtpControl) + SrtpControl srtpControl, + PropertyChangeNotifier audioSystemChangeNotifier + ) { super(connector, device, srtpControl); + this.audioSystemChangeNotifier = audioSystemChangeNotifier; + this.audioSystemChangeNotifier.addPropertyChangeListener(this); } /** @@ -488,6 +507,8 @@ public void close() { dtmfTransfrmEngine = null; } + + this.audioSystemChangeNotifier.removePropertyChangeListener(this); } /** @@ -500,4 +521,21 @@ protected int getPriority() { return 3; } + + /** + * Receives and reacts to property change events: if the selected device + * (for capture, playback or notifications) has changed, then create or + * recreate the streams in order to use it. + * We want to listen to these events, especially for those generated after + * the audio system has changed. + * + * @param evt The event which may contain a audio system change event. + */ + public void propertyChange(PropertyChangeEvent evt) + { + if (sendStreamsAreCreated) + recreateSendStreams(); + else + start(); + } } diff --git a/src/org/jitsi/impl/neomedia/MediaServiceImpl.java b/src/org/jitsi/impl/neomedia/MediaServiceImpl.java index 3f89f3ff..f0a094c9 100644 --- a/src/org/jitsi/impl/neomedia/MediaServiceImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaServiceImpl.java @@ -359,7 +359,8 @@ else if ((device != null) && !mediaType.equals(device.getMediaType())) switch (mediaType) { case AUDIO: - return new AudioMediaStreamImpl(connector, device, srtpControl); + return + new AudioMediaStreamImpl(connector, device, srtpControl, this); case VIDEO: return new VideoMediaStreamImpl(connector, device, srtpControl); default: diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java index a4d8fce8..fd64835c 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java @@ -140,7 +140,7 @@ else if (MediaDeviceSession.SSRC_LIST.equals(propertyName)) * respectively the <tt>MediaDeviceSession</tt>, of this instance is * changed. */ - private boolean sendStreamsAreCreated = false; + protected boolean sendStreamsAreCreated = false; /** * The indicator which determines whether {@link #start()} has been called @@ -1368,7 +1368,7 @@ public boolean isStarted() * If they were not started prior to the call, does not start them after * recreating them. */ - private void recreateSendStreams() + protected void recreateSendStreams() { if (sendStreamsAreCreated) { -- GitLab