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 |