Index: webrtc/tools/agc/agc_manager.cc |
diff --git a/webrtc/tools/agc/agc_manager.cc b/webrtc/tools/agc/agc_manager.cc |
deleted file mode 100644 |
index 36290f713cf2c6d11cf71f3de99fd10da6262aa5..0000000000000000000000000000000000000000 |
--- a/webrtc/tools/agc/agc_manager.cc |
+++ /dev/null |
@@ -1,255 +0,0 @@ |
-/* |
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#include "webrtc/tools/agc/agc_manager.h" |
- |
-#include <assert.h> |
- |
-#include "webrtc/modules/audio_processing/agc/agc.h" |
-#include "webrtc/modules/audio_processing/include/audio_processing.h" |
-#include "webrtc/modules/interface/module_common_types.h" |
-#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
-#include "webrtc/system_wrappers/interface/logging.h" |
-#include "webrtc/voice_engine/include/voe_external_media.h" |
-#include "webrtc/voice_engine/include/voe_volume_control.h" |
- |
-namespace webrtc { |
- |
-class AgcManagerVolume : public VolumeCallbacks { |
- public: |
- // AgcManagerVolume acquires ownership of |volume|. |
- explicit AgcManagerVolume(VoEVolumeControl* volume) |
- : volume_(volume) { |
- } |
- |
- ~AgcManagerVolume() { |
- if (volume_) { |
- volume_->Release(); |
- } |
- } |
- |
- virtual void SetMicVolume(int volume) { |
- if (volume_->SetMicVolume(volume) != 0) { |
- LOG_FERR1(LS_WARNING, SetMicVolume, volume); |
- } |
- } |
- |
- int GetMicVolume() { |
- unsigned int volume = 0; |
- if (volume_->GetMicVolume(volume) != 0) { |
- LOG_FERR0(LS_WARNING, GetMicVolume); |
- return -1; |
- } |
- return volume; |
- } |
- |
- private: |
- VoEVolumeControl* volume_; |
-}; |
- |
-class MediaCallback : public VoEMediaProcess { |
- public: |
- MediaCallback(AgcManagerDirect* direct, AudioProcessing* audioproc, |
- CriticalSectionWrapper* crit) |
- : direct_(direct), |
- audioproc_(audioproc), |
- crit_(crit), |
- frame_() { |
- } |
- |
- protected: |
- virtual void Process(const int channel, const ProcessingTypes type, |
- int16_t audio[], const size_t samples_per_channel, |
- const int sample_rate_hz, const bool is_stereo) { |
- CriticalSectionScoped cs(crit_); |
- if (direct_->capture_muted()) { |
- return; |
- } |
- |
- // Extract the first channel. |
- const int kMaxSampleRateHz = 48000; |
- const int kMaxSamplesPerChannel = kMaxSampleRateHz / 100; |
- assert(samples_per_channel < kMaxSamplesPerChannel && |
- sample_rate_hz < kMaxSampleRateHz); |
- int16_t mono[kMaxSamplesPerChannel]; |
- int16_t* mono_ptr = audio; |
- if (is_stereo) { |
- for (size_t n = 0; n < samples_per_channel; n++) { |
- mono[n] = audio[n * 2]; |
- } |
- mono_ptr = mono; |
- } |
- |
- direct_->Process(mono_ptr, samples_per_channel, sample_rate_hz); |
- |
- // TODO(ajm): It's unfortunate we have to memcpy to this frame here, but |
- // it's needed for use with AudioProcessing. |
- frame_.num_channels_ = is_stereo ? 2 : 1; |
- frame_.samples_per_channel_ = samples_per_channel; |
- frame_.sample_rate_hz_ = sample_rate_hz; |
- const size_t length_samples = frame_.num_channels_ * samples_per_channel; |
- memcpy(frame_.data_, audio, length_samples * sizeof(int16_t)); |
- |
- // Apply compression to the audio. |
- if (audioproc_->ProcessStream(&frame_) != 0) { |
- LOG_FERR0(LS_ERROR, ProcessStream); |
- } |
- |
- // Copy the compressed audio back to voice engine's array. |
- memcpy(audio, frame_.data_, length_samples * sizeof(int16_t)); |
- } |
- |
- private: |
- AgcManagerDirect* direct_; |
- AudioProcessing* audioproc_; |
- CriticalSectionWrapper* crit_; |
- AudioFrame frame_; |
-}; |
- |
-class PreprocCallback : public VoEMediaProcess { |
- public: |
- PreprocCallback(AgcManagerDirect* direct, CriticalSectionWrapper* crit) |
- : direct_(direct), |
- crit_(crit) { |
- } |
- |
- protected: |
- virtual void Process(const int channel, const ProcessingTypes type, |
- int16_t audio[], const size_t samples_per_channel, |
- const int sample_rate_hz, const bool is_stereo) { |
- CriticalSectionScoped cs(crit_); |
- if (direct_->capture_muted()) { |
- return; |
- } |
- direct_->AnalyzePreProcess(audio, is_stereo ? 2 : 1, samples_per_channel); |
- } |
- |
- private: |
- AgcManagerDirect* direct_; |
- CriticalSectionWrapper* crit_; |
-}; |
- |
-AgcManager::AgcManager(VoiceEngine* voe) |
- : media_(VoEExternalMedia::GetInterface(voe)), |
- volume_callbacks_(new AgcManagerVolume(VoEVolumeControl::GetInterface( |
- voe))), |
- crit_(CriticalSectionWrapper::CreateCriticalSection()), |
- enabled_(false), |
- initialized_(false) { |
- Config config; |
- config.Set<ExperimentalAgc>(new ExperimentalAgc(false)); |
- audioproc_.reset(AudioProcessing::Create(config)); |
- direct_.reset(new AgcManagerDirect(audioproc_->gain_control(), |
- volume_callbacks_.get(), |
- kAgcStartupMinVolume)); |
- media_callback_.reset(new MediaCallback(direct_.get(), |
- audioproc_.get(), |
- crit_.get())); |
- preproc_callback_.reset(new PreprocCallback(direct_.get(), crit_.get())); |
-} |
- |
-AgcManager::AgcManager(VoEExternalMedia* media, |
- VoEVolumeControl* volume, |
- Agc* agc, |
- AudioProcessing* audioproc) |
- : media_(media), |
- volume_callbacks_(new AgcManagerVolume(volume)), |
- crit_(CriticalSectionWrapper::CreateCriticalSection()), |
- audioproc_(audioproc), |
- direct_(new AgcManagerDirect(agc, |
- audioproc_->gain_control(), |
- volume_callbacks_.get(), |
- kAgcStartupMinVolume)), |
- media_callback_( |
- new MediaCallback(direct_.get(), audioproc_.get(), crit_.get())), |
- preproc_callback_(new PreprocCallback(direct_.get(), crit_.get())), |
- enabled_(false), |
- initialized_(false) { |
-} |
- |
-AgcManager::AgcManager() |
- : media_(NULL), |
- enabled_(false), |
- initialized_(false) { |
-} |
- |
-AgcManager::~AgcManager() { |
- if (media_) { |
- if (enabled_) { |
- DeregisterCallbacks(); |
- } |
- media_->Release(); |
- } |
-} |
- |
-int AgcManager::Enable(bool enable) { |
- if (enable == enabled_) { |
- return 0; |
- } |
- if (!initialized_) { |
- CriticalSectionScoped cs(crit_.get()); |
- if (audioproc_->gain_control()->Enable(true) != 0) { |
- LOG_FERR1(LS_ERROR, gain_control()->Enable, true); |
- return -1; |
- } |
- if (direct_->Initialize() != 0) { |
- assert(false); |
- return -1; |
- } |
- initialized_ = true; |
- } |
- |
- if (enable) { |
- if (media_->RegisterExternalMediaProcessing(0, kRecordingAllChannelsMixed, |
- *media_callback_) != 0) { |
- LOG(LS_ERROR) << "Failed to register postproc callback"; |
- return -1; |
- } |
- if (media_->RegisterExternalMediaProcessing(0, kRecordingPreprocessing, |
- *preproc_callback_) != 0) { |
- LOG(LS_ERROR) << "Failed to register preproc callback"; |
- return -1; |
- } |
- } else { |
- if (DeregisterCallbacks() != 0) |
- return -1; |
- } |
- enabled_ = enable; |
- return 0; |
-} |
- |
-void AgcManager::CaptureDeviceChanged() { |
- CriticalSectionScoped cs(crit_.get()); |
- direct_->Initialize(); |
-} |
- |
-void AgcManager::SetCaptureMuted(bool muted) { |
- CriticalSectionScoped cs(crit_.get()); |
- direct_->SetCaptureMuted(muted); |
-} |
- |
-int AgcManager::DeregisterCallbacks() { |
- // DeRegister shares a lock with the Process() callback. This call will block |
- // until the callback is finished and it's safe to continue teardown. |
- int err = 0; |
- if (media_->DeRegisterExternalMediaProcessing(0, |
- kRecordingAllChannelsMixed) != 0) { |
- LOG(LS_ERROR) << "Failed to deregister postproc callback"; |
- err = -1; |
- } |
- if (media_->DeRegisterExternalMediaProcessing(0, |
- kRecordingPreprocessing) != 0) { |
- LOG(LS_ERROR) << "Failed to deregister preproc callback"; |
- err = -1; |
- } |
- return err; |
-} |
- |
-} // namespace webrtc |