| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2  *  Copyright (c) 2012 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 | 
| 11 #include "webrtc/voice_engine/voe_base_impl.h" | 11 #include "webrtc/voice_engine/voe_base_impl.h" | 
| 12 | 12 | 
| 13 #include "webrtc/base/format_macros.h" | 13 #include "webrtc/base/format_macros.h" | 
| 14 #include "webrtc/base/logging.h" | 14 #include "webrtc/base/logging.h" | 
| 15 #include "webrtc/common.h" | 15 #include "webrtc/common.h" | 
| 16 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
     y.h" | 16 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
     y.h" | 
| 17 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" | 17 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" | 
| 18 #include "webrtc/modules/audio_device/audio_device_impl.h" | 18 #include "webrtc/modules/audio_device/audio_device_impl.h" | 
| 19 #include "webrtc/modules/audio_processing/include/audio_processing.h" | 19 #include "webrtc/modules/audio_processing/include/audio_processing.h" | 
| 20 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |  | 
| 21 #include "webrtc/system_wrappers/include/file_wrapper.h" | 20 #include "webrtc/system_wrappers/include/file_wrapper.h" | 
| 22 #include "webrtc/voice_engine/channel.h" | 21 #include "webrtc/voice_engine/channel.h" | 
| 23 #include "webrtc/voice_engine/include/voe_errors.h" | 22 #include "webrtc/voice_engine/include/voe_errors.h" | 
| 24 #include "webrtc/voice_engine/output_mixer.h" | 23 #include "webrtc/voice_engine/output_mixer.h" | 
| 25 #include "webrtc/voice_engine/transmit_mixer.h" | 24 #include "webrtc/voice_engine/transmit_mixer.h" | 
| 26 #include "webrtc/voice_engine/utility.h" | 25 #include "webrtc/voice_engine/utility.h" | 
| 27 #include "webrtc/voice_engine/voice_engine_impl.h" | 26 #include "webrtc/voice_engine/voice_engine_impl.h" | 
| 28 | 27 | 
| 29 namespace webrtc { | 28 namespace webrtc { | 
| 30 | 29 | 
| 31 VoEBase* VoEBase::GetInterface(VoiceEngine* voiceEngine) { | 30 VoEBase* VoEBase::GetInterface(VoiceEngine* voiceEngine) { | 
| 32   if (nullptr == voiceEngine) { | 31   if (nullptr == voiceEngine) { | 
| 33     return nullptr; | 32     return nullptr; | 
| 34   } | 33   } | 
| 35   VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine); | 34   VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine); | 
| 36   s->AddRef(); | 35   s->AddRef(); | 
| 37   return s; | 36   return s; | 
| 38 } | 37 } | 
| 39 | 38 | 
| 40 VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared) | 39 VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared) | 
| 41     : voiceEngineObserverPtr_(nullptr), | 40     : voiceEngineObserverPtr_(nullptr), | 
| 42       callbackCritSect_(*CriticalSectionWrapper::CreateCriticalSection()), |  | 
| 43       shared_(shared) {} | 41       shared_(shared) {} | 
| 44 | 42 | 
| 45 VoEBaseImpl::~VoEBaseImpl() { | 43 VoEBaseImpl::~VoEBaseImpl() { | 
| 46   TerminateInternal(); | 44   TerminateInternal(); | 
| 47   delete &callbackCritSect_; |  | 
| 48 } | 45 } | 
| 49 | 46 | 
| 50 void VoEBaseImpl::OnErrorIsReported(const ErrorCode error) { | 47 void VoEBaseImpl::OnErrorIsReported(const ErrorCode error) { | 
| 51   CriticalSectionScoped cs(&callbackCritSect_); | 48   rtc::CritScope cs(&callbackCritSect_); | 
| 52   int errCode = 0; | 49   int errCode = 0; | 
| 53   if (error == AudioDeviceObserver::kRecordingError) { | 50   if (error == AudioDeviceObserver::kRecordingError) { | 
| 54     errCode = VE_RUNTIME_REC_ERROR; | 51     errCode = VE_RUNTIME_REC_ERROR; | 
| 55     LOG_F(LS_ERROR) << "VE_RUNTIME_REC_ERROR"; | 52     LOG_F(LS_ERROR) << "VE_RUNTIME_REC_ERROR"; | 
| 56   } else if (error == AudioDeviceObserver::kPlayoutError) { | 53   } else if (error == AudioDeviceObserver::kPlayoutError) { | 
| 57     errCode = VE_RUNTIME_PLAY_ERROR; | 54     errCode = VE_RUNTIME_PLAY_ERROR; | 
| 58     LOG_F(LS_ERROR) << "VE_RUNTIME_PLAY_ERROR"; | 55     LOG_F(LS_ERROR) << "VE_RUNTIME_PLAY_ERROR"; | 
| 59   } | 56   } | 
| 60   if (voiceEngineObserverPtr_) { | 57   if (voiceEngineObserverPtr_) { | 
| 61     // Deliver callback (-1 <=> no channel dependency) | 58     // Deliver callback (-1 <=> no channel dependency) | 
| 62     voiceEngineObserverPtr_->CallbackOnError(-1, errCode); | 59     voiceEngineObserverPtr_->CallbackOnError(-1, errCode); | 
| 63   } | 60   } | 
| 64 } | 61 } | 
| 65 | 62 | 
| 66 void VoEBaseImpl::OnWarningIsReported(const WarningCode warning) { | 63 void VoEBaseImpl::OnWarningIsReported(const WarningCode warning) { | 
| 67   CriticalSectionScoped cs(&callbackCritSect_); | 64   rtc::CritScope cs(&callbackCritSect_); | 
| 68   int warningCode = 0; | 65   int warningCode = 0; | 
| 69   if (warning == AudioDeviceObserver::kRecordingWarning) { | 66   if (warning == AudioDeviceObserver::kRecordingWarning) { | 
| 70     warningCode = VE_RUNTIME_REC_WARNING; | 67     warningCode = VE_RUNTIME_REC_WARNING; | 
| 71     LOG_F(LS_WARNING) << "VE_RUNTIME_REC_WARNING"; | 68     LOG_F(LS_WARNING) << "VE_RUNTIME_REC_WARNING"; | 
| 72   } else if (warning == AudioDeviceObserver::kPlayoutWarning) { | 69   } else if (warning == AudioDeviceObserver::kPlayoutWarning) { | 
| 73     warningCode = VE_RUNTIME_PLAY_WARNING; | 70     warningCode = VE_RUNTIME_PLAY_WARNING; | 
| 74     LOG_F(LS_WARNING) << "VE_RUNTIME_PLAY_WARNING"; | 71     LOG_F(LS_WARNING) << "VE_RUNTIME_PLAY_WARNING"; | 
| 75   } | 72   } | 
| 76   if (voiceEngineObserverPtr_) { | 73   if (voiceEngineObserverPtr_) { | 
| 77     // Deliver callback (-1 <=> no channel dependency) | 74     // Deliver callback (-1 <=> no channel dependency) | 
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 169                                  void* audio_data, int64_t* elapsed_time_ms, | 166                                  void* audio_data, int64_t* elapsed_time_ms, | 
| 170                                  int64_t* ntp_time_ms) { | 167                                  int64_t* ntp_time_ms) { | 
| 171   assert(bits_per_sample == 16); | 168   assert(bits_per_sample == 16); | 
| 172   assert(number_of_frames == static_cast<size_t>(sample_rate / 100)); | 169   assert(number_of_frames == static_cast<size_t>(sample_rate / 100)); | 
| 173 | 170 | 
| 174   GetPlayoutData(sample_rate, number_of_channels, number_of_frames, false, | 171   GetPlayoutData(sample_rate, number_of_channels, number_of_frames, false, | 
| 175                  audio_data, elapsed_time_ms, ntp_time_ms); | 172                  audio_data, elapsed_time_ms, ntp_time_ms); | 
| 176 } | 173 } | 
| 177 | 174 | 
| 178 int VoEBaseImpl::RegisterVoiceEngineObserver(VoiceEngineObserver& observer) { | 175 int VoEBaseImpl::RegisterVoiceEngineObserver(VoiceEngineObserver& observer) { | 
| 179   CriticalSectionScoped cs(&callbackCritSect_); | 176   rtc::CritScope cs(&callbackCritSect_); | 
| 180   if (voiceEngineObserverPtr_) { | 177   if (voiceEngineObserverPtr_) { | 
| 181     shared_->SetLastError( | 178     shared_->SetLastError( | 
| 182         VE_INVALID_OPERATION, kTraceError, | 179         VE_INVALID_OPERATION, kTraceError, | 
| 183         "RegisterVoiceEngineObserver() observer already enabled"); | 180         "RegisterVoiceEngineObserver() observer already enabled"); | 
| 184     return -1; | 181     return -1; | 
| 185   } | 182   } | 
| 186 | 183 | 
| 187   // Register the observer in all active channels | 184   // Register the observer in all active channels | 
| 188   for (voe::ChannelManager::Iterator it(&shared_->channel_manager()); | 185   for (voe::ChannelManager::Iterator it(&shared_->channel_manager()); | 
| 189        it.IsValid(); it.Increment()) { | 186        it.IsValid(); it.Increment()) { | 
| 190     it.GetChannel()->RegisterVoiceEngineObserver(observer); | 187     it.GetChannel()->RegisterVoiceEngineObserver(observer); | 
| 191   } | 188   } | 
| 192 | 189 | 
| 193   shared_->transmit_mixer()->RegisterVoiceEngineObserver(observer); | 190   shared_->transmit_mixer()->RegisterVoiceEngineObserver(observer); | 
| 194   voiceEngineObserverPtr_ = &observer; | 191   voiceEngineObserverPtr_ = &observer; | 
| 195   return 0; | 192   return 0; | 
| 196 } | 193 } | 
| 197 | 194 | 
| 198 int VoEBaseImpl::DeRegisterVoiceEngineObserver() { | 195 int VoEBaseImpl::DeRegisterVoiceEngineObserver() { | 
| 199   CriticalSectionScoped cs(&callbackCritSect_); | 196   rtc::CritScope cs(&callbackCritSect_); | 
| 200   if (!voiceEngineObserverPtr_) { | 197   if (!voiceEngineObserverPtr_) { | 
| 201     shared_->SetLastError( | 198     shared_->SetLastError( | 
| 202         VE_INVALID_OPERATION, kTraceError, | 199         VE_INVALID_OPERATION, kTraceError, | 
| 203         "DeRegisterVoiceEngineObserver() observer already disabled"); | 200         "DeRegisterVoiceEngineObserver() observer already disabled"); | 
| 204     return 0; | 201     return 0; | 
| 205   } | 202   } | 
| 206   voiceEngineObserverPtr_ = nullptr; | 203   voiceEngineObserverPtr_ = nullptr; | 
| 207 | 204 | 
| 208   // Deregister the observer in all active channels | 205   // Deregister the observer in all active channels | 
| 209   for (voe::ChannelManager::Iterator it(&shared_->channel_manager()); | 206   for (voe::ChannelManager::Iterator it(&shared_->channel_manager()); | 
| 210        it.IsValid(); it.Increment()) { | 207        it.IsValid(); it.Increment()) { | 
| 211     it.GetChannel()->DeRegisterVoiceEngineObserver(); | 208     it.GetChannel()->DeRegisterVoiceEngineObserver(); | 
| 212   } | 209   } | 
| 213 | 210 | 
| 214   return 0; | 211   return 0; | 
| 215 } | 212 } | 
| 216 | 213 | 
| 217 int VoEBaseImpl::Init(AudioDeviceModule* external_adm, | 214 int VoEBaseImpl::Init(AudioDeviceModule* external_adm, | 
| 218                       AudioProcessing* audioproc) { | 215                       AudioProcessing* audioproc) { | 
| 219   CriticalSectionScoped cs(shared_->crit_sec()); | 216   rtc::CritScope cs(shared_->crit_sec()); | 
| 220   WebRtcSpl_Init(); | 217   WebRtcSpl_Init(); | 
| 221   if (shared_->statistics().Initialized()) { | 218   if (shared_->statistics().Initialized()) { | 
| 222     return 0; | 219     return 0; | 
| 223   } | 220   } | 
| 224   if (shared_->process_thread()) { | 221   if (shared_->process_thread()) { | 
| 225     shared_->process_thread()->Start(); | 222     shared_->process_thread()->Start(); | 
| 226   } | 223   } | 
| 227 | 224 | 
| 228   // Create an internal ADM if the user has not added an external | 225   // Create an internal ADM if the user has not added an external | 
| 229   // ADM implementation as input to Init(). | 226   // ADM implementation as input to Init(). | 
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 375     shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR); | 372     shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR); | 
| 376     // TODO(ajm): No error return here due to | 373     // TODO(ajm): No error return here due to | 
| 377     // https://code.google.com/p/webrtc/issues/detail?id=1464 | 374     // https://code.google.com/p/webrtc/issues/detail?id=1464 | 
| 378   } | 375   } | 
| 379 #endif | 376 #endif | 
| 380 | 377 | 
| 381   return shared_->statistics().SetInitialized(); | 378   return shared_->statistics().SetInitialized(); | 
| 382 } | 379 } | 
| 383 | 380 | 
| 384 int VoEBaseImpl::Terminate() { | 381 int VoEBaseImpl::Terminate() { | 
| 385   CriticalSectionScoped cs(shared_->crit_sec()); | 382   rtc::CritScope cs(shared_->crit_sec()); | 
| 386   return TerminateInternal(); | 383   return TerminateInternal(); | 
| 387 } | 384 } | 
| 388 | 385 | 
| 389 int VoEBaseImpl::CreateChannel() { | 386 int VoEBaseImpl::CreateChannel() { | 
| 390   CriticalSectionScoped cs(shared_->crit_sec()); | 387   rtc::CritScope cs(shared_->crit_sec()); | 
| 391   if (!shared_->statistics().Initialized()) { | 388   if (!shared_->statistics().Initialized()) { | 
| 392     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 389     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 393     return -1; | 390     return -1; | 
| 394   } | 391   } | 
| 395 | 392 | 
| 396   voe::ChannelOwner channel_owner = shared_->channel_manager().CreateChannel(); | 393   voe::ChannelOwner channel_owner = shared_->channel_manager().CreateChannel(); | 
| 397   return InitializeChannel(&channel_owner); | 394   return InitializeChannel(&channel_owner); | 
| 398 } | 395 } | 
| 399 | 396 | 
| 400 int VoEBaseImpl::CreateChannel(const Config& config) { | 397 int VoEBaseImpl::CreateChannel(const Config& config) { | 
| 401   CriticalSectionScoped cs(shared_->crit_sec()); | 398   rtc::CritScope cs(shared_->crit_sec()); | 
| 402   if (!shared_->statistics().Initialized()) { | 399   if (!shared_->statistics().Initialized()) { | 
| 403     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 400     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 404     return -1; | 401     return -1; | 
| 405   } | 402   } | 
| 406   voe::ChannelOwner channel_owner = | 403   voe::ChannelOwner channel_owner = | 
| 407       shared_->channel_manager().CreateChannel(config); | 404       shared_->channel_manager().CreateChannel(config); | 
| 408   return InitializeChannel(&channel_owner); | 405   return InitializeChannel(&channel_owner); | 
| 409 } | 406 } | 
| 410 | 407 | 
| 411 int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) { | 408 int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) { | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 427         "CreateChannel() failed to initialize channel. Destroying" | 424         "CreateChannel() failed to initialize channel. Destroying" | 
| 428         " channel."); | 425         " channel."); | 
| 429     shared_->channel_manager().DestroyChannel( | 426     shared_->channel_manager().DestroyChannel( | 
| 430         channel_owner->channel()->ChannelId()); | 427         channel_owner->channel()->ChannelId()); | 
| 431     return -1; | 428     return -1; | 
| 432   } | 429   } | 
| 433   return channel_owner->channel()->ChannelId(); | 430   return channel_owner->channel()->ChannelId(); | 
| 434 } | 431 } | 
| 435 | 432 | 
| 436 int VoEBaseImpl::DeleteChannel(int channel) { | 433 int VoEBaseImpl::DeleteChannel(int channel) { | 
| 437   CriticalSectionScoped cs(shared_->crit_sec()); | 434   rtc::CritScope cs(shared_->crit_sec()); | 
| 438   if (!shared_->statistics().Initialized()) { | 435   if (!shared_->statistics().Initialized()) { | 
| 439     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 436     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 440     return -1; | 437     return -1; | 
| 441   } | 438   } | 
| 442 | 439 | 
| 443   { | 440   { | 
| 444     voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 441     voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 445     voe::Channel* channelPtr = ch.channel(); | 442     voe::Channel* channelPtr = ch.channel(); | 
| 446     if (channelPtr == nullptr) { | 443     if (channelPtr == nullptr) { | 
| 447       shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 444       shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 448                             "DeleteChannel() failed to locate channel"); | 445                             "DeleteChannel() failed to locate channel"); | 
| 449       return -1; | 446       return -1; | 
| 450     } | 447     } | 
| 451   } | 448   } | 
| 452 | 449 | 
| 453   shared_->channel_manager().DestroyChannel(channel); | 450   shared_->channel_manager().DestroyChannel(channel); | 
| 454   if (StopSend() != 0) { | 451   if (StopSend() != 0) { | 
| 455     return -1; | 452     return -1; | 
| 456   } | 453   } | 
| 457   if (StopPlayout() != 0) { | 454   if (StopPlayout() != 0) { | 
| 458     return -1; | 455     return -1; | 
| 459   } | 456   } | 
| 460   return 0; | 457   return 0; | 
| 461 } | 458 } | 
| 462 | 459 | 
| 463 int VoEBaseImpl::StartReceive(int channel) { | 460 int VoEBaseImpl::StartReceive(int channel) { | 
| 464   CriticalSectionScoped cs(shared_->crit_sec()); | 461   rtc::CritScope cs(shared_->crit_sec()); | 
| 465   if (!shared_->statistics().Initialized()) { | 462   if (!shared_->statistics().Initialized()) { | 
| 466     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 463     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 467     return -1; | 464     return -1; | 
| 468   } | 465   } | 
| 469   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 466   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 470   voe::Channel* channelPtr = ch.channel(); | 467   voe::Channel* channelPtr = ch.channel(); | 
| 471   if (channelPtr == nullptr) { | 468   if (channelPtr == nullptr) { | 
| 472     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 469     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 473                           "StartReceive() failed to locate channel"); | 470                           "StartReceive() failed to locate channel"); | 
| 474     return -1; | 471     return -1; | 
| 475   } | 472   } | 
| 476   return channelPtr->StartReceiving(); | 473   return channelPtr->StartReceiving(); | 
| 477 } | 474 } | 
| 478 | 475 | 
| 479 int VoEBaseImpl::StopReceive(int channel) { | 476 int VoEBaseImpl::StopReceive(int channel) { | 
| 480   CriticalSectionScoped cs(shared_->crit_sec()); | 477   rtc::CritScope cs(shared_->crit_sec()); | 
| 481   if (!shared_->statistics().Initialized()) { | 478   if (!shared_->statistics().Initialized()) { | 
| 482     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 479     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 483     return -1; | 480     return -1; | 
| 484   } | 481   } | 
| 485   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 482   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 486   voe::Channel* channelPtr = ch.channel(); | 483   voe::Channel* channelPtr = ch.channel(); | 
| 487   if (channelPtr == nullptr) { | 484   if (channelPtr == nullptr) { | 
| 488     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 485     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 489                           "SetLocalReceiver() failed to locate channel"); | 486                           "SetLocalReceiver() failed to locate channel"); | 
| 490     return -1; | 487     return -1; | 
| 491   } | 488   } | 
| 492   return channelPtr->StopReceiving(); | 489   return channelPtr->StopReceiving(); | 
| 493 } | 490 } | 
| 494 | 491 | 
| 495 int VoEBaseImpl::StartPlayout(int channel) { | 492 int VoEBaseImpl::StartPlayout(int channel) { | 
| 496   CriticalSectionScoped cs(shared_->crit_sec()); | 493   rtc::CritScope cs(shared_->crit_sec()); | 
| 497   if (!shared_->statistics().Initialized()) { | 494   if (!shared_->statistics().Initialized()) { | 
| 498     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 495     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 499     return -1; | 496     return -1; | 
| 500   } | 497   } | 
| 501   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 498   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 502   voe::Channel* channelPtr = ch.channel(); | 499   voe::Channel* channelPtr = ch.channel(); | 
| 503   if (channelPtr == nullptr) { | 500   if (channelPtr == nullptr) { | 
| 504     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 501     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 505                           "StartPlayout() failed to locate channel"); | 502                           "StartPlayout() failed to locate channel"); | 
| 506     return -1; | 503     return -1; | 
| 507   } | 504   } | 
| 508   if (channelPtr->Playing()) { | 505   if (channelPtr->Playing()) { | 
| 509     return 0; | 506     return 0; | 
| 510   } | 507   } | 
| 511   if (StartPlayout() != 0) { | 508   if (StartPlayout() != 0) { | 
| 512     shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 509     shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 
| 513                           "StartPlayout() failed to start playout"); | 510                           "StartPlayout() failed to start playout"); | 
| 514     return -1; | 511     return -1; | 
| 515   } | 512   } | 
| 516   return channelPtr->StartPlayout(); | 513   return channelPtr->StartPlayout(); | 
| 517 } | 514 } | 
| 518 | 515 | 
| 519 int VoEBaseImpl::StopPlayout(int channel) { | 516 int VoEBaseImpl::StopPlayout(int channel) { | 
| 520   CriticalSectionScoped cs(shared_->crit_sec()); | 517   rtc::CritScope cs(shared_->crit_sec()); | 
| 521   if (!shared_->statistics().Initialized()) { | 518   if (!shared_->statistics().Initialized()) { | 
| 522     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 519     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 523     return -1; | 520     return -1; | 
| 524   } | 521   } | 
| 525   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 522   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 526   voe::Channel* channelPtr = ch.channel(); | 523   voe::Channel* channelPtr = ch.channel(); | 
| 527   if (channelPtr == nullptr) { | 524   if (channelPtr == nullptr) { | 
| 528     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 525     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 529                           "StopPlayout() failed to locate channel"); | 526                           "StopPlayout() failed to locate channel"); | 
| 530     return -1; | 527     return -1; | 
| 531   } | 528   } | 
| 532   if (channelPtr->StopPlayout() != 0) { | 529   if (channelPtr->StopPlayout() != 0) { | 
| 533     LOG_F(LS_WARNING) << "StopPlayout() failed to stop playout for channel " | 530     LOG_F(LS_WARNING) << "StopPlayout() failed to stop playout for channel " | 
| 534                       << channel; | 531                       << channel; | 
| 535   } | 532   } | 
| 536   return StopPlayout(); | 533   return StopPlayout(); | 
| 537 } | 534 } | 
| 538 | 535 | 
| 539 int VoEBaseImpl::StartSend(int channel) { | 536 int VoEBaseImpl::StartSend(int channel) { | 
| 540   CriticalSectionScoped cs(shared_->crit_sec()); | 537   rtc::CritScope cs(shared_->crit_sec()); | 
| 541   if (!shared_->statistics().Initialized()) { | 538   if (!shared_->statistics().Initialized()) { | 
| 542     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 539     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 543     return -1; | 540     return -1; | 
| 544   } | 541   } | 
| 545   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 542   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 546   voe::Channel* channelPtr = ch.channel(); | 543   voe::Channel* channelPtr = ch.channel(); | 
| 547   if (channelPtr == nullptr) { | 544   if (channelPtr == nullptr) { | 
| 548     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 545     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 549                           "StartSend() failed to locate channel"); | 546                           "StartSend() failed to locate channel"); | 
| 550     return -1; | 547     return -1; | 
| 551   } | 548   } | 
| 552   if (channelPtr->Sending()) { | 549   if (channelPtr->Sending()) { | 
| 553     return 0; | 550     return 0; | 
| 554   } | 551   } | 
| 555   if (StartSend() != 0) { | 552   if (StartSend() != 0) { | 
| 556     shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 553     shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 
| 557                           "StartSend() failed to start recording"); | 554                           "StartSend() failed to start recording"); | 
| 558     return -1; | 555     return -1; | 
| 559   } | 556   } | 
| 560   return channelPtr->StartSend(); | 557   return channelPtr->StartSend(); | 
| 561 } | 558 } | 
| 562 | 559 | 
| 563 int VoEBaseImpl::StopSend(int channel) { | 560 int VoEBaseImpl::StopSend(int channel) { | 
| 564   CriticalSectionScoped cs(shared_->crit_sec()); | 561   rtc::CritScope cs(shared_->crit_sec()); | 
| 565   if (!shared_->statistics().Initialized()) { | 562   if (!shared_->statistics().Initialized()) { | 
| 566     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 563     shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 567     return -1; | 564     return -1; | 
| 568   } | 565   } | 
| 569   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 566   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 570   voe::Channel* channelPtr = ch.channel(); | 567   voe::Channel* channelPtr = ch.channel(); | 
| 571   if (channelPtr == nullptr) { | 568   if (channelPtr == nullptr) { | 
| 572     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 569     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 573                           "StopSend() failed to locate channel"); | 570                           "StopSend() failed to locate channel"); | 
| 574     return -1; | 571     return -1; | 
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 788   // Deliver audio (PCM) samples to the ADM | 785   // Deliver audio (PCM) samples to the ADM | 
| 789   memcpy(audio_data, audioFrame_.data_, | 786   memcpy(audio_data, audioFrame_.data_, | 
| 790          sizeof(int16_t) * number_of_frames * number_of_channels); | 787          sizeof(int16_t) * number_of_frames * number_of_channels); | 
| 791 | 788 | 
| 792   *elapsed_time_ms = audioFrame_.elapsed_time_ms_; | 789   *elapsed_time_ms = audioFrame_.elapsed_time_ms_; | 
| 793   *ntp_time_ms = audioFrame_.ntp_time_ms_; | 790   *ntp_time_ms = audioFrame_.ntp_time_ms_; | 
| 794 } | 791 } | 
| 795 | 792 | 
| 796 int VoEBaseImpl::AssociateSendChannel(int channel, | 793 int VoEBaseImpl::AssociateSendChannel(int channel, | 
| 797                                       int accociate_send_channel) { | 794                                       int accociate_send_channel) { | 
| 798   CriticalSectionScoped cs(shared_->crit_sec()); | 795   rtc::CritScope cs(shared_->crit_sec()); | 
| 799 | 796 | 
| 800   if (!shared_->statistics().Initialized()) { | 797   if (!shared_->statistics().Initialized()) { | 
| 801       shared_->SetLastError(VE_NOT_INITED, kTraceError); | 798       shared_->SetLastError(VE_NOT_INITED, kTraceError); | 
| 802       return -1; | 799       return -1; | 
| 803   } | 800   } | 
| 804 | 801 | 
| 805   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 802   voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 
| 806   voe::Channel* channel_ptr = ch.channel(); | 803   voe::Channel* channel_ptr = ch.channel(); | 
| 807   if (channel_ptr == NULL) { | 804   if (channel_ptr == NULL) { | 
| 808     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 805     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 809         "AssociateSendChannel() failed to locate channel"); | 806         "AssociateSendChannel() failed to locate channel"); | 
| 810     return -1; | 807     return -1; | 
| 811   } | 808   } | 
| 812 | 809 | 
| 813   ch = shared_->channel_manager().GetChannel(accociate_send_channel); | 810   ch = shared_->channel_manager().GetChannel(accociate_send_channel); | 
| 814   voe::Channel* accociate_send_channel_ptr = ch.channel(); | 811   voe::Channel* accociate_send_channel_ptr = ch.channel(); | 
| 815   if (accociate_send_channel_ptr == NULL) { | 812   if (accociate_send_channel_ptr == NULL) { | 
| 816     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 813     shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 
| 817         "AssociateSendChannel() failed to locate accociate_send_channel"); | 814         "AssociateSendChannel() failed to locate accociate_send_channel"); | 
| 818     return -1; | 815     return -1; | 
| 819   } | 816   } | 
| 820 | 817 | 
| 821   channel_ptr->set_associate_send_channel(ch); | 818   channel_ptr->set_associate_send_channel(ch); | 
| 822   return 0; | 819   return 0; | 
| 823 } | 820 } | 
| 824 | 821 | 
| 825 }  // namespace webrtc | 822 }  // namespace webrtc | 
| OLD | NEW | 
|---|