Chromium Code Reviews| Index: webrtc/media/engine/webrtcvoiceengine.cc |
| diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc |
| index 1f197a33e8d4b7261bf52531e686b4e5598e93d9..f758034fe8caf9afa30ff4709f4b44a2f239ca61 100644 |
| --- a/webrtc/media/engine/webrtcvoiceengine.cc |
| +++ b/webrtc/media/engine/webrtcvoiceengine.cc |
| @@ -218,10 +218,7 @@ WebRtcVoiceEngine::WebRtcVoiceEngine( |
| encoder_factory, |
| decoder_factory, |
| audio_mixer, |
| - new VoEWrapper()) { |
| - audio_state_ = |
| - webrtc::AudioState::Create(MakeAudioStateConfig(voe(), audio_mixer)); |
| -} |
| + nullptr) {} |
| WebRtcVoiceEngine::WebRtcVoiceEngine( |
| webrtc::AudioDeviceModule* adm, |
| @@ -229,17 +226,42 @@ WebRtcVoiceEngine::WebRtcVoiceEngine( |
| const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory, |
| rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer, |
| VoEWrapper* voe_wrapper) |
| - : low_priority_worker_queue_("rtc-low-prio", rtc::TaskQueue::Priority::LOW), |
| - adm_(adm), |
| + : adm_(adm), |
| encoder_factory_(encoder_factory), |
| decoder_factory_(decoder_factory), |
| + audio_mixer_(audio_mixer), |
| voe_wrapper_(voe_wrapper) { |
| - RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| + // This may be called from any thread, so detach thread checkers. |
| + worker_thread_checker_.DetachFromThread(); |
| + signal_thread_checker_.DetachFromThread(); |
| LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine"; |
| - RTC_DCHECK(voe_wrapper); |
| RTC_DCHECK(decoder_factory); |
|
the sun
2017/06/15 07:38:19
Might as well add the missing DCHECK for encoder_f
Taylor Brandstetter
2017/06/15 15:05:58
Done.
|
| + // The rest of our initialization will happen in Init. |
| +} |
| - signal_thread_checker_.DetachFromThread(); |
| +WebRtcVoiceEngine::~WebRtcVoiceEngine() { |
| + RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| + LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; |
| + if (initialized_) { |
| + StopAecDump(); |
| + voe_wrapper_->base()->Terminate(); |
| + webrtc::Trace::SetTraceCallback(nullptr); |
| + } |
| +} |
| + |
| +void WebRtcVoiceEngine::Init() { |
| + RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| + LOG(LS_INFO) << "WebRtcVoiceEngine::Init"; |
| + |
| + // TaskQueue expects to be created/destroyed on the same thread. |
| + low_priority_worker_queue_.reset( |
| + new rtc::TaskQueue("rtc-low-prio", rtc::TaskQueue::Priority::LOW)); |
| + |
| + // VoEWrapper needs to be created on the worker thread. It's expected to be |
| + // null here unless it's being injected for testing. |
| + if (!voe_wrapper_) { |
| + voe_wrapper_.reset(new VoEWrapper()); |
| + } |
| // Load our audio codec lists. |
| LOG(LS_INFO) << "Supported send codecs in order of preference:"; |
| @@ -309,14 +331,14 @@ WebRtcVoiceEngine::WebRtcVoiceEngine( |
| apm()->Initialize(); |
| webrtc::adm_helpers::SetPlayoutDevice(adm_); |
| #endif // !WEBRTC_IOS |
| -} |
| -WebRtcVoiceEngine::~WebRtcVoiceEngine() { |
| - RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| - LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; |
| - StopAecDump(); |
| - voe_wrapper_->base()->Terminate(); |
| - webrtc::Trace::SetTraceCallback(nullptr); |
| + // May be null for VoE injected for testing. |
| + if (voe()->engine()) { |
|
Taylor Brandstetter
2017/06/13 21:35:51
Note that this wasn't necessary before because the
|
| + audio_state_ = |
| + webrtc::AudioState::Create(MakeAudioStateConfig(voe(), audio_mixer_)); |
| + } |
| + |
| + initialized_ = true; |
| } |
| rtc::scoped_refptr<webrtc::AudioState> |
| @@ -689,8 +711,8 @@ void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) { |
| bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file, |
| int64_t max_size_bytes) { |
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| - auto aec_dump = webrtc::AecDumpFactory::Create(file, max_size_bytes, |
| - &low_priority_worker_queue_); |
| + auto aec_dump = webrtc::AecDumpFactory::Create( |
| + file, max_size_bytes, low_priority_worker_queue_.get()); |
| if (!aec_dump) { |
| return false; |
| } |
| @@ -701,8 +723,8 @@ bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file, |
| void WebRtcVoiceEngine::StartAecDump(const std::string& filename) { |
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| - auto aec_dump = |
| - webrtc::AecDumpFactory::Create(filename, -1, &low_priority_worker_queue_); |
| + auto aec_dump = webrtc::AecDumpFactory::Create( |
| + filename, -1, low_priority_worker_queue_.get()); |
| if (aec_dump) { |
| apm()->AttachAecDump(std::move(aec_dump)); |
| } |