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)); |
} |