Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: webrtc/media/engine/webrtcvoiceengine.cc

Issue 2934103002: Allow WebRtcMediaEngine to be created from any thread. (Closed)
Patch Set: Adding DCHECK for encoder_factory Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 211
212 WebRtcVoiceEngine::WebRtcVoiceEngine( 212 WebRtcVoiceEngine::WebRtcVoiceEngine(
213 webrtc::AudioDeviceModule* adm, 213 webrtc::AudioDeviceModule* adm,
214 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory, 214 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
215 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory, 215 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
216 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer) 216 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer)
217 : WebRtcVoiceEngine(adm, 217 : WebRtcVoiceEngine(adm,
218 encoder_factory, 218 encoder_factory,
219 decoder_factory, 219 decoder_factory,
220 audio_mixer, 220 audio_mixer,
221 new VoEWrapper()) { 221 nullptr) {}
222 audio_state_ =
223 webrtc::AudioState::Create(MakeAudioStateConfig(voe(), audio_mixer));
224 }
225 222
226 WebRtcVoiceEngine::WebRtcVoiceEngine( 223 WebRtcVoiceEngine::WebRtcVoiceEngine(
227 webrtc::AudioDeviceModule* adm, 224 webrtc::AudioDeviceModule* adm,
228 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory, 225 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
229 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory, 226 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
230 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer, 227 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
231 VoEWrapper* voe_wrapper) 228 VoEWrapper* voe_wrapper)
232 : low_priority_worker_queue_("rtc-low-prio", rtc::TaskQueue::Priority::LOW), 229 : adm_(adm),
233 adm_(adm),
234 encoder_factory_(encoder_factory), 230 encoder_factory_(encoder_factory),
235 decoder_factory_(decoder_factory), 231 decoder_factory_(decoder_factory),
232 audio_mixer_(audio_mixer),
236 voe_wrapper_(voe_wrapper) { 233 voe_wrapper_(voe_wrapper) {
234 // This may be called from any thread, so detach thread checkers.
235 worker_thread_checker_.DetachFromThread();
236 signal_thread_checker_.DetachFromThread();
237 LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine";
238 RTC_DCHECK(decoder_factory);
239 RTC_DCHECK(encoder_factory);
240 // The rest of our initialization will happen in Init.
241 }
242
243 WebRtcVoiceEngine::~WebRtcVoiceEngine() {
237 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 244 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
238 LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine"; 245 LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine";
239 RTC_DCHECK(voe_wrapper); 246 if (initialized_) {
240 RTC_DCHECK(decoder_factory); 247 StopAecDump();
248 voe_wrapper_->base()->Terminate();
249 webrtc::Trace::SetTraceCallback(nullptr);
250 }
251 }
241 252
242 signal_thread_checker_.DetachFromThread(); 253 void WebRtcVoiceEngine::Init() {
254 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
255 LOG(LS_INFO) << "WebRtcVoiceEngine::Init";
256
257 // TaskQueue expects to be created/destroyed on the same thread.
258 low_priority_worker_queue_.reset(
259 new rtc::TaskQueue("rtc-low-prio", rtc::TaskQueue::Priority::LOW));
260
261 // VoEWrapper needs to be created on the worker thread. It's expected to be
262 // null here unless it's being injected for testing.
263 if (!voe_wrapper_) {
264 voe_wrapper_.reset(new VoEWrapper());
265 }
243 266
244 // Load our audio codec lists. 267 // Load our audio codec lists.
245 LOG(LS_INFO) << "Supported send codecs in order of preference:"; 268 LOG(LS_INFO) << "Supported send codecs in order of preference:";
246 send_codecs_ = CollectCodecs(encoder_factory_->GetSupportedEncoders()); 269 send_codecs_ = CollectCodecs(encoder_factory_->GetSupportedEncoders());
247 for (const AudioCodec& codec : send_codecs_) { 270 for (const AudioCodec& codec : send_codecs_) {
248 LOG(LS_INFO) << ToString(codec); 271 LOG(LS_INFO) << ToString(codec);
249 } 272 }
250 273
251 LOG(LS_INFO) << "Supported recv codecs in order of preference:"; 274 LOG(LS_INFO) << "Supported recv codecs in order of preference:";
252 recv_codecs_ = CollectCodecs(decoder_factory_->GetSupportedDecoders()); 275 recv_codecs_ = CollectCodecs(decoder_factory_->GetSupportedDecoders());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 bool error = ApplyOptions(options); 325 bool error = ApplyOptions(options);
303 RTC_DCHECK(error); 326 RTC_DCHECK(error);
304 } 327 }
305 328
306 // Set default audio devices. 329 // Set default audio devices.
307 #if !defined(WEBRTC_IOS) 330 #if !defined(WEBRTC_IOS)
308 webrtc::adm_helpers::SetRecordingDevice(adm_); 331 webrtc::adm_helpers::SetRecordingDevice(adm_);
309 apm()->Initialize(); 332 apm()->Initialize();
310 webrtc::adm_helpers::SetPlayoutDevice(adm_); 333 webrtc::adm_helpers::SetPlayoutDevice(adm_);
311 #endif // !WEBRTC_IOS 334 #endif // !WEBRTC_IOS
312 }
313 335
314 WebRtcVoiceEngine::~WebRtcVoiceEngine() { 336 // May be null for VoE injected for testing.
315 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 337 if (voe()->engine()) {
316 LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; 338 audio_state_ =
317 StopAecDump(); 339 webrtc::AudioState::Create(MakeAudioStateConfig(voe(), audio_mixer_));
318 voe_wrapper_->base()->Terminate(); 340 }
319 webrtc::Trace::SetTraceCallback(nullptr); 341
342 initialized_ = true;
320 } 343 }
321 344
322 rtc::scoped_refptr<webrtc::AudioState> 345 rtc::scoped_refptr<webrtc::AudioState>
323 WebRtcVoiceEngine::GetAudioState() const { 346 WebRtcVoiceEngine::GetAudioState() const {
324 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 347 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
325 return audio_state_; 348 return audio_state_;
326 } 349 }
327 350
328 VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel( 351 VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel(
329 webrtc::Call* call, 352 webrtc::Call* call,
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) { 705 void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) {
683 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 706 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
684 auto it = std::find(channels_.begin(), channels_.end(), channel); 707 auto it = std::find(channels_.begin(), channels_.end(), channel);
685 RTC_DCHECK(it != channels_.end()); 708 RTC_DCHECK(it != channels_.end());
686 channels_.erase(it); 709 channels_.erase(it);
687 } 710 }
688 711
689 bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file, 712 bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file,
690 int64_t max_size_bytes) { 713 int64_t max_size_bytes) {
691 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 714 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
692 auto aec_dump = webrtc::AecDumpFactory::Create(file, max_size_bytes, 715 auto aec_dump = webrtc::AecDumpFactory::Create(
693 &low_priority_worker_queue_); 716 file, max_size_bytes, low_priority_worker_queue_.get());
694 if (!aec_dump) { 717 if (!aec_dump) {
695 return false; 718 return false;
696 } 719 }
697 apm()->AttachAecDump(std::move(aec_dump)); 720 apm()->AttachAecDump(std::move(aec_dump));
698 return true; 721 return true;
699 } 722 }
700 723
701 void WebRtcVoiceEngine::StartAecDump(const std::string& filename) { 724 void WebRtcVoiceEngine::StartAecDump(const std::string& filename) {
702 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 725 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
703 726
704 auto aec_dump = 727 auto aec_dump = webrtc::AecDumpFactory::Create(
705 webrtc::AecDumpFactory::Create(filename, -1, &low_priority_worker_queue_); 728 filename, -1, low_priority_worker_queue_.get());
706 if (aec_dump) { 729 if (aec_dump) {
707 apm()->AttachAecDump(std::move(aec_dump)); 730 apm()->AttachAecDump(std::move(aec_dump));
708 } 731 }
709 } 732 }
710 733
711 void WebRtcVoiceEngine::StopAecDump() { 734 void WebRtcVoiceEngine::StopAecDump() {
712 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 735 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
713 apm()->DetachAecDump(); 736 apm()->DetachAecDump();
714 } 737 }
715 738
(...skipping 1625 matching lines...) Expand 10 before | Expand all | Expand 10 after
2341 ssrc); 2364 ssrc);
2342 if (it != unsignaled_recv_ssrcs_.end()) { 2365 if (it != unsignaled_recv_ssrcs_.end()) {
2343 unsignaled_recv_ssrcs_.erase(it); 2366 unsignaled_recv_ssrcs_.erase(it);
2344 return true; 2367 return true;
2345 } 2368 }
2346 return false; 2369 return false;
2347 } 2370 }
2348 } // namespace cricket 2371 } // namespace cricket
2349 2372
2350 #endif // HAVE_WEBRTC_VOICE 2373 #endif // HAVE_WEBRTC_VOICE
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine.h ('k') | webrtc/media/engine/webrtcvoiceengine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698