diff --git a/content/renderer/media/webrtc_audio_capturer.cc b/content/renderer/media/webrtc_audio_capturer.cc index 92951e25ea9b..14faf1e351b8 100644 --- a/content/renderer/media/webrtc_audio_capturer.cc +++ b/content/renderer/media/webrtc_audio_capturer.cc @@ -201,12 +201,21 @@ WebRtcAudioCapturer::~WebRtcAudioCapturer() { void WebRtcAudioCapturer::AddSink( WebRtcAudioCapturerSink* track) { DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK(track); DVLOG(1) << "WebRtcAudioCapturer::AddSink()"; base::AutoLock auto_lock(lock_); // Verify that |track| is not already added to the list. DCHECK(std::find_if( tracks_.begin(), tracks_.end(), WebRtcAudioCapturerSinkOwner::WrapsSink(track)) == tracks_.end()); + + if (buffer_.get()) { + track->SetCaptureFormat(buffer_->params()); + } else { + DLOG(WARNING) << "The format of the capturer has not been correctly " + << "initialized"; + } + // Create (and add to the list) a new WebRtcAudioCapturerSinkOwner which owns // the |track| and delagates all calls to the WebRtcAudioCapturerSink // interface. @@ -379,7 +388,9 @@ void WebRtcAudioCapturer::OnCaptureError() { media::AudioParameters WebRtcAudioCapturer::audio_parameters() const { base::AutoLock auto_lock(lock_); - return buffer_->params(); + // |buffer_| can be NULL when SetCapturerSource() or Initialize() has not + // been called. + return buffer_.get() ? buffer_->params() : media::AudioParameters(); } } // namespace content diff --git a/content/renderer/media/webrtc_local_audio_track.cc b/content/renderer/media/webrtc_local_audio_track.cc index b277cad99428..398d8bd1544c 100644 --- a/content/renderer/media/webrtc_local_audio_track.cc +++ b/content/renderer/media/webrtc_local_audio_track.cc @@ -30,7 +30,6 @@ WebRtcLocalAudioTrack::WebRtcLocalAudioTrack( track_source_(track_source) { DCHECK(capturer); capturer_->AddSink(this); - params_ = capturer_->audio_parameters(); DVLOG(1) << "WebRtcLocalAudioTrack::WebRtcLocalAudioTrack()"; } @@ -72,6 +71,11 @@ void WebRtcLocalAudioTrack::SetCaptureFormat( const media::AudioParameters& params) { base::AutoLock auto_lock(lock_); params_ = params; + + // Update all the existing sinks with the new format. + for (SinkList::const_iterator it = sinks_.begin(); + it != sinks_.end(); ++it) + (*it)->SetCaptureFormat(params); } // webrtc::AudioTrackInterface implementation.