diff --git a/webrtc/voice_engine/voe_base_impl.cc b/webrtc/voice_engine/voe_base_impl.cc index 207f0b9744..b53aa1889c 100644 --- a/webrtc/voice_engine/voe_base_impl.cc +++ b/webrtc/voice_engine/voe_base_impl.cc @@ -25,129 +25,96 @@ #include "webrtc/voice_engine/utility.h" #include "webrtc/voice_engine/voice_engine_impl.h" -namespace webrtc -{ +namespace webrtc { -VoEBase* VoEBase::GetInterface(VoiceEngine* voiceEngine) -{ - if (NULL == voiceEngine) - { - return NULL; - } - VoiceEngineImpl* s = static_cast(voiceEngine); - s->AddRef(); - return s; +VoEBase* VoEBase::GetInterface(VoiceEngine* voiceEngine) { + if (nullptr == voiceEngine) { + return nullptr; + } + VoiceEngineImpl* s = static_cast(voiceEngine); + s->AddRef(); + return s; } -VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared) : - _voiceEngineObserverPtr(NULL), - _callbackCritSect(*CriticalSectionWrapper::CreateCriticalSection()), - _shared(shared) -{ +VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared) + : voiceEngineObserverPtr_(nullptr), + callbackCritSect_(*CriticalSectionWrapper::CreateCriticalSection()), + shared_(shared) {} + +VoEBaseImpl::~VoEBaseImpl() { + TerminateInternal(); + delete &callbackCritSect_; } -VoEBaseImpl::~VoEBaseImpl() -{ - TerminateInternal(); - delete &_callbackCritSect; +void VoEBaseImpl::OnErrorIsReported(ErrorCode error) { + CriticalSectionScoped cs(&callbackCritSect_); + int errCode = 0; + if (error == AudioDeviceObserver::kRecordingError) { + errCode = VE_RUNTIME_REC_ERROR; + LOG_F(LS_ERROR) << "VE_RUNTIME_REC_ERROR"; + } else if (error == AudioDeviceObserver::kPlayoutError) { + errCode = VE_RUNTIME_PLAY_ERROR; + LOG_F(LS_ERROR) << "VE_RUNTIME_PLAY_ERROR"; + } + if (voiceEngineObserverPtr_) { + // Deliver callback (-1 <=> no channel dependency) + voiceEngineObserverPtr_->CallbackOnError(-1, errCode); + } } -void VoEBaseImpl::OnErrorIsReported(ErrorCode error) -{ - CriticalSectionScoped cs(&_callbackCritSect); - int errCode = 0; - if (error == AudioDeviceObserver::kRecordingError) - { - errCode = VE_RUNTIME_REC_ERROR; - LOG_F(LS_ERROR) << "VE_RUNTIME_REC_ERROR"; - } - else if (error == AudioDeviceObserver::kPlayoutError) - { - errCode = VE_RUNTIME_PLAY_ERROR; - LOG_F(LS_ERROR) << "VE_RUNTIME_PLAY_ERROR"; - } - if (_voiceEngineObserverPtr) - { - // Deliver callback (-1 <=> no channel dependency) - _voiceEngineObserverPtr->CallbackOnError(-1, errCode); - } -} - -void VoEBaseImpl::OnWarningIsReported(WarningCode warning) -{ - CriticalSectionScoped cs(&_callbackCritSect); - int warningCode = 0; - if (warning == AudioDeviceObserver::kRecordingWarning) - { - warningCode = VE_RUNTIME_REC_WARNING; - LOG_F(LS_WARNING) << "VE_RUNTIME_REC_WARNING"; - } - else if (warning == AudioDeviceObserver::kPlayoutWarning) - { - warningCode = VE_RUNTIME_PLAY_WARNING; - LOG_F(LS_WARNING) << "VE_RUNTIME_PLAY_WARNING"; - } - if (_voiceEngineObserverPtr) - { - // Deliver callback (-1 <=> no channel dependency) - _voiceEngineObserverPtr->CallbackOnError(-1, warningCode); - } +void VoEBaseImpl::OnWarningIsReported(WarningCode warning) { + CriticalSectionScoped cs(&callbackCritSect_); + int warningCode = 0; + if (warning == AudioDeviceObserver::kRecordingWarning) { + warningCode = VE_RUNTIME_REC_WARNING; + LOG_F(LS_WARNING) << "VE_RUNTIME_REC_WARNING"; + } else if (warning == AudioDeviceObserver::kPlayoutWarning) { + warningCode = VE_RUNTIME_PLAY_WARNING; + LOG_F(LS_WARNING) << "VE_RUNTIME_PLAY_WARNING"; + } + if (voiceEngineObserverPtr_) { + // Deliver callback (-1 <=> no channel dependency) + voiceEngineObserverPtr_->CallbackOnError(-1, warningCode); + } } int32_t VoEBaseImpl::RecordedDataIsAvailable( - const void* audioSamples, - uint32_t nSamples, - uint8_t nBytesPerSample, - uint8_t nChannels, - uint32_t samplesPerSec, - uint32_t totalDelayMS, - int32_t clockDrift, - uint32_t micLevel, - bool keyPressed, - uint32_t& newMicLevel) -{ - newMicLevel = static_cast(ProcessRecordedDataWithAPM( - NULL, 0, audioSamples, samplesPerSec, nChannels, nSamples, - totalDelayMS, clockDrift, micLevel, keyPressed)); - return 0; + const void* audioSamples, uint32_t nSamples, uint8_t nBytesPerSample, + uint8_t nChannels, uint32_t samplesPerSec, uint32_t totalDelayMS, + int32_t clockDrift, uint32_t micLevel, bool keyPressed, + uint32_t& newMicLevel) { + newMicLevel = static_cast(ProcessRecordedDataWithAPM( + nullptr, 0, audioSamples, samplesPerSec, nChannels, nSamples, + totalDelayMS, clockDrift, micLevel, keyPressed)); + return 0; } -int32_t VoEBaseImpl::NeedMorePlayData( - uint32_t nSamples, - uint8_t nBytesPerSample, - uint8_t nChannels, - uint32_t samplesPerSec, - void* audioSamples, - uint32_t& nSamplesOut, - int64_t* elapsed_time_ms, - int64_t* ntp_time_ms) -{ - GetPlayoutData(static_cast(samplesPerSec), - static_cast(nChannels), +int32_t VoEBaseImpl::NeedMorePlayData(uint32_t nSamples, + uint8_t nBytesPerSample, + uint8_t nChannels, uint32_t samplesPerSec, + void* audioSamples, uint32_t& nSamplesOut, + int64_t* elapsed_time_ms, + int64_t* ntp_time_ms) { + GetPlayoutData(static_cast(samplesPerSec), static_cast(nChannels), static_cast(nSamples), true, audioSamples, elapsed_time_ms, ntp_time_ms); - nSamplesOut = _audioFrame.samples_per_channel_; + nSamplesOut = audioFrame_.samples_per_channel_; return 0; } int VoEBaseImpl::OnDataAvailable(const int voe_channels[], int number_of_voe_channels, - const int16_t* audio_data, - int sample_rate, - int number_of_channels, - int number_of_frames, - int audio_delay_milliseconds, - int volume, - bool key_pressed, - bool need_audio_processing) { - if (number_of_voe_channels == 0) - return 0; + const int16_t* audio_data, int sample_rate, + int number_of_channels, int number_of_frames, + int audio_delay_milliseconds, int volume, + bool key_pressed, bool need_audio_processing) { + if (number_of_voe_channels == 0) return 0; if (need_audio_processing) { return ProcessRecordedDataWithAPM( voe_channels, number_of_voe_channels, audio_data, sample_rate, - number_of_channels, number_of_frames, audio_delay_milliseconds, - 0, volume, key_pressed); + number_of_channels, number_of_frames, audio_delay_milliseconds, 0, + volume, key_pressed); } // No need to go through the APM, demultiplex the data to each VoE channel, @@ -166,8 +133,7 @@ int VoEBaseImpl::OnDataAvailable(const int voe_channels[], void VoEBaseImpl::OnData(int voe_channel, const void* audio_data, int bits_per_sample, int sample_rate, - int number_of_channels, - int number_of_frames) { + int number_of_channels, int number_of_frames) { PushCaptureData(voe_channel, audio_data, bits_per_sample, sample_rate, number_of_channels, number_of_frames); } @@ -176,10 +142,9 @@ void VoEBaseImpl::PushCaptureData(int voe_channel, const void* audio_data, int bits_per_sample, int sample_rate, int number_of_channels, int number_of_frames) { - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(voe_channel); + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(voe_channel); voe::Channel* channel_ptr = ch.channel(); - if (!channel_ptr) - return; + if (!channel_ptr) return; if (channel_ptr->Sending()) { channel_ptr->Demultiplex(static_cast(audio_data), @@ -191,8 +156,7 @@ void VoEBaseImpl::PushCaptureData(int voe_channel, const void* audio_data, void VoEBaseImpl::PullRenderData(int bits_per_sample, int sample_rate, int number_of_channels, int number_of_frames, - void* audio_data, - int64_t* elapsed_time_ms, + void* audio_data, int64_t* elapsed_time_ms, int64_t* ntp_time_ms) { assert(bits_per_sample == 16); assert(number_of_frames == static_cast(sample_rate / 100)); @@ -201,575 +165,495 @@ void VoEBaseImpl::PullRenderData(int bits_per_sample, int sample_rate, audio_data, elapsed_time_ms, ntp_time_ms); } -int VoEBaseImpl::RegisterVoiceEngineObserver(VoiceEngineObserver& observer) -{ - CriticalSectionScoped cs(&_callbackCritSect); - if (_voiceEngineObserverPtr) - { - _shared->SetLastError(VE_INVALID_OPERATION, kTraceError, - "RegisterVoiceEngineObserver() observer already enabled"); - return -1; - } +int VoEBaseImpl::RegisterVoiceEngineObserver(VoiceEngineObserver& observer) { + CriticalSectionScoped cs(&callbackCritSect_); + if (voiceEngineObserverPtr_) { + shared_->SetLastError( + VE_INVALID_OPERATION, kTraceError, + "RegisterVoiceEngineObserver() observer already enabled"); + return -1; + } - // Register the observer in all active channels - for (voe::ChannelManager::Iterator it(&_shared->channel_manager()); - it.IsValid(); - it.Increment()) { - it.GetChannel()->RegisterVoiceEngineObserver(observer); - } + // Register the observer in all active channels + for (voe::ChannelManager::Iterator it(&shared_->channel_manager()); + it.IsValid(); it.Increment()) { + it.GetChannel()->RegisterVoiceEngineObserver(observer); + } - _shared->transmit_mixer()->RegisterVoiceEngineObserver(observer); - _voiceEngineObserverPtr = &observer; - return 0; + shared_->transmit_mixer()->RegisterVoiceEngineObserver(observer); + voiceEngineObserverPtr_ = &observer; + return 0; } -int VoEBaseImpl::DeRegisterVoiceEngineObserver() -{ - CriticalSectionScoped cs(&_callbackCritSect); - if (!_voiceEngineObserverPtr) - { - _shared->SetLastError(VE_INVALID_OPERATION, kTraceError, - "DeRegisterVoiceEngineObserver() observer already disabled"); - return 0; - } - - _voiceEngineObserverPtr = NULL; - - // Deregister the observer in all active channels - for (voe::ChannelManager::Iterator it(&_shared->channel_manager()); - it.IsValid(); - it.Increment()) { - it.GetChannel()->DeRegisterVoiceEngineObserver(); - } - +int VoEBaseImpl::DeRegisterVoiceEngineObserver() { + CriticalSectionScoped cs(&callbackCritSect_); + if (!voiceEngineObserverPtr_) { + shared_->SetLastError( + VE_INVALID_OPERATION, kTraceError, + "DeRegisterVoiceEngineObserver() observer already disabled"); return 0; + } + voiceEngineObserverPtr_ = nullptr; + + // Deregister the observer in all active channels + for (voe::ChannelManager::Iterator it(&shared_->channel_manager()); + it.IsValid(); it.Increment()) { + it.GetChannel()->DeRegisterVoiceEngineObserver(); + } + + return 0; } int VoEBaseImpl::Init(AudioDeviceModule* external_adm, - AudioProcessing* audioproc) -{ - CriticalSectionScoped cs(_shared->crit_sec()); + AudioProcessing* audioproc) { + CriticalSectionScoped cs(shared_->crit_sec()); + WebRtcSpl_Init(); + if (shared_->statistics().Initialized()) { + return 0; + } + if (shared_->process_thread()) { + shared_->process_thread()->Start(); + } - WebRtcSpl_Init(); + // Create an internal ADM if the user has not added an external + // ADM implementation as input to Init(). + if (external_adm == nullptr) { + // Create the internal ADM implementation. + shared_->set_audio_device(AudioDeviceModuleImpl::Create( + VoEId(shared_->instance_id(), -1), shared_->audio_device_layer())); - if (_shared->statistics().Initialized()) - { - return 0; + if (shared_->audio_device() == nullptr) { + shared_->SetLastError(VE_NO_MEMORY, kTraceCritical, + "Init() failed to create the ADM"); + return -1; } + } else { + // Use the already existing external ADM implementation. + shared_->set_audio_device(external_adm); + LOG_F(LS_INFO) + << "An external ADM implementation will be used in VoiceEngine"; + } - if (_shared->process_thread()) - { - _shared->process_thread()->Start(); - } + // Register the ADM to the process thread, which will drive the error + // callback mechanism + if (shared_->process_thread()) { + shared_->process_thread()->RegisterModule(shared_->audio_device()); + } - // Create an internal ADM if the user has not added an external - // ADM implementation as input to Init(). - if (external_adm == NULL) - { - // Create the internal ADM implementation. - _shared->set_audio_device(AudioDeviceModuleImpl::Create( - VoEId(_shared->instance_id(), -1), _shared->audio_device_layer())); + bool available = false; - if (_shared->audio_device() == NULL) - { - _shared->SetLastError(VE_NO_MEMORY, kTraceCritical, - "Init() failed to create the ADM"); - return -1; - } - } - else - { - // Use the already existing external ADM implementation. - _shared->set_audio_device(external_adm); - LOG_F(LS_INFO) << - "An external ADM implementation will be used in VoiceEngine"; - } + // -------------------- + // Reinitialize the ADM - // Register the ADM to the process thread, which will drive the error - // callback mechanism - if (_shared->process_thread()) - { - _shared->process_thread()->RegisterModule(_shared->audio_device()); - } + // Register the AudioObserver implementation + if (shared_->audio_device()->RegisterEventObserver(this) != 0) { + shared_->SetLastError( + VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, + "Init() failed to register event observer for the ADM"); + } - bool available(false); + // Register the AudioTransport implementation + if (shared_->audio_device()->RegisterAudioCallback(this) != 0) { + shared_->SetLastError( + VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, + "Init() failed to register audio callback for the ADM"); + } - // -------------------- - // Reinitialize the ADM + // ADM initialization + if (shared_->audio_device()->Init() != 0) { + shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, + "Init() failed to initialize the ADM"); + return -1; + } - // Register the AudioObserver implementation - if (_shared->audio_device()->RegisterEventObserver(this) != 0) { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, - "Init() failed to register event observer for the ADM"); - } + // Initialize the default speaker + if (shared_->audio_device()->SetPlayoutDevice( + WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) { + shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceInfo, + "Init() failed to set the default output device"); + } + if (shared_->audio_device()->InitSpeaker() != 0) { + shared_->SetLastError(VE_CANNOT_ACCESS_SPEAKER_VOL, kTraceInfo, + "Init() failed to initialize the speaker"); + } - // Register the AudioTransport implementation - if (_shared->audio_device()->RegisterAudioCallback(this) != 0) { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, - "Init() failed to register audio callback for the ADM"); - } + // Initialize the default microphone + if (shared_->audio_device()->SetRecordingDevice( + WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) { + shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceInfo, + "Init() failed to set the default input device"); + } + if (shared_->audio_device()->InitMicrophone() != 0) { + shared_->SetLastError(VE_CANNOT_ACCESS_MIC_VOL, kTraceInfo, + "Init() failed to initialize the microphone"); + } - // ADM initialization - if (_shared->audio_device()->Init() != 0) - { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, - "Init() failed to initialize the ADM"); - return -1; - } + // Set number of channels + if (shared_->audio_device()->StereoPlayoutIsAvailable(&available) != 0) { + shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, + "Init() failed to query stereo playout mode"); + } + if (shared_->audio_device()->SetStereoPlayout(available) != 0) { + shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, + "Init() failed to set mono/stereo playout mode"); + } - // Initialize the default speaker - if (_shared->audio_device()->SetPlayoutDevice( - WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) - { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceInfo, - "Init() failed to set the default output device"); - } - if (_shared->audio_device()->InitSpeaker() != 0) - { - _shared->SetLastError(VE_CANNOT_ACCESS_SPEAKER_VOL, kTraceInfo, - "Init() failed to initialize the speaker"); - } - - // Initialize the default microphone - if (_shared->audio_device()->SetRecordingDevice( - WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) - { - _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceInfo, - "Init() failed to set the default input device"); - } - if (_shared->audio_device()->InitMicrophone() != 0) - { - _shared->SetLastError(VE_CANNOT_ACCESS_MIC_VOL, kTraceInfo, - "Init() failed to initialize the microphone"); - } - - // Set number of channels - if (_shared->audio_device()->StereoPlayoutIsAvailable(&available) != 0) { - _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, - "Init() failed to query stereo playout mode"); - } - if (_shared->audio_device()->SetStereoPlayout(available) != 0) - { - _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, - "Init() failed to set mono/stereo playout mode"); - } - - // TODO(andrew): These functions don't tell us whether stereo recording - // is truly available. We simply set the AudioProcessing input to stereo - // here, because we have to wait until receiving the first frame to - // determine the actual number of channels anyway. - // - // These functions may be changed; tracked here: - // http://code.google.com/p/webrtc/issues/detail?id=204 - _shared->audio_device()->StereoRecordingIsAvailable(&available); - if (_shared->audio_device()->SetStereoRecording(available) != 0) - { - _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, - "Init() failed to set mono/stereo recording mode"); - } + // TODO(andrew): These functions don't tell us whether stereo recording + // is truly available. We simply set the AudioProcessing input to stereo + // here, because we have to wait until receiving the first frame to + // determine the actual number of channels anyway. + // + // These functions may be changed; tracked here: + // http://code.google.com/p/webrtc/issues/detail?id=204 + shared_->audio_device()->StereoRecordingIsAvailable(&available); + if (shared_->audio_device()->SetStereoRecording(available) != 0) { + shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, + "Init() failed to set mono/stereo recording mode"); + } + if (!audioproc) { + audioproc = AudioProcessing::Create(); if (!audioproc) { - audioproc = AudioProcessing::Create(); - if (!audioproc) { - LOG(LS_ERROR) << "Failed to create AudioProcessing."; - _shared->SetLastError(VE_NO_MEMORY); - return -1; - } + LOG(LS_ERROR) << "Failed to create AudioProcessing."; + shared_->SetLastError(VE_NO_MEMORY); + return -1; } - _shared->set_audio_processing(audioproc); + } + shared_->set_audio_processing(audioproc); - // Set the error state for any failures in this block. - _shared->SetLastError(VE_APM_ERROR); - // Configure AudioProcessing components. - if (audioproc->high_pass_filter()->Enable(true) != 0) { - LOG_FERR1(LS_ERROR, high_pass_filter()->Enable, true); - return -1; - } - if (audioproc->echo_cancellation()->enable_drift_compensation(false) != 0) { - LOG_FERR1(LS_ERROR, enable_drift_compensation, false); - return -1; - } - if (audioproc->noise_suppression()->set_level(kDefaultNsMode) != 0) { - LOG_FERR1(LS_ERROR, noise_suppression()->set_level, kDefaultNsMode); - return -1; - } - GainControl* agc = audioproc->gain_control(); - if (agc->set_analog_level_limits(kMinVolumeLevel, kMaxVolumeLevel) != 0) { - LOG_FERR2(LS_ERROR, agc->set_analog_level_limits, kMinVolumeLevel, - kMaxVolumeLevel); - return -1; - } - if (agc->set_mode(kDefaultAgcMode) != 0) { - LOG_FERR1(LS_ERROR, agc->set_mode, kDefaultAgcMode); - return -1; - } - if (agc->Enable(kDefaultAgcState) != 0) { - LOG_FERR1(LS_ERROR, agc->Enable, kDefaultAgcState); - return -1; - } - _shared->SetLastError(0); // Clear error state. + // Set the error state for any failures in this block. + shared_->SetLastError(VE_APM_ERROR); + // Configure AudioProcessing components. + if (audioproc->high_pass_filter()->Enable(true) != 0) { + LOG_FERR1(LS_ERROR, high_pass_filter()->Enable, true); + return -1; + } + if (audioproc->echo_cancellation()->enable_drift_compensation(false) != 0) { + LOG_FERR1(LS_ERROR, enable_drift_compensation, false); + return -1; + } + if (audioproc->noise_suppression()->set_level(kDefaultNsMode) != 0) { + LOG_FERR1(LS_ERROR, noise_suppression()->set_level, kDefaultNsMode); + return -1; + } + GainControl* agc = audioproc->gain_control(); + if (agc->set_analog_level_limits(kMinVolumeLevel, kMaxVolumeLevel) != 0) { + LOG_FERR2(LS_ERROR, agc->set_analog_level_limits, kMinVolumeLevel, + kMaxVolumeLevel); + return -1; + } + if (agc->set_mode(kDefaultAgcMode) != 0) { + LOG_FERR1(LS_ERROR, agc->set_mode, kDefaultAgcMode); + return -1; + } + if (agc->Enable(kDefaultAgcState) != 0) { + LOG_FERR1(LS_ERROR, agc->Enable, kDefaultAgcState); + return -1; + } + shared_->SetLastError(0); // Clear error state. #ifdef WEBRTC_VOICE_ENGINE_AGC - bool agc_enabled = agc->mode() == GainControl::kAdaptiveAnalog && - agc->is_enabled(); - if (_shared->audio_device()->SetAGC(agc_enabled) != 0) { - LOG_FERR1(LS_ERROR, audio_device()->SetAGC, agc_enabled); - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR); - // TODO(ajm): No error return here due to - // https://code.google.com/p/webrtc/issues/detail?id=1464 - } + bool agc_enabled = + agc->mode() == GainControl::kAdaptiveAnalog && agc->is_enabled(); + if (shared_->audio_device()->SetAGC(agc_enabled) != 0) { + LOG_FERR1(LS_ERROR, audio_device()->SetAGC, agc_enabled); + shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR); + // TODO(ajm): No error return here due to + // https://code.google.com/p/webrtc/issues/detail?id=1464 + } #endif - return _shared->statistics().SetInitialized(); + return shared_->statistics().SetInitialized(); } -int VoEBaseImpl::Terminate() -{ - CriticalSectionScoped cs(_shared->crit_sec()); - return TerminateInternal(); +int VoEBaseImpl::Terminate() { + CriticalSectionScoped cs(shared_->crit_sec()); + return TerminateInternal(); } int VoEBaseImpl::CreateChannel() { - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; } - voe::ChannelOwner channel_owner = _shared->channel_manager().CreateChannel(); + voe::ChannelOwner channel_owner = shared_->channel_manager().CreateChannel(); return InitializeChannel(&channel_owner); } int VoEBaseImpl::CreateChannel(const Config& config) { - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; } - voe::ChannelOwner channel_owner = _shared->channel_manager().CreateChannel( - config); + voe::ChannelOwner channel_owner = + shared_->channel_manager().CreateChannel(config); return InitializeChannel(&channel_owner); } -int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) -{ - if (channel_owner->channel()->SetEngineInformation( - _shared->statistics(), - *_shared->output_mixer(), - *_shared->transmit_mixer(), - *_shared->process_thread(), - *_shared->audio_device(), - _voiceEngineObserverPtr, - &_callbackCritSect) != 0) { - _shared->SetLastError( - VE_CHANNEL_NOT_CREATED, - kTraceError, - "CreateChannel() failed to associate engine and channel." - " Destroying channel."); - _shared->channel_manager() - .DestroyChannel(channel_owner->channel()->ChannelId()); - return -1; - } else if (channel_owner->channel()->Init() != 0) { - _shared->SetLastError( - VE_CHANNEL_NOT_CREATED, - kTraceError, - "CreateChannel() failed to initialize channel. Destroying" - " channel."); - _shared->channel_manager() - .DestroyChannel(channel_owner->channel()->ChannelId()); - return -1; - } +int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) { + if (channel_owner->channel()->SetEngineInformation( + shared_->statistics(), *shared_->output_mixer(), + *shared_->transmit_mixer(), *shared_->process_thread(), + *shared_->audio_device(), voiceEngineObserverPtr_, + &callbackCritSect_) != 0) { + shared_->SetLastError( + VE_CHANNEL_NOT_CREATED, kTraceError, + "CreateChannel() failed to associate engine and channel." + " Destroying channel."); + shared_->channel_manager().DestroyChannel( + channel_owner->channel()->ChannelId()); + return -1; + } else if (channel_owner->channel()->Init() != 0) { + shared_->SetLastError( + VE_CHANNEL_NOT_CREATED, kTraceError, + "CreateChannel() failed to initialize channel. Destroying" + " channel."); + shared_->channel_manager().DestroyChannel( + channel_owner->channel()->ChannelId()); + return -1; + } - return channel_owner->channel()->ChannelId(); + return channel_owner->channel()->ChannelId(); } -int VoEBaseImpl::DeleteChannel(int channel) -{ - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) - { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; +int VoEBaseImpl::DeleteChannel(int channel) { + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; + } + + { + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); + voe::Channel* channelPtr = ch.channel(); + if (channelPtr == nullptr) { + shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, + "DeleteChannel() failed to locate channel"); + return -1; } + } - { - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); - voe::Channel* channelPtr = ch.channel(); - if (channelPtr == NULL) - { - _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, - "DeleteChannel() failed to locate channel"); - return -1; - } - } + shared_->channel_manager().DestroyChannel(channel); + if (StopSend() != 0) { + return -1; + } + if (StopPlayout() != 0) { + return -1; + } + return 0; +} - _shared->channel_manager().DestroyChannel(channel); +int VoEBaseImpl::StartReceive(int channel) { + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; + } + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); + voe::Channel* channelPtr = ch.channel(); + if (channelPtr == nullptr) { + shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, + "StartReceive() failed to locate channel"); + return -1; + } + return channelPtr->StartReceiving(); +} - if (StopSend() != 0) - { - return -1; - } - - if (StopPlayout() != 0) - { - return -1; - } +int VoEBaseImpl::StopReceive(int channel) { + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; + } + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); + voe::Channel* channelPtr = ch.channel(); + if (channelPtr == nullptr) { + shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, + "SetLocalReceiver() failed to locate channel"); + return -1; + } + return channelPtr->StopReceiving(); +} +int VoEBaseImpl::StartPlayout(int channel) { + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; + } + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); + voe::Channel* channelPtr = ch.channel(); + if (channelPtr == nullptr) { + shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, + "StartPlayout() failed to locate channel"); + return -1; + } + if (channelPtr->Playing()) { return 0; + } + if (StartPlayout() != 0) { + shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, + "StartPlayout() failed to start playout"); + return -1; + } + return channelPtr->StartPlayout(); } -int VoEBaseImpl::StartReceive(int channel) -{ - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) - { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; - } - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); - voe::Channel* channelPtr = ch.channel(); - if (channelPtr == NULL) - { - _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, - "StartReceive() failed to locate channel"); - return -1; - } - return channelPtr->StartReceiving(); +int VoEBaseImpl::StopPlayout(int channel) { + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; + } + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); + voe::Channel* channelPtr = ch.channel(); + if (channelPtr == nullptr) { + shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, + "StopPlayout() failed to locate channel"); + return -1; + } + if (channelPtr->StopPlayout() != 0) { + LOG_F(LS_WARNING) << "StopPlayout() failed to stop playout for channel " + << channel; + } + return StopPlayout(); } -int VoEBaseImpl::StopReceive(int channel) -{ - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) - { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; - } - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); - voe::Channel* channelPtr = ch.channel(); - if (channelPtr == NULL) - { - _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, - "SetLocalReceiver() failed to locate channel"); - return -1; - } - return channelPtr->StopReceiving(); +int VoEBaseImpl::StartSend(int channel) { + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; + } + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); + voe::Channel* channelPtr = ch.channel(); + if (channelPtr == nullptr) { + shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, + "StartSend() failed to locate channel"); + return -1; + } + if (channelPtr->Sending()) { + return 0; + } + if (StartSend() != 0) { + shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, + "StartSend() failed to start recording"); + return -1; + } + return channelPtr->StartSend(); } -int VoEBaseImpl::StartPlayout(int channel) -{ - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) - { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; - } - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); - voe::Channel* channelPtr = ch.channel(); - if (channelPtr == NULL) - { - _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, - "StartPlayout() failed to locate channel"); - return -1; - } - if (channelPtr->Playing()) - { - return 0; - } - if (StartPlayout() != 0) - { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, - "StartPlayout() failed to start playout"); - return -1; - } - return channelPtr->StartPlayout(); +int VoEBaseImpl::StopSend(int channel) { + CriticalSectionScoped cs(shared_->crit_sec()); + if (!shared_->statistics().Initialized()) { + shared_->SetLastError(VE_NOT_INITED, kTraceError); + return -1; + } + voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); + voe::Channel* channelPtr = ch.channel(); + if (channelPtr == nullptr) { + shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, + "StopSend() failed to locate channel"); + return -1; + } + if (channelPtr->StopSend() != 0) { + LOG_F(LS_WARNING) << "StopSend() failed to stop sending for channel " + << channel; + } + return StopSend(); } -int VoEBaseImpl::StopPlayout(int channel) -{ - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) - { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; - } - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); - voe::Channel* channelPtr = ch.channel(); - if (channelPtr == NULL) - { - _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, - "StopPlayout() failed to locate channel"); - return -1; - } - if (channelPtr->StopPlayout() != 0) - { - LOG_F(LS_WARNING) - << "StopPlayout() failed to stop playout for channel " << channel; - } - return StopPlayout(); -} +int VoEBaseImpl::GetVersion(char version[1024]) { + assert(kVoiceEngineVersionMaxMessageSize == 1024); -int VoEBaseImpl::StartSend(int channel) -{ - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) - { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; - } - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); - voe::Channel* channelPtr = ch.channel(); - if (channelPtr == NULL) - { - _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, - "StartSend() failed to locate channel"); - return -1; - } - if (channelPtr->Sending()) - { - return 0; - } - if (StartSend() != 0) - { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, - "StartSend() failed to start recording"); - return -1; - } - return channelPtr->StartSend(); -} + if (version == nullptr) { + shared_->SetLastError(VE_INVALID_ARGUMENT, kTraceError); + return (-1); + } -int VoEBaseImpl::StopSend(int channel) -{ - CriticalSectionScoped cs(_shared->crit_sec()); - if (!_shared->statistics().Initialized()) - { - _shared->SetLastError(VE_NOT_INITED, kTraceError); - return -1; - } - voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); - voe::Channel* channelPtr = ch.channel(); - if (channelPtr == NULL) - { - _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, - "StopSend() failed to locate channel"); - return -1; - } - if (channelPtr->StopSend() != 0) - { - LOG_F(LS_WARNING) - << "StopSend() failed to stop sending for channel " << channel; - } - return StopSend(); -} + char versionBuf[kVoiceEngineVersionMaxMessageSize]; + char* versionPtr = versionBuf; -int VoEBaseImpl::GetVersion(char version[1024]) -{ - assert(kVoiceEngineVersionMaxMessageSize == 1024); + int32_t len = 0; + int32_t accLen = 0; - if (version == NULL) - { - _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError); - return (-1); - } - - char versionBuf[kVoiceEngineVersionMaxMessageSize]; - char* versionPtr = versionBuf; - - int32_t len = 0; - int32_t accLen = 0; - - len = AddVoEVersion(versionPtr); - if (len == -1) - { - return -1; - } - versionPtr += len; - accLen += len; - assert(accLen < kVoiceEngineVersionMaxMessageSize); + len = AddVoEVersion(versionPtr); + if (len == -1) { + return -1; + } + versionPtr += len; + accLen += len; + assert(accLen < kVoiceEngineVersionMaxMessageSize); #ifdef WEBRTC_EXTERNAL_TRANSPORT - len = AddExternalTransportBuild(versionPtr); - if (len == -1) - { - return -1; - } - versionPtr += len; - accLen += len; - assert(accLen < kVoiceEngineVersionMaxMessageSize); + len = AddExternalTransportBuild(versionPtr); + if (len == -1) { + return -1; + } + versionPtr += len; + accLen += len; + assert(accLen < kVoiceEngineVersionMaxMessageSize); #endif - memcpy(version, versionBuf, accLen); - version[accLen] = '\0'; + memcpy(version, versionBuf, accLen); + version[accLen] = '\0'; - // to avoid the truncation in the trace, split the string into parts - char partOfVersion[256]; - for (int partStart = 0; partStart < accLen;) - { - memset(partOfVersion, 0, sizeof(partOfVersion)); - int partEnd = partStart + 180; - while (version[partEnd] != '\n' && version[partEnd] != '\0') - { - partEnd--; - } - if (partEnd < accLen) - { - memcpy(partOfVersion, &version[partStart], partEnd - partStart); - } - else - { - memcpy(partOfVersion, &version[partStart], accLen - partStart); - } - partStart = partEnd; + // to avoid the truncation in the trace, split the string into parts + char partOfVersion[256]; + for (int partStart = 0; partStart < accLen;) { + memset(partOfVersion, 0, sizeof(partOfVersion)); + int partEnd = partStart + 180; + while (version[partEnd] != '\n' && version[partEnd] != '\0') { + partEnd--; } + if (partEnd < accLen) { + memcpy(partOfVersion, &version[partStart], partEnd - partStart); + } else { + memcpy(partOfVersion, &version[partStart], accLen - partStart); + } + partStart = partEnd; + } - return 0; + return 0; } -int32_t VoEBaseImpl::AddVoEVersion(char* str) const -{ - return sprintf(str, "VoiceEngine 4.1.0\n"); +int32_t VoEBaseImpl::AddVoEVersion(char* str) const { + return sprintf(str, "VoiceEngine 4.1.0\n"); } #ifdef WEBRTC_EXTERNAL_TRANSPORT -int32_t VoEBaseImpl::AddExternalTransportBuild(char* str) const -{ - return sprintf(str, "External transport build\n"); +int32_t VoEBaseImpl::AddExternalTransportBuild(char* str) const { + return sprintf(str, "External transport build\n"); } #endif -int VoEBaseImpl::LastError() -{ - return (_shared->statistics().LastError()); -} +int VoEBaseImpl::LastError() { return (shared_->statistics().LastError()); } -int32_t VoEBaseImpl::StartPlayout() -{ - if (_shared->audio_device()->Playing()) - { - return 0; - } - if (!_shared->ext_playout()) - { - if (_shared->audio_device()->InitPlayout() != 0) - { - LOG_F(LS_ERROR) << "Failed to initialize playout"; - return -1; - } - if (_shared->audio_device()->StartPlayout() != 0) - { - LOG_F(LS_ERROR) << "Failed to start playout"; - return -1; - } - } +int32_t VoEBaseImpl::StartPlayout() { + if (shared_->audio_device()->Playing()) { return 0; + } + if (!shared_->ext_playout()) { + if (shared_->audio_device()->InitPlayout() != 0) { + LOG_F(LS_ERROR) << "Failed to initialize playout"; + return -1; + } + if (shared_->audio_device()->StartPlayout() != 0) { + LOG_F(LS_ERROR) << "Failed to start playout"; + return -1; + } + } + return 0; } int32_t VoEBaseImpl::StopPlayout() { // Stop audio-device playing if no channel is playing out - if (_shared->NumOfPlayingChannels() == 0) { - if (_shared->audio_device()->StopPlayout() != 0) { - _shared->SetLastError(VE_CANNOT_STOP_PLAYOUT, - kTraceError, + if (shared_->NumOfPlayingChannels() == 0) { + if (shared_->audio_device()->StopPlayout() != 0) { + shared_->SetLastError(VE_CANNOT_STOP_PLAYOUT, kTraceError, "StopPlayout() failed to stop playout"); return -1; } @@ -777,112 +661,92 @@ int32_t VoEBaseImpl::StopPlayout() { return 0; } -int32_t VoEBaseImpl::StartSend() -{ - if (_shared->audio_device()->Recording()) - { - return 0; - } - if (!_shared->ext_recording()) - { - if (_shared->audio_device()->InitRecording() != 0) - { - LOG_F(LS_ERROR) << "Failed to initialize recording"; - return -1; - } - if (_shared->audio_device()->StartRecording() != 0) - { - LOG_F(LS_ERROR) << "Failed to start recording"; - return -1; - } - } - +int32_t VoEBaseImpl::StartSend() { + if (shared_->audio_device()->Recording()) { return 0; + } + if (!shared_->ext_recording()) { + if (shared_->audio_device()->InitRecording() != 0) { + LOG_F(LS_ERROR) << "Failed to initialize recording"; + return -1; + } + if (shared_->audio_device()->StartRecording() != 0) { + LOG_F(LS_ERROR) << "Failed to start recording"; + return -1; + } + } + + return 0; } -int32_t VoEBaseImpl::StopSend() -{ - if (_shared->NumOfSendingChannels() == 0 && - !_shared->transmit_mixer()->IsRecordingMic()) - { - // Stop audio-device recording if no channel is recording - if (_shared->audio_device()->StopRecording() != 0) - { - _shared->SetLastError(VE_CANNOT_STOP_RECORDING, kTraceError, - "StopSend() failed to stop recording"); - return -1; - } - _shared->transmit_mixer()->StopSend(); +int32_t VoEBaseImpl::StopSend() { + if (shared_->NumOfSendingChannels() == 0 && + !shared_->transmit_mixer()->IsRecordingMic()) { + // Stop audio-device recording if no channel is recording + if (shared_->audio_device()->StopRecording() != 0) { + shared_->SetLastError(VE_CANNOT_STOP_RECORDING, kTraceError, + "StopSend() failed to stop recording"); + return -1; } + shared_->transmit_mixer()->StopSend(); + } - return 0; + return 0; } -int32_t VoEBaseImpl::TerminateInternal() -{ - // Delete any remaining channel objects - _shared->channel_manager().DestroyAllChannels(); +int32_t VoEBaseImpl::TerminateInternal() { + // Delete any remaining channel objects + shared_->channel_manager().DestroyAllChannels(); - if (_shared->process_thread()) - { - if (_shared->audio_device()) - { - _shared->process_thread()->DeRegisterModule( - _shared->audio_device()); - } - _shared->process_thread()->Stop(); + if (shared_->process_thread()) { + if (shared_->audio_device()) { + shared_->process_thread()->DeRegisterModule(shared_->audio_device()); } + shared_->process_thread()->Stop(); + } - if (_shared->audio_device()) - { - if (_shared->audio_device()->StopPlayout() != 0) - { - _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, - "TerminateInternal() failed to stop playout"); - } - if (_shared->audio_device()->StopRecording() != 0) - { - _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, - "TerminateInternal() failed to stop recording"); - } - if (_shared->audio_device()->RegisterEventObserver(NULL) != 0) { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, - "TerminateInternal() failed to de-register event observer " - "for the ADM"); - } - if (_shared->audio_device()->RegisterAudioCallback(NULL) != 0) { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, - "TerminateInternal() failed to de-register audio callback " - "for the ADM"); - } - if (_shared->audio_device()->Terminate() != 0) - { - _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, - "TerminateInternal() failed to terminate the ADM"); - } - _shared->set_audio_device(NULL); + if (shared_->audio_device()) { + if (shared_->audio_device()->StopPlayout() != 0) { + shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, + "TerminateInternal() failed to stop playout"); } - - if (_shared->audio_processing()) { - _shared->set_audio_processing(NULL); + if (shared_->audio_device()->StopRecording() != 0) { + shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, + "TerminateInternal() failed to stop recording"); } + if (shared_->audio_device()->RegisterEventObserver(nullptr) != 0) { + shared_->SetLastError( + VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, + "TerminateInternal() failed to de-register event observer " + "for the ADM"); + } + if (shared_->audio_device()->RegisterAudioCallback(nullptr) != 0) { + shared_->SetLastError( + VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, + "TerminateInternal() failed to de-register audio callback " + "for the ADM"); + } + if (shared_->audio_device()->Terminate() != 0) { + shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, + "TerminateInternal() failed to terminate the ADM"); + } + shared_->set_audio_device(nullptr); + } - return _shared->statistics().SetUnInitialized(); + if (shared_->audio_processing()) { + shared_->set_audio_processing(nullptr); + } + + return shared_->statistics().SetUnInitialized(); } int VoEBaseImpl::ProcessRecordedDataWithAPM( - const int voe_channels[], - int number_of_voe_channels, - const void* audio_data, - uint32_t sample_rate, - uint8_t number_of_channels, - uint32_t number_of_frames, - uint32_t audio_delay_milliseconds, - int32_t clock_drift, - uint32_t volume, - bool key_pressed) { - assert(_shared->transmit_mixer() != nullptr); - assert(_shared->audio_device() != nullptr); + const int voe_channels[], int number_of_voe_channels, + const void* audio_data, uint32_t sample_rate, uint8_t number_of_channels, + uint32_t number_of_frames, uint32_t audio_delay_milliseconds, + int32_t clock_drift, uint32_t volume, bool key_pressed) { + assert(shared_->transmit_mixer() != nullptr); + assert(shared_->audio_device() != nullptr); uint32_t max_volume = 0; uint16_t voe_mic_level = 0; @@ -890,11 +754,11 @@ int VoEBaseImpl::ProcessRecordedDataWithAPM( // indicate no volume is available. if (volume != 0) { // Scale from ADM to VoE level range - if (_shared->audio_device()->MaxMicrophoneVolume(&max_volume) == 0) { + if (shared_->audio_device()->MaxMicrophoneVolume(&max_volume) == 0) { if (max_volume) { voe_mic_level = static_cast( - (volume * kMaxVolumeLevel + - static_cast(max_volume / 2)) / max_volume); + (volume * kMaxVolumeLevel + static_cast(max_volume / 2)) / + max_volume); } } // We learned that on certain systems (e.g Linux) the voe_mic_level @@ -910,7 +774,7 @@ int VoEBaseImpl::ProcessRecordedDataWithAPM( // Perform channel-independent operations // (APM, mix with file, record to file, mute, etc.) - _shared->transmit_mixer()->PrepareDemux( + shared_->transmit_mixer()->PrepareDemux( audio_data, number_of_frames, number_of_channels, sample_rate, static_cast(audio_delay_milliseconds), clock_drift, voe_mic_level, key_pressed); @@ -921,23 +785,22 @@ int VoEBaseImpl::ProcessRecordedDataWithAPM( // do the operations on all the existing VoE channels; otherwise the // operations will be done on specific channels. if (number_of_voe_channels == 0) { - _shared->transmit_mixer()->DemuxAndMix(); - _shared->transmit_mixer()->EncodeAndSend(); + shared_->transmit_mixer()->DemuxAndMix(); + shared_->transmit_mixer()->EncodeAndSend(); } else { - _shared->transmit_mixer()->DemuxAndMix(voe_channels, + shared_->transmit_mixer()->DemuxAndMix(voe_channels, number_of_voe_channels); - _shared->transmit_mixer()->EncodeAndSend(voe_channels, + shared_->transmit_mixer()->EncodeAndSend(voe_channels, number_of_voe_channels); } // Scale from VoE to ADM level range. - uint32_t new_voe_mic_level = _shared->transmit_mixer()->CaptureLevel(); - + uint32_t new_voe_mic_level = shared_->transmit_mixer()->CaptureLevel(); if (new_voe_mic_level != voe_mic_level) { // Return the new volume if AGC has changed the volume. - return static_cast( - (new_voe_mic_level * max_volume + - static_cast(kMaxVolumeLevel / 2)) / kMaxVolumeLevel); + return static_cast((new_voe_mic_level * max_volume + + static_cast(kMaxVolumeLevel / 2)) / + kMaxVolumeLevel); } // Return 0 to indicate no change on the volume. @@ -946,32 +809,31 @@ int VoEBaseImpl::ProcessRecordedDataWithAPM( void VoEBaseImpl::GetPlayoutData(int sample_rate, int number_of_channels, int number_of_frames, bool feed_data_to_apm, - void* audio_data, - int64_t* elapsed_time_ms, + void* audio_data, int64_t* elapsed_time_ms, int64_t* ntp_time_ms) { - assert(_shared->output_mixer() != nullptr); + assert(shared_->output_mixer() != nullptr); // TODO(andrew): if the device is running in mono, we should tell the mixer // here so that it will only request mono from AudioCodingModule. // Perform mixing of all active participants (channel-based mixing) - _shared->output_mixer()->MixActiveChannels(); + shared_->output_mixer()->MixActiveChannels(); // Additional operations on the combined signal - _shared->output_mixer()->DoOperationsOnCombinedSignal(feed_data_to_apm); + shared_->output_mixer()->DoOperationsOnCombinedSignal(feed_data_to_apm); // Retrieve the final output mix (resampled to match the ADM) - _shared->output_mixer()->GetMixedAudio(sample_rate, number_of_channels, - &_audioFrame); + shared_->output_mixer()->GetMixedAudio(sample_rate, number_of_channels, + &audioFrame_); - assert(number_of_frames == _audioFrame.samples_per_channel_); - assert(sample_rate == _audioFrame.sample_rate_hz_); + assert(number_of_frames == audioFrame_.samples_per_channel_); + assert(sample_rate == audioFrame_.sample_rate_hz_); // Deliver audio (PCM) samples to the ADM - memcpy(audio_data, _audioFrame.data_, + memcpy(audio_data, audioFrame_.data_, sizeof(int16_t) * number_of_frames * number_of_channels); - *elapsed_time_ms = _audioFrame.elapsed_time_ms_; - *ntp_time_ms = _audioFrame.ntp_time_ms_; + *elapsed_time_ms = audioFrame_.elapsed_time_ms_; + *ntp_time_ms = audioFrame_.ntp_time_ms_; } } // namespace webrtc diff --git a/webrtc/voice_engine/voe_base_impl.h b/webrtc/voice_engine/voe_base_impl.h index de6b44b42e..5ab2773946 100644 --- a/webrtc/voice_engine/voe_base_impl.h +++ b/webrtc/voice_engine/voe_base_impl.h @@ -16,149 +16,114 @@ #include "webrtc/modules/interface/module_common_types.h" #include "webrtc/voice_engine/shared_data.h" -namespace webrtc -{ +namespace webrtc { class ProcessThread; -class VoEBaseImpl: public VoEBase, - public AudioTransport, - public AudioDeviceObserver -{ -public: - virtual int RegisterVoiceEngineObserver(VoiceEngineObserver& observer); +class VoEBaseImpl : public VoEBase, + public AudioTransport, + public AudioDeviceObserver { + public: + int RegisterVoiceEngineObserver(VoiceEngineObserver& observer) override; + int DeRegisterVoiceEngineObserver() override; - virtual int DeRegisterVoiceEngineObserver(); + int Init(AudioDeviceModule* external_adm = nullptr, + AudioProcessing* audioproc = nullptr) override; + AudioProcessing* audio_processing() override { + return shared_->audio_processing(); + } + int Terminate() override; - virtual int Init(AudioDeviceModule* external_adm = NULL, - AudioProcessing* audioproc = NULL); - virtual AudioProcessing* audio_processing() { - return _shared->audio_processing(); - } + int CreateChannel() override; + int CreateChannel(const Config& config) override; + int DeleteChannel(int channel) override; - virtual int Terminate(); + int StartReceive(int channel) override; + int StartPlayout(int channel) override; + int StartSend(int channel) override; + int StopReceive(int channel) override; + int StopPlayout(int channel) override; + int StopSend(int channel) override; - virtual int CreateChannel(); - virtual int CreateChannel(const Config& config); + int GetVersion(char version[1024]) override; - virtual int DeleteChannel(int channel); + int LastError() override; - virtual int StartReceive(int channel); + AudioTransport* audio_transport() override { return this; } - virtual int StartPlayout(int channel); + // AudioTransport + int32_t RecordedDataIsAvailable(const void* audioSamples, uint32_t nSamples, + uint8_t nBytesPerSample, uint8_t nChannels, + uint32_t samplesPerSec, uint32_t totalDelayMS, + int32_t clockDrift, uint32_t micLevel, + bool keyPressed, + uint32_t& newMicLevel) override; + int32_t NeedMorePlayData(uint32_t nSamples, uint8_t nBytesPerSample, + uint8_t nChannels, uint32_t samplesPerSec, + void* audioSamples, uint32_t& nSamplesOut, + int64_t* elapsed_time_ms, + int64_t* ntp_time_ms) override; + int OnDataAvailable(const int voe_channels[], int number_of_voe_channels, + const int16_t* audio_data, int sample_rate, + int number_of_channels, int number_of_frames, + int audio_delay_milliseconds, int volume, + bool key_pressed, bool need_audio_processing) override; + void OnData(int voe_channel, const void* audio_data, int bits_per_sample, + int sample_rate, int number_of_channels, + int number_of_frames) override; + void PushCaptureData(int voe_channel, const void* audio_data, + int bits_per_sample, int sample_rate, + int number_of_channels, int number_of_frames) override; + void PullRenderData(int bits_per_sample, int sample_rate, + int number_of_channels, int number_of_frames, + void* audio_data, int64_t* elapsed_time_ms, + int64_t* ntp_time_ms) override; - virtual int StartSend(int channel); + // AudioDeviceObserver + void OnErrorIsReported(ErrorCode error) override; + void OnWarningIsReported(WarningCode warning) override; - virtual int StopReceive(int channel); + protected: + VoEBaseImpl(voe::SharedData* shared); + ~VoEBaseImpl() override; - virtual int StopPlayout(int channel); + private: + int32_t StartPlayout(); + int32_t StopPlayout(); + int32_t StartSend(); + int32_t StopSend(); + int32_t TerminateInternal(); - virtual int StopSend(int channel); + // Helper function to process the recorded data with AudioProcessing Module, + // demultiplex the data to specific voe channels, encode and send to the + // network. When |number_of_VoE_channels| is 0, it will demultiplex the + // data to all the existing VoE channels. + // It returns new AGC microphone volume or 0 if no volume changes + // should be done. + int ProcessRecordedDataWithAPM( + const int voe_channels[], int number_of_voe_channels, + const void* audio_data, uint32_t sample_rate, uint8_t number_of_channels, + uint32_t number_of_frames, uint32_t audio_delay_milliseconds, + int32_t clock_drift, uint32_t volume, bool key_pressed); - virtual int GetVersion(char version[1024]); + void GetPlayoutData(int sample_rate, int number_of_channels, + int number_of_frames, bool feed_data_to_apm, + void* audio_data, int64_t* elapsed_time_ms, + int64_t* ntp_time_ms); - virtual int LastError(); + int32_t AddVoEVersion(char* str) const; - virtual AudioTransport* audio_transport() { return this; } - - // AudioTransport - virtual int32_t - RecordedDataIsAvailable(const void* audioSamples, - uint32_t nSamples, - uint8_t nBytesPerSample, - uint8_t nChannels, - uint32_t samplesPerSec, - uint32_t totalDelayMS, - int32_t clockDrift, - uint32_t micLevel, - bool keyPressed, - uint32_t& newMicLevel); - - virtual int32_t NeedMorePlayData(uint32_t nSamples, - uint8_t nBytesPerSample, - uint8_t nChannels, - uint32_t samplesPerSec, - void* audioSamples, - uint32_t& nSamplesOut, - int64_t* elapsed_time_ms, - int64_t* ntp_time_ms); - - virtual int OnDataAvailable(const int voe_channels[], - int number_of_voe_channels, - const int16_t* audio_data, - int sample_rate, - int number_of_channels, - int number_of_frames, - int audio_delay_milliseconds, - int volume, - bool key_pressed, - bool need_audio_processing); - - virtual void OnData(int voe_channel, const void* audio_data, - int bits_per_sample, int sample_rate, - int number_of_channels, int number_of_frames); - - virtual void PushCaptureData(int voe_channel, const void* audio_data, - int bits_per_sample, int sample_rate, - int number_of_channels, int number_of_frames); - - virtual void PullRenderData(int bits_per_sample, int sample_rate, - int number_of_channels, int number_of_frames, - void* audio_data, - int64_t* elapsed_time_ms, - int64_t* ntp_time_ms); - - // AudioDeviceObserver - virtual void OnErrorIsReported(ErrorCode error); - virtual void OnWarningIsReported(WarningCode warning); - -protected: - VoEBaseImpl(voe::SharedData* shared); - virtual ~VoEBaseImpl(); - -private: - int32_t StartPlayout(); - int32_t StopPlayout(); - int32_t StartSend(); - int32_t StopSend(); - int32_t TerminateInternal(); - - // Helper function to process the recorded data with AudioProcessing Module, - // demultiplex the data to specific voe channels, encode and send to the - // network. When |number_of_VoE_channels| is 0, it will demultiplex the - // data to all the existing VoE channels. - // It returns new AGC microphone volume or 0 if no volume changes - // should be done. - int ProcessRecordedDataWithAPM(const int voe_channels[], - int number_of_voe_channels, - const void* audio_data, - uint32_t sample_rate, - uint8_t number_of_channels, - uint32_t number_of_frames, - uint32_t audio_delay_milliseconds, - int32_t clock_drift, - uint32_t volume, - bool key_pressed); - - void GetPlayoutData(int sample_rate, int number_of_channels, - int number_of_frames, bool feed_data_to_apm, - void* audio_data, - int64_t* elapsed_time_ms, - int64_t* ntp_time_ms); - - int32_t AddVoEVersion(char* str) const; - - // Initialize channel by setting Engine Information then initializing - // channel. - int InitializeChannel(voe::ChannelOwner* channel_owner); + // Initialize channel by setting Engine Information then initializing + // channel. + int InitializeChannel(voe::ChannelOwner* channel_owner); #ifdef WEBRTC_EXTERNAL_TRANSPORT - int32_t AddExternalTransportBuild(char* str) const; + int32_t AddExternalTransportBuild(char* str) const; #endif - VoiceEngineObserver* _voiceEngineObserverPtr; - CriticalSectionWrapper& _callbackCritSect; + VoiceEngineObserver* voiceEngineObserverPtr_; + CriticalSectionWrapper& callbackCritSect_; - AudioFrame _audioFrame; - voe::SharedData* _shared; + AudioFrame audioFrame_; + voe::SharedData* shared_; }; } // namespace webrtc