Index: content/renderer/media/webrtc_audio_device_impl.cc |
diff --git a/content/renderer/media/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc_audio_device_impl.cc |
index b5dc5008ad7ff831a8de3c05ff9d9795c005d950..3cdc20a26decb5afd82526bb217a43855d512006 100644 |
--- a/content/renderer/media/webrtc_audio_device_impl.cc |
+++ b/content/renderer/media/webrtc_audio_device_impl.cc |
@@ -170,15 +170,9 @@ int32_t WebRtcAudioDeviceImpl::Terminate() { |
DCHECK(!renderer_.get() || !renderer_->IsStarted()) |
<< "The shared audio renderer shouldn't be running"; |
- // Stop all the capturers to ensure no further OnData() and |
- // RemoveAudioCapturer() callback. |
- // Cache the capturers in a local list since WebRtcAudioCapturer::Stop() |
- // will trigger RemoveAudioCapturer() callback. |
- CapturerList capturers; |
- capturers.swap(capturers_); |
- for (CapturerList::const_iterator iter = capturers.begin(); |
- iter != capturers.end(); ++iter) { |
- (*iter)->Stop(); |
+ { |
+ base::AutoLock auto_lock(lock_); |
+ capturers_.clear(); |
} |
initialized_ = false; |
@@ -294,11 +288,10 @@ int32_t WebRtcAudioDeviceImpl::SetMicrophoneVolume(uint32_t volume) { |
// Only one microphone is supported at the moment, which is represented by |
// the default capturer. |
- scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); |
- if (!capturer.get()) |
+ base::AutoLock auto_lock(lock_); |
+ if (capturers_.empty()) |
return -1; |
- |
- capturer->SetVolume(volume); |
+ capturers_.back()->SetVolume(volume); |
tommi (sloooow) - chröme
2016/03/03 11:07:31
I'm not quite following what's going to happen if
miu
2016/03/05 02:55:31
Great question! Both o1ka and I both have no idea
|
return 0; |
} |
@@ -309,12 +302,10 @@ int32_t WebRtcAudioDeviceImpl::MicrophoneVolume(uint32_t* volume) const { |
// We only support one microphone now, which is accessed via the default |
// capturer. |
DCHECK(initialized_); |
- scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); |
- if (!capturer.get()) |
+ base::AutoLock auto_lock(lock_); |
+ if (capturers_.empty()) |
return -1; |
- |
- *volume = static_cast<uint32_t>(capturer->Volume()); |
- |
+ *volume = static_cast<uint32_t>(capturers_.back()->Volume()); |
return 0; |
} |
@@ -352,11 +343,10 @@ int32_t WebRtcAudioDeviceImpl::StereoRecordingIsAvailable( |
// TODO(xians): These kind of hardware methods do not make much sense since we |
// support multiple sources. Remove or figure out new APIs for such methods. |
- scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); |
- if (!capturer.get()) |
+ base::AutoLock auto_lock(lock_); |
+ if (capturers_.empty()) |
return -1; |
- |
- *available = (capturer->source_audio_parameters().channels() == 2); |
+ *available = (capturers_.back()->GetInputFormat().channels() == 2); |
return 0; |
} |
@@ -380,12 +370,11 @@ int32_t WebRtcAudioDeviceImpl::RecordingSampleRate( |
uint32_t* sample_rate) const { |
DCHECK(signaling_thread_checker_.CalledOnValidThread()); |
// We use the default capturer as the recording sample rate. |
- scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); |
- if (!capturer.get()) |
+ base::AutoLock auto_lock(lock_); |
+ if (capturers_.empty()) |
return -1; |
- |
- *sample_rate = static_cast<uint32_t>( |
- capturer->source_audio_parameters().sample_rate()); |
+ const media::AudioParameters& params = capturers_.back()->GetInputFormat(); |
+ *sample_rate = static_cast<uint32_t>(params.sample_rate()); |
return 0; |
} |
@@ -433,12 +422,11 @@ bool WebRtcAudioDeviceImpl::SetAudioRenderer(WebRtcAudioRenderer* renderer) { |
return true; |
} |
-void WebRtcAudioDeviceImpl::AddAudioCapturer( |
- const scoped_refptr<WebRtcAudioCapturer>& capturer) { |
+void WebRtcAudioDeviceImpl::AddAudioCapturer(WebRtcAudioCapturer* capturer) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; |
- DCHECK(capturer.get()); |
- DCHECK(!capturer->device_id().empty()); |
+ DCHECK(capturer); |
+ DCHECK(!capturer->device_info().device.id.empty()); |
base::AutoLock auto_lock(lock_); |
DCHECK(std::find(capturers_.begin(), capturers_.end(), capturer) == |
@@ -446,29 +434,14 @@ void WebRtcAudioDeviceImpl::AddAudioCapturer( |
capturers_.push_back(capturer); |
} |
-void WebRtcAudioDeviceImpl::RemoveAudioCapturer( |
- const scoped_refptr<WebRtcAudioCapturer>& capturer) { |
+void WebRtcAudioDeviceImpl::RemoveAudioCapturer(WebRtcAudioCapturer* capturer) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
- DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; |
- DCHECK(capturer.get()); |
+ DVLOG(1) << "WebRtcAudioDeviceImpl::RemoveAudioCapturer()"; |
+ DCHECK(capturer); |
base::AutoLock auto_lock(lock_); |
capturers_.remove(capturer); |
} |
-scoped_refptr<WebRtcAudioCapturer> |
-WebRtcAudioDeviceImpl::GetDefaultCapturer() const { |
- // Called on the signaling thread (during initialization), worker |
- // thread during capture or main thread for a WebAudio source. |
- // We can't DCHECK on those three checks here since GetDefaultCapturer |
- // may be the first call and therefore could incorrectly initialize the |
- // thread checkers. |
- DCHECK(initialized_); |
- base::AutoLock auto_lock(lock_); |
- // Use the last |capturer| which is from the latest getUserMedia call as |
- // the default capture device. |
- return capturers_.empty() ? NULL : capturers_.back(); |
-} |
- |
void WebRtcAudioDeviceImpl::AddPlayoutSink( |
WebRtcPlayoutDataSource::Sink* sink) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
@@ -498,8 +471,19 @@ bool WebRtcAudioDeviceImpl::GetAuthorizedDeviceInfoForAudioRenderer( |
if (capturers_.size() != 1) |
return false; |
- return capturers_.back()->GetPairedOutputParameters( |
- session_id, output_sample_rate, output_frames_per_buffer); |
+ // Don't set output parameters unless all of them are valid. |
+ const StreamDeviceInfo& device_info = capturers_.back()->device_info(); |
+ if (device_info.session_id <= 0 || |
+ !device_info.device.matched_output.sample_rate || |
+ !device_info.device.matched_output.frames_per_buffer) |
tommi (sloooow) - chröme
2016/03/03 11:07:31
{}
miu
2016/03/05 02:55:31
Done.
|
+ return false; |
+ |
+ *session_id = device_info.session_id; |
+ *output_sample_rate = device_info.device.matched_output.sample_rate; |
+ *output_frames_per_buffer = |
+ device_info.device.matched_output.frames_per_buffer; |
+ |
+ return true; |
} |
} // namespace content |