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

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

Issue 2934103002: Allow WebRtcMediaEngine to be created from any thread. (Closed)
Patch Set: 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);
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.
239 // The rest of our initialization will happen in Init.
240 }
241
242 WebRtcVoiceEngine::~WebRtcVoiceEngine() {
237 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 243 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
238 LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine"; 244 LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine";
239 RTC_DCHECK(voe_wrapper); 245 if (initialized_) {
240 RTC_DCHECK(decoder_factory); 246 StopAecDump();
247 voe_wrapper_->base()->Terminate();
248 webrtc::Trace::SetTraceCallback(nullptr);
249 }
250 }
241 251
242 signal_thread_checker_.DetachFromThread(); 252 void WebRtcVoiceEngine::Init() {
253 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
254 LOG(LS_INFO) << "WebRtcVoiceEngine::Init";
255
256 // TaskQueue expects to be created/destroyed on the same thread.
257 low_priority_worker_queue_.reset(
258 new rtc::TaskQueue("rtc-low-prio", rtc::TaskQueue::Priority::LOW));
259
260 // VoEWrapper needs to be created on the worker thread. It's expected to be
261 // null here unless it's being injected for testing.
262 if (!voe_wrapper_) {
263 voe_wrapper_.reset(new VoEWrapper());
264 }
243 265
244 // Load our audio codec lists. 266 // Load our audio codec lists.
245 LOG(LS_INFO) << "Supported send codecs in order of preference:"; 267 LOG(LS_INFO) << "Supported send codecs in order of preference:";
246 send_codecs_ = CollectCodecs(encoder_factory_->GetSupportedEncoders()); 268 send_codecs_ = CollectCodecs(encoder_factory_->GetSupportedEncoders());
247 for (const AudioCodec& codec : send_codecs_) { 269 for (const AudioCodec& codec : send_codecs_) {
248 LOG(LS_INFO) << ToString(codec); 270 LOG(LS_INFO) << ToString(codec);
249 } 271 }
250 272
251 LOG(LS_INFO) << "Supported recv codecs in order of preference:"; 273 LOG(LS_INFO) << "Supported recv codecs in order of preference:";
252 recv_codecs_ = CollectCodecs(decoder_factory_->GetSupportedDecoders()); 274 recv_codecs_ = CollectCodecs(decoder_factory_->GetSupportedDecoders());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 bool error = ApplyOptions(options); 324 bool error = ApplyOptions(options);
303 RTC_DCHECK(error); 325 RTC_DCHECK(error);
304 } 326 }
305 327
306 // Set default audio devices. 328 // Set default audio devices.
307 #if !defined(WEBRTC_IOS) 329 #if !defined(WEBRTC_IOS)
308 webrtc::adm_helpers::SetRecordingDevice(adm_); 330 webrtc::adm_helpers::SetRecordingDevice(adm_);
309 apm()->Initialize(); 331 apm()->Initialize();
310 webrtc::adm_helpers::SetPlayoutDevice(adm_); 332 webrtc::adm_helpers::SetPlayoutDevice(adm_);
311 #endif // !WEBRTC_IOS 333 #endif // !WEBRTC_IOS
312 }
313 334
314 WebRtcVoiceEngine::~WebRtcVoiceEngine() { 335 // May be null for VoE injected for testing.
315 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 336 if (voe()->engine()) {
Taylor Brandstetter 2017/06/13 21:35:51 Note that this wasn't necessary before because the
316 LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; 337 audio_state_ =
317 StopAecDump(); 338 webrtc::AudioState::Create(MakeAudioStateConfig(voe(), audio_mixer_));
318 voe_wrapper_->base()->Terminate(); 339 }
319 webrtc::Trace::SetTraceCallback(nullptr); 340
341 initialized_ = true;
320 } 342 }
321 343
322 rtc::scoped_refptr<webrtc::AudioState> 344 rtc::scoped_refptr<webrtc::AudioState>
323 WebRtcVoiceEngine::GetAudioState() const { 345 WebRtcVoiceEngine::GetAudioState() const {
324 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 346 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
325 return audio_state_; 347 return audio_state_;
326 } 348 }
327 349
328 VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel( 350 VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel(
329 webrtc::Call* call, 351 webrtc::Call* call,
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) { 704 void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) {
683 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 705 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
684 auto it = std::find(channels_.begin(), channels_.end(), channel); 706 auto it = std::find(channels_.begin(), channels_.end(), channel);
685 RTC_DCHECK(it != channels_.end()); 707 RTC_DCHECK(it != channels_.end());
686 channels_.erase(it); 708 channels_.erase(it);
687 } 709 }
688 710
689 bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file, 711 bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file,
690 int64_t max_size_bytes) { 712 int64_t max_size_bytes) {
691 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 713 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
692 auto aec_dump = webrtc::AecDumpFactory::Create(file, max_size_bytes, 714 auto aec_dump = webrtc::AecDumpFactory::Create(
693 &low_priority_worker_queue_); 715 file, max_size_bytes, low_priority_worker_queue_.get());
694 if (!aec_dump) { 716 if (!aec_dump) {
695 return false; 717 return false;
696 } 718 }
697 apm()->AttachAecDump(std::move(aec_dump)); 719 apm()->AttachAecDump(std::move(aec_dump));
698 return true; 720 return true;
699 } 721 }
700 722
701 void WebRtcVoiceEngine::StartAecDump(const std::string& filename) { 723 void WebRtcVoiceEngine::StartAecDump(const std::string& filename) {
702 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 724 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
703 725
704 auto aec_dump = 726 auto aec_dump = webrtc::AecDumpFactory::Create(
705 webrtc::AecDumpFactory::Create(filename, -1, &low_priority_worker_queue_); 727 filename, -1, low_priority_worker_queue_.get());
706 if (aec_dump) { 728 if (aec_dump) {
707 apm()->AttachAecDump(std::move(aec_dump)); 729 apm()->AttachAecDump(std::move(aec_dump));
708 } 730 }
709 } 731 }
710 732
711 void WebRtcVoiceEngine::StopAecDump() { 733 void WebRtcVoiceEngine::StopAecDump() {
712 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 734 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
713 apm()->DetachAecDump(); 735 apm()->DetachAecDump();
714 } 736 }
715 737
(...skipping 1625 matching lines...) Expand 10 before | Expand all | Expand 10 after
2341 ssrc); 2363 ssrc);
2342 if (it != unsignaled_recv_ssrcs_.end()) { 2364 if (it != unsignaled_recv_ssrcs_.end()) {
2343 unsignaled_recv_ssrcs_.erase(it); 2365 unsignaled_recv_ssrcs_.erase(it);
2344 return true; 2366 return true;
2345 } 2367 }
2346 return false; 2368 return false;
2347 } 2369 }
2348 } // namespace cricket 2370 } // namespace cricket
2349 2371
2350 #endif // HAVE_WEBRTC_VOICE 2372 #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