| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |