diff --git a/src/org/jitsi/impl/neomedia/AudioMediaStreamImpl.java b/src/org/jitsi/impl/neomedia/AudioMediaStreamImpl.java index 3d213881b1e151fc1d35023bad8e4ab9d3d51fab..b5bfc20c9d2ed27adbba1ca0de6d77eba4a02591 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 3f89f3ff5633c9a07521a1f017404703ec1647a7..f0a094c9dd6c0e6f3bab134869e39176d582c234 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 a4d8fce89a82e58685aa30ce250374a4aa273304..fd64835cde3f5d4870cbc622f70186e048fda7d0 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) {