diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java index f2d924998cd687b8717368b62c1fc32ec6efc39c..ced31e1f2d229c5128c103e1aa4c56be7e70b123 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java @@ -2400,6 +2400,43 @@ else if (event instanceof TimeoutEvent) } } } + else if (event instanceof RemotePayloadChangeEvent) + { + ReceiveStream receiveStream = event.getReceiveStream(); + + if(receiveStream != null) + { + MediaDeviceSession deviceSession = getDeviceSession(); + + if (deviceSession != null) + { + TranscodingDataSource transcodingDataSource + = deviceSession.getTranscodingDataSource(receiveStream); + + // we receive packets, streams are active + // if processor in transcoding DataSource is running + // we need to recreate it by disconnect, connect + // and starting again the DataSource + try + { + transcodingDataSource.disconnect(); + transcodingDataSource.connect(); + transcodingDataSource.start(); + + // as output streams of the DataSource + // are recreated we need to update + // mixers and everything that are using them + deviceSession.playbackDataSourceChanged( + receiveStream.getDataSource()); + } + catch(IOException e) + { + logger.error("Error re-creating processor in " + + "transcoding DataSource", e); + } + } + } + } } /** diff --git a/src/org/jitsi/impl/neomedia/conference/AudioMixingPushBufferDataSource.java b/src/org/jitsi/impl/neomedia/conference/AudioMixingPushBufferDataSource.java index 23e030f56c982159141dad6bab73a446ab65a5e9..a3bd62f73b5bf0f87ab4be5aee94af449e90e93d 100644 --- a/src/org/jitsi/impl/neomedia/conference/AudioMixingPushBufferDataSource.java +++ b/src/org/jitsi/impl/neomedia/conference/AudioMixingPushBufferDataSource.java @@ -107,6 +107,16 @@ public void addInputDataSource(DataSource inputDataSource) audioMixer.addInputDataSource(inputDataSource, this); } + /** + * The input <tt>DataSource</tt> has been updated. + * @param inputDataSource the <tt>DataSource</tt> that was updated. + */ + public void updateInputDataSource(DataSource inputDataSource) + { + // just update the input streams + audioMixer.getOutputStream(); + } + /** * Implements {@link DataSource#connect()}. Lets the <tt>AudioMixer</tt> * know that one of its output <tt>PushBufferDataSources</tt> has been diff --git a/src/org/jitsi/impl/neomedia/device/AudioMixerMediaDevice.java b/src/org/jitsi/impl/neomedia/device/AudioMixerMediaDevice.java index 06d6cd3fd5ce08bcefad2e3ae2969a8f745901f8..820c96b1a9f199ae4853083aa32d879d66c52465 100644 --- a/src/org/jitsi/impl/neomedia/device/AudioMixerMediaDevice.java +++ b/src/org/jitsi/impl/neomedia/device/AudioMixerMediaDevice.java @@ -1017,6 +1017,36 @@ protected void playbackDataSourceRemoved(DataSource playbackDataSource) playbackDataSource); } + /** + * Notifies this <tt>MediaDeviceSession</tt> that a <tt>DataSource</tt> + * has been updated. + * + * @param playbackDataSource the <tt>DataSource</tt> which has been + * updated. + * @see MediaDeviceSession#playbackDataSourceUpdated(DataSource) + */ + @Override + protected void playbackDataSourceUpdated(DataSource playbackDataSource) + { + super.playbackDataSourceUpdated(playbackDataSource); + + DataSource captureDevice = getCaptureDevice(); + + /* + * Unwrap wrappers of the captureDevice until + * AudioMixingPushBufferDataSource is found. + */ + if (captureDevice instanceof PushBufferDataSourceDelegate<?>) + captureDevice + = ((PushBufferDataSourceDelegate<?>) captureDevice) + .getDataSource(); + if (captureDevice instanceof AudioMixingPushBufferDataSource) + { + ((AudioMixingPushBufferDataSource) captureDevice) + .updateInputDataSource(playbackDataSource); + } + } + /** * The method relays <tt>PropertyChangeEvent</tt>s indicating a change * in the SSRC_LIST in the encapsulated mixer device so that the diff --git a/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java b/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java index 0a684afa8dc17d77ee4d48c96d8d51ae78cf9df3..c9dccff8dd9e0c1c3d03bc75cf4062efdb98b65b 100644 --- a/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java +++ b/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java @@ -1172,6 +1172,29 @@ protected void playbackDataSourceRemoved(DataSource playbackDataSource) { } + /** + * Notifies this <tt>MediaDeviceSession</tt> that a <tt>DataSource</tt> has + * been changed on the represented <tt>MediaDevice</tt>. + * + * @param playbackDataSource the <tt>DataSource</tt> which has been added + * for playback on the represented <tt>MediaDevice</tt> + */ + protected void playbackDataSourceUpdated(DataSource playbackDataSource) + { + } + + /** + * Notifies this <tt>MediaDeviceSession</tt> that a <tt>DataSource</tt> has + * been changed on the represented <tt>MediaDevice</tt>. + * + * @param playbackDataSource the <tt>DataSource</tt> which has been added + * for playback on the represented <tt>MediaDevice</tt> + */ + public void playbackDataSourceChanged(DataSource playbackDataSource) + { + playbackDataSourceUpdated(playbackDataSource); + } + /** * Notifies this instance that a specific <tt>Player</tt> of remote content * has generated a <tt>ConfigureCompleteEvent</tt>. Allows extenders to