Removes usage of AGC APIs in the ADM.

Bug: webrtc:8598
Change-Id: I5ebc2e3549eba039797e40d2f8aea48341f3fe46
Reviewed-on: https://webrtc-review.googlesource.com/31520
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Commit-Queue: Henrik Andreassson <henrika@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21254}
This commit is contained in:
henrika 2017-12-13 14:08:48 +01:00 committed by Commit Bot
parent d235d52d1d
commit e26456a4ed
29 changed files with 11 additions and 431 deletions

View File

@ -64,10 +64,8 @@ void SetAgcConfig(AudioProcessing* apm,
}
void SetAgcStatus(AudioProcessing* apm,
AudioDeviceModule* adm,
bool enable) {
RTC_DCHECK(apm);
RTC_DCHECK(adm);
#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
GainControl::Mode agc_mode = GainControl::kFixedDigital;
#else
@ -82,11 +80,6 @@ void SetAgcStatus(AudioProcessing* apm,
RTC_LOG(LS_ERROR) << "Failed to enable/disable AGC: " << enable;
return;
}
// Set AGC state in the ADM when adaptive AGC mode has been selected.
if (adm->SetAGC(enable && agc_mode == GainControl::kAdaptiveAnalog) != 0) {
RTC_LOG(LS_ERROR) << "Failed to set AGC mode in ADM: " << enable;
return;
}
RTC_LOG(LS_INFO) << "AGC set to " << enable << " with mode " << agc_mode;
}

View File

@ -16,7 +16,6 @@
namespace webrtc {
class AudioProcessing;
class AudioDeviceModule;
enum EcModes {
kEcConference, // Conferencing default (aggressive AEC).
@ -36,7 +35,6 @@ AgcConfig GetAgcConfig(AudioProcessing* apm);
void SetAgcConfig(AudioProcessing* apm,
const AgcConfig& config);
void SetAgcStatus(AudioProcessing* apm,
AudioDeviceModule* adm,
bool enable);
void SetEcStatus(AudioProcessing* apm,
bool enable,

View File

@ -39,10 +39,6 @@ struct TestHelper {
const AudioProcessing* apm() const { return apm_.get(); }
test::MockAudioDeviceModule* adm() {
return &mock_audio_device_;
}
voe::TransmitMixer* transmit_mixer() {
return voe_wrapper_.base()->transmit_mixer();
}
@ -117,21 +113,18 @@ TEST(ApmHelpersTest, AgcStatus_EnableDisable) {
TestHelper helper;
GainControl* gc = helper.apm()->gain_control();
#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), false);
apm_helpers::SetAgcStatus(helper.apm(), false);
EXPECT_FALSE(gc->is_enabled());
EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), true);
apm_helpers::SetAgcStatus(helper.apm(), true);
EXPECT_TRUE(gc->is_enabled());
EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
#else
EXPECT_CALL(*helper.adm(), SetAGC(false)).WillOnce(testing::Return(0));
apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), false);
apm_helpers::SetAgcStatus(helper.apm(), false);
EXPECT_FALSE(gc->is_enabled());
EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
EXPECT_CALL(*helper.adm(), SetAGC(true)).WillOnce(testing::Return(0));
apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), true);
apm_helpers::SetAgcStatus(helper.apm(), true);
EXPECT_TRUE(gc->is_enabled());
EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
#endif

View File

@ -485,7 +485,7 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
<< "Disabling AGC since built-in AGC will be used instead";
}
}
webrtc::apm_helpers::SetAgcStatus(apm(), adm(), *options.auto_gain_control);
webrtc::apm_helpers::SetAgcStatus(apm(), *options.auto_gain_control);
}
if (options.tx_agc_target_dbov || options.tx_agc_digital_compression_gain ||

View File

@ -124,7 +124,6 @@ void AdmSetupExpectations(webrtc::test::MockAudioDeviceModule* adm) {
EXPECT_CALL(*adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
EXPECT_CALL(*adm, SetAGC(true)).WillOnce(Return(0));
// Teardown.
EXPECT_CALL(*adm, StopPlayout()).WillOnce(Return(0));
@ -2221,7 +2220,6 @@ TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
EXPECT_CALL(adm_, BuiltInAGCIsAvailable())
.Times(1)
.WillRepeatedly(Return(false));
EXPECT_CALL(adm_, SetAGC(true)).Times(1).WillRepeatedly(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).Times(1).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, Enable(true)).Times(1).WillOnce(Return(0));
send_parameters_.options.tx_agc_target_dbov = 3;
@ -2768,7 +2766,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
SetSendParameters(send_parameters_);
// Turn off AGC
EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2777,7 +2774,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
SetSendParameters(send_parameters_);
// Turn AGC back on
EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2786,7 +2782,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
SetSendParameters(send_parameters_);
// Turn off other options (and stereo swapping on).
EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2803,7 +2798,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
EXPECT_FALSE(IsHighPassFilterEnabled());
// Set options again to ensure it has no impact.
EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2856,7 +2850,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
parameters_options_all.options.echo_cancellation = true;
parameters_options_all.options.auto_gain_control = true;
parameters_options_all.options.noise_suppression = true;
EXPECT_CALL(adm_, SetAGC(true)).Times(2).WillRepeatedly(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).Times(2).WillRepeatedly(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).Times(2).WillRepeatedly(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).Times(2).WillOnce(Return(0));
@ -2871,7 +2864,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
// unset NS
cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
parameters_options_no_ns.options.noise_suppression = false;
EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2888,7 +2880,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
// unset AGC
cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
parameters_options_no_agc.options.auto_gain_control = false;
EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2901,7 +2892,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
expected_options.noise_suppression = true;
EXPECT_EQ(expected_options, channel2->options());
EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2910,7 +2900,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
EXPECT_CALL(apm_ns_, Enable(true)).WillOnce(Return(0));
EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2919,7 +2908,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
EXPECT_CALL(apm_ns_, Enable(false)).WillOnce(Return(0));
channel1->SetSend(true);
EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));
@ -2933,7 +2921,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
send_parameters_;
parameters_options_no_agc_nor_ns.options.auto_gain_control = false;
parameters_options_no_agc_nor_ns.options.noise_suppression = false;
EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
EXPECT_CALL(apm_gc_, set_mode(kDefaultAgcMode)).WillOnce(Return(0));

View File

@ -215,18 +215,6 @@ class AudioDeviceTemplate : public AudioDeviceGeneric {
bool Recording() const override { return input_.Recording(); }
int32_t SetAGC(bool enable) override {
if (enable) {
FATAL() << "Should never be called";
}
return -1;
}
bool AGC() const override {
RTC_LOG(INFO) << __FUNCTION__;
return false;
}
int32_t InitSpeaker() override {
RTC_LOG(INFO) << __FUNCTION__;
return 0;

View File

@ -165,8 +165,6 @@ class ADMWrapper : public AudioDeviceModule, public AudioTransport {
int32_t StartRecording() override { return impl_->StartRecording(); }
int32_t StopRecording() override { return impl_->StopRecording(); }
bool Recording() const override { return impl_->Recording(); }
int32_t SetAGC(bool enable) override { return impl_->SetAGC(enable); }
bool AGC() const override { return impl_->AGC(); }
int32_t InitSpeaker() override { return impl_->InitSpeaker(); }
bool SpeakerIsInitialized() const override {
return impl_->SpeakerIsInitialized();

View File

@ -71,10 +71,6 @@ class AudioDeviceGeneric {
virtual int32_t StopRecording() = 0;
virtual bool Recording() const = 0;
// Microphone Automatic Gain Control (AGC)
virtual int32_t SetAGC(bool enable) = 0;
virtual bool AGC() const = 0;
// Audio mixer initialization
virtual int32_t InitSpeaker() = 0;
virtual bool SpeakerIsInitialized() const = 0;

View File

@ -568,18 +568,6 @@ int32_t AudioDeviceModuleImpl::StereoPlayout(bool* enabled) const {
return 0;
}
int32_t AudioDeviceModuleImpl::SetAGC(bool enable) {
RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
CHECKinitialized_();
return (audio_device_->SetAGC(enable));
}
bool AudioDeviceModuleImpl::AGC() const {
RTC_LOG(INFO) << __FUNCTION__;
CHECKinitialized__BOOL();
return audio_device_->AGC();
}
int32_t AudioDeviceModuleImpl::PlayoutIsAvailable(bool* available) {
RTC_LOG(INFO) << __FUNCTION__;
CHECKinitialized_();

View File

@ -87,10 +87,6 @@ class AudioDeviceModuleImpl : public AudioDeviceModule {
int32_t StopRecording() override;
bool Recording() const override;
// Microphone Automatic Gain Control (AGC)
int32_t SetAGC(bool enable) override;
bool AGC() const override;
// Audio mixer initialization
int32_t InitSpeaker() override;
bool SpeakerIsInitialized() const override;

View File

@ -496,8 +496,6 @@ class AudioDeviceTest : public ::testing::Test {
// See https://bugs.chromium.org/p/webrtc/issues/detail?id=7397 for
// details.
EXPECT_EQ(0, audio_device_->SetStereoRecording(false));
EXPECT_EQ(0, audio_device_->SetAGC(false));
EXPECT_FALSE(audio_device_->AGC());
}
}

View File

@ -79,10 +79,6 @@ int32_t AudioDeviceDummy::StopRecording() { return 0; }
bool AudioDeviceDummy::Recording() const { return false; }
int32_t AudioDeviceDummy::SetAGC(bool enable) { return -1; }
bool AudioDeviceDummy::AGC() const { return false; }
int32_t AudioDeviceDummy::InitSpeaker() { return -1; }
bool AudioDeviceDummy::SpeakerIsInitialized() const { return false; }

View File

@ -65,10 +65,6 @@ class AudioDeviceDummy : public AudioDeviceGeneric {
int32_t StopRecording() override;
bool Recording() const override;
// Microphone Automatic Gain Control (AGC)
int32_t SetAGC(bool enable) override;
bool AGC() const override;
// Audio mixer initialization
int32_t InitSpeaker() override;
bool SpeakerIsInitialized() const override;

View File

@ -310,14 +310,6 @@ bool FileAudioDevice::Recording() const {
return _recording;
}
int32_t FileAudioDevice::SetAGC(bool enable) {
return -1;
}
bool FileAudioDevice::AGC() const {
return false;
}
int32_t FileAudioDevice::InitSpeaker() {
return -1;
}

View File

@ -85,10 +85,6 @@ class FileAudioDevice : public AudioDeviceGeneric {
int32_t StopRecording() override;
bool Recording() const override;
// Microphone Automatic Gain Control (AGC)
int32_t SetAGC(bool enable) override;
bool AGC() const override;
// Audio mixer initialization
int32_t InitSpeaker() override;
bool SpeakerIsInitialized() const override;

View File

@ -101,9 +101,9 @@ class AudioDeviceModule : public rtc::RefCountInterface {
virtual int32_t StopRecording() = 0;
virtual bool Recording() const = 0;
// Microphone Automatic Gain Control (AGC)
virtual int32_t SetAGC(bool enable) = 0;
virtual bool AGC() const = 0;
// TODO(bugs.webrtc.org/7306): deprecated (to be removed).
virtual int32_t SetAGC(bool enable) { return -1; }
virtual bool AGC() const { return false; }
// Audio mixer initialization
virtual int32_t InitSpeaker() = 0;

View File

@ -41,7 +41,6 @@ class FakeAudioDeviceModule : public AudioDeviceModule {
int32_t SetRecordingDevice(uint16_t index) override { return 0; }
int32_t SetRecordingDevice(WindowsDeviceType device) override { return 0; }
int32_t SetStereoRecording(bool enable) override { return 0; }
int32_t SetAGC(bool enable) override { return 0; }
int32_t StopRecording() override { return 0; }
int32_t Terminate() override { return 0; }

View File

@ -93,8 +93,6 @@ class AudioDeviceIOS : public AudioDeviceGeneric,
AudioDeviceModule::AudioLayer& audioLayer) const override;
int32_t PlayoutIsAvailable(bool& available) override;
int32_t RecordingIsAvailable(bool& available) override;
int32_t SetAGC(bool enable) override;
bool AGC() const override;
int16_t PlayoutDevices() override;
int16_t RecordingDevices() override;
int32_t PlayoutDeviceName(uint16_t index,

View File

@ -143,17 +143,6 @@ int32_t AudioDeviceIOS::StereoPlayout(bool& enabled) const {
return 0;
}
int32_t AudioDeviceIOS::SetAGC(bool enable) {
if (enable) {
RTC_NOTREACHED() << "Should never be called";
}
return -1;
}
bool AudioDeviceIOS::AGC() const {
return false;
}
int32_t AudioDeviceIOS::MicrophoneVolumeIsAvailable(bool& available) {
available = false;
return 0;

View File

@ -90,7 +90,6 @@ AudioDeviceLinuxALSA::AudioDeviceLinuxALSA()
_playing(false),
_recIsInitialized(false),
_playIsInitialized(false),
_AGC(false),
_recordingDelay(0),
_playoutDelay(0) {
memset(_oldKeyState, 0, sizeof(_oldKeyState));
@ -519,16 +518,6 @@ int32_t AudioDeviceLinuxALSA::StereoPlayout(bool& enabled) const {
return 0;
}
int32_t AudioDeviceLinuxALSA::SetAGC(bool enable) {
_AGC = enable;
return 0;
}
bool AudioDeviceLinuxALSA::AGC() const {
return _AGC;
}
int32_t AudioDeviceLinuxALSA::MicrophoneVolumeIsAvailable(bool& available) {
bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
@ -1593,19 +1582,6 @@ bool AudioDeviceLinuxALSA::RecThreadProcess() {
_ptrAudioBuffer->SetRecordedBuffer(_recordingBuffer,
_recordingFramesIn10MS);
uint32_t currentMicLevel = 0;
uint32_t newMicLevel = 0;
if (AGC()) {
// store current mic level in the audio buffer if AGC is enabled
if (MicrophoneVolume(currentMicLevel) == 0) {
if (currentMicLevel == 0xffffffff)
currentMicLevel = 100;
// this call does not affect the actual microphone volume
_ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
}
}
// calculate delay
_playoutDelay = 0;
_recordingDelay = 0;
@ -1640,18 +1616,6 @@ bool AudioDeviceLinuxALSA::RecThreadProcess() {
UnLock();
_ptrAudioBuffer->DeliverRecordedData();
Lock();
if (AGC()) {
newMicLevel = _ptrAudioBuffer->NewMicLevel();
if (newMicLevel != 0) {
// The VQE will only deliver non-zero microphone levels when a
// change is needed. Set this new mic level (received from the
// observer as return value in the callback).
if (SetMicrophoneVolume(newMicLevel) == -1)
RTC_LOG(LS_WARNING)
<< "the required modification of the microphone volume failed";
}
}
}
}

View File

@ -79,10 +79,6 @@ public:
int32_t StopRecording() override;
bool Recording() const override;
// Microphone Automatic Gain Control (AGC)
int32_t SetAGC(bool enable) override;
bool AGC() const override;
// Audio mixer initialization
int32_t InitSpeaker() override;
bool SpeakerIsInitialized() const override;
@ -191,7 +187,6 @@ private:
bool _playing;
bool _recIsInitialized;
bool _playIsInitialized;
bool _AGC;
snd_pcm_sframes_t _recordingDelay;
snd_pcm_sframes_t _playoutDelay;

View File

@ -49,7 +49,6 @@ AudioDeviceLinuxPulse::AudioDeviceLinuxPulse()
_stopRec(false),
_startPlay(false),
_stopPlay(false),
_AGC(false),
update_speaker_volume_at_startup_(false),
_sndCardPlayDelay(0),
_sndCardRecDelay(0),
@ -579,18 +578,6 @@ int32_t AudioDeviceLinuxPulse::StereoPlayout(bool& enabled) const {
return 0;
}
int32_t AudioDeviceLinuxPulse::SetAGC(bool enable) {
rtc::CritScope lock(&_critSect);
_AGC = enable;
return 0;
}
bool AudioDeviceLinuxPulse::AGC() const {
rtc::CritScope lock(&_critSect);
return _AGC;
}
int32_t AudioDeviceLinuxPulse::MicrophoneVolumeIsAvailable(bool& available) {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
@ -1964,20 +1951,10 @@ int32_t AudioDeviceLinuxPulse::ReadRecordedData(const void* bufferData,
int32_t AudioDeviceLinuxPulse::ProcessRecordedData(int8_t* bufferData,
uint32_t bufferSizeInSamples,
uint32_t recDelay)
RTC_EXCLUSIVE_LOCKS_REQUIRED(_critSect) {
uint32_t currentMicLevel(0);
uint32_t newMicLevel(0);
RTC_EXCLUSIVE_LOCKS_REQUIRED(_critSect) {
_ptrAudioBuffer->SetRecordedBuffer(bufferData, bufferSizeInSamples);
if (AGC()) {
// Store current mic level in the audio buffer if AGC is enabled
if (MicrophoneVolume(currentMicLevel) == 0) {
// This call does not affect the actual microphone volume
_ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
}
}
const uint32_t clockDrift(0);
// TODO(andrew): this is a temporary hack, to avoid non-causal far- and
// near-end signals at the AEC for PulseAudio. I think the system delay is
@ -2001,22 +1978,6 @@ int32_t AudioDeviceLinuxPulse::ProcessRecordedData(int8_t* bufferData,
return -1;
}
if (AGC()) {
newMicLevel = _ptrAudioBuffer->NewMicLevel();
if (newMicLevel != 0) {
// The VQE will only deliver non-zero microphone levels when a
// change is needed.
// Set this new mic level (received from the observer as return
// value in the callback).
RTC_LOG(LS_VERBOSE) << "AGC change of volume: old=" << currentMicLevel
<< " => new=" << newMicLevel;
if (SetMicrophoneVolume(newMicLevel) == -1) {
RTC_LOG(LS_WARNING)
<< "the required modification of the microphone volume failed";
}
}
}
return 0;
}

View File

@ -141,10 +141,6 @@ public:
int32_t StopRecording() override;
bool Recording() const override;
// Microphone Automatic Gain Control (AGC)
int32_t SetAGC(bool enable) override;
bool AGC() const override;
// Audio mixer initialization
int32_t InitSpeaker() override;
bool SpeakerIsInitialized() const override;
@ -289,7 +285,6 @@ private:
bool _stopRec;
bool _startPlay;
bool _stopPlay;
bool _AGC;
bool update_speaker_volume_at_startup_;
uint32_t _sndCardPlayDelay;

View File

@ -132,7 +132,6 @@ AudioDeviceMac::AudioDeviceMac()
_playing(false),
_recIsInitialized(false),
_playIsInitialized(false),
_AGC(false),
_renderDeviceIsAlive(1),
_captureDeviceIsAlive(1),
_twoDevices(true),
@ -149,8 +148,7 @@ AudioDeviceMac::AudioDeviceMac()
_paRenderBuffer(NULL),
_captureBufSizeSamples(0),
_renderBufSizeSamples(0),
prev_key_state_(),
get_mic_volume_counter_ms_(0) {
prev_key_state_() {
RTC_LOG(LS_INFO) << __FUNCTION__ << " created";
RTC_DCHECK(&_stopEvent != NULL);
@ -337,8 +335,6 @@ AudioDeviceGeneric::InitStatus AudioDeviceMac::Init() {
}
}
get_mic_volume_counter_ms_ = 0;
_initialized = true;
return InitStatus::OK;
@ -733,16 +729,6 @@ int32_t AudioDeviceMac::StereoPlayout(bool& enabled) const {
return 0;
}
int32_t AudioDeviceMac::SetAGC(bool enable) {
_AGC = enable;
return 0;
}
bool AudioDeviceMac::AGC() const {
return _AGC;
}
int32_t AudioDeviceMac::MicrophoneVolumeIsAvailable(bool& available) {
bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
@ -2494,8 +2480,6 @@ bool AudioDeviceMac::CaptureWorkerThread() {
// TODO(xians): what if the returned size is incorrect?
if (size == ENGINE_REC_BUF_SIZE_IN_SAMPLES) {
uint32_t currentMicLevel(0);
uint32_t newMicLevel(0);
int32_t msecOnPlaySide;
int32_t msecOnRecordSide;
@ -2515,43 +2499,12 @@ bool AudioDeviceMac::CaptureWorkerThread() {
// store the recorded buffer (no action will be taken if the
// #recorded samples is not a full buffer)
_ptrAudioBuffer->SetRecordedBuffer((int8_t*)&recordBuffer, (uint32_t)size);
if (AGC()) {
// Use mod to ensure we check the volume on the first pass.
if (get_mic_volume_counter_ms_ % kGetMicVolumeIntervalMs == 0) {
get_mic_volume_counter_ms_ = 0;
// store current mic level in the audio buffer if AGC is enabled
if (MicrophoneVolume(currentMicLevel) == 0) {
// this call does not affect the actual microphone volume
_ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
}
}
get_mic_volume_counter_ms_ += kBufferSizeMs;
}
_ptrAudioBuffer->SetVQEData(msecOnPlaySide, msecOnRecordSide, 0);
_ptrAudioBuffer->SetTypingStatus(KeyPressed());
// deliver recorded samples at specified sample rate, mic level etc.
// to the observer using callback
_ptrAudioBuffer->DeliverRecordedData();
if (AGC()) {
newMicLevel = _ptrAudioBuffer->NewMicLevel();
if (newMicLevel != 0) {
// The VQE will only deliver non-zero microphone levels when
// a change is needed.
// Set this new mic level (received from the observer as return
// value in the callback).
RTC_LOG(LS_VERBOSE) << "AGC change of volume: old=" << currentMicLevel
<< " => new=" << newMicLevel;
if (SetMicrophoneVolume(newMicLevel) == -1) {
RTC_LOG(LS_WARNING)
<< "the required modification of the microphone volume failed";
}
}
}
}
return true;

View File

@ -107,10 +107,6 @@ class AudioDeviceMac : public AudioDeviceGeneric {
virtual int32_t StopRecording();
virtual bool Recording() const;
// Microphone Automatic Gain Control (AGC)
virtual int32_t SetAGC(bool enable);
virtual bool AGC() const;
// Audio mixer initialization
virtual int32_t InitSpeaker();
virtual bool SpeakerIsInitialized() const;
@ -294,7 +290,6 @@ class AudioDeviceMac : public AudioDeviceGeneric {
bool _playing;
bool _recIsInitialized;
bool _playIsInitialized;
bool _AGC;
// Atomically set varaibles
int32_t _renderDeviceIsAlive;
@ -335,8 +330,6 @@ class AudioDeviceMac : public AudioDeviceGeneric {
// Typing detection
// 0x5c is key "9", after that comes function keys.
bool prev_key_state_[0x5d];
int get_mic_volume_counter_ms_;
};
} // namespace webrtc

View File

@ -417,9 +417,6 @@ AudioDeviceWindowsCore::AudioDeviceWindowsCore()
_hShutdownCaptureEvent(NULL),
_hRenderStartedEvent(NULL),
_hCaptureStartedEvent(NULL),
_hGetCaptureVolumeThread(NULL),
_hSetCaptureVolumeThread(NULL),
_hSetCaptureVolumeEvent(NULL),
_hMmTask(NULL),
_initialized(false),
_recording(false),
@ -428,15 +425,13 @@ AudioDeviceWindowsCore::AudioDeviceWindowsCore()
_playIsInitialized(false),
_speakerIsInitialized(false),
_microphoneIsInitialized(false),
_AGC(false),
_playBufDelay(80),
_usingInputDeviceIndex(false),
_usingOutputDeviceIndex(false),
_inputDevice(AudioDeviceModule::kDefaultCommunicationDevice),
_outputDevice(AudioDeviceModule::kDefaultCommunicationDevice),
_inputDeviceIndex(0),
_outputDeviceIndex(0),
_newMicLevel(0) {
_outputDeviceIndex(0) {
RTC_LOG(LS_INFO) << __FUNCTION__ << " created";
assert(_comInit.succeeded());
@ -487,7 +482,6 @@ AudioDeviceWindowsCore::AudioDeviceWindowsCore()
_hShutdownCaptureEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
_hRenderStartedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
_hCaptureStartedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
_hSetCaptureVolumeEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
_perfCounterFreq.QuadPart = 1;
_perfCounterFactor = 0.0;
@ -575,11 +569,6 @@ AudioDeviceWindowsCore::~AudioDeviceWindowsCore() {
_hShutdownCaptureEvent = NULL;
}
if (NULL != _hSetCaptureVolumeEvent) {
CloseHandle(_hSetCaptureVolumeEvent);
_hSetCaptureVolumeEvent = NULL;
}
if (_avrtLibrary) {
BOOL freeOK = FreeLibrary(_avrtLibrary);
if (!freeOK) {
@ -1270,25 +1259,6 @@ int32_t AudioDeviceWindowsCore::StereoPlayout(bool& enabled) const {
return 0;
}
// ----------------------------------------------------------------------------
// SetAGC
// ----------------------------------------------------------------------------
int32_t AudioDeviceWindowsCore::SetAGC(bool enable) {
rtc::CritScope lock(&_critSect);
_AGC = enable;
return 0;
}
// ----------------------------------------------------------------------------
// AGC
// ----------------------------------------------------------------------------
bool AudioDeviceWindowsCore::AGC() const {
rtc::CritScope lock(&_critSect);
return _AGC;
}
// ----------------------------------------------------------------------------
// MicrophoneVolumeIsAvailable
// ----------------------------------------------------------------------------
@ -2423,21 +2393,6 @@ int32_t AudioDeviceWindowsCore::StartRecording() {
// Set thread priority to highest possible
SetThreadPriority(_hRecThread, THREAD_PRIORITY_TIME_CRITICAL);
assert(_hGetCaptureVolumeThread == NULL);
_hGetCaptureVolumeThread =
CreateThread(NULL, 0, GetCaptureVolumeThread, this, 0, NULL);
if (_hGetCaptureVolumeThread == NULL) {
RTC_LOG(LS_ERROR) << "failed to create the volume getter thread";
return -1;
}
assert(_hSetCaptureVolumeThread == NULL);
_hSetCaptureVolumeThread =
CreateThread(NULL, 0, SetCaptureVolumeThread, this, 0, NULL);
if (_hSetCaptureVolumeThread == NULL) {
RTC_LOG(LS_ERROR) << "failed to create the volume setter thread";
return -1;
}
} // critScoped
DWORD ret = WaitForSingleObject(_hCaptureStartedEvent, 1000);
@ -2490,24 +2445,6 @@ int32_t AudioDeviceWindowsCore::StopRecording() {
} else {
RTC_LOG(LS_VERBOSE) << "webrtc_core_audio_capture_thread is now closed";
}
ret = WaitForSingleObject(_hGetCaptureVolumeThread, 2000);
if (ret != WAIT_OBJECT_0) {
// the thread did not stop as it should
RTC_LOG(LS_ERROR) << "failed to close down volume getter thread";
err = -1;
} else {
RTC_LOG(LS_VERBOSE) << "volume getter thread is now closed";
}
ret = WaitForSingleObject(_hSetCaptureVolumeThread, 2000);
if (ret != WAIT_OBJECT_0) {
// the thread did not stop as it should
RTC_LOG(LS_ERROR) << "failed to close down volume setter thread";
err = -1;
} else {
RTC_LOG(LS_VERBOSE) << "volume setter thread is now closed";
}
_Lock();
ResetEvent(_hShutdownCaptureEvent); // Must be manually reset.
@ -2523,12 +2460,6 @@ int32_t AudioDeviceWindowsCore::StopRecording() {
CloseHandle(_hRecThread);
_hRecThread = NULL;
CloseHandle(_hGetCaptureVolumeThread);
_hGetCaptureVolumeThread = NULL;
CloseHandle(_hSetCaptureVolumeThread);
_hSetCaptureVolumeThread = NULL;
if (_builtInAecEnabled) {
assert(_dmo != NULL);
// This is necessary. Otherwise the DMO can generate garbage render
@ -2736,72 +2667,6 @@ DWORD WINAPI AudioDeviceWindowsCore::WSAPICaptureThreadPollDMO(LPVOID context) {
->DoCaptureThreadPollDMO();
}
DWORD WINAPI AudioDeviceWindowsCore::GetCaptureVolumeThread(LPVOID context) {
return reinterpret_cast<AudioDeviceWindowsCore*>(context)
->DoGetCaptureVolumeThread();
}
DWORD WINAPI AudioDeviceWindowsCore::SetCaptureVolumeThread(LPVOID context) {
return reinterpret_cast<AudioDeviceWindowsCore*>(context)
->DoSetCaptureVolumeThread();
}
DWORD AudioDeviceWindowsCore::DoGetCaptureVolumeThread() {
HANDLE waitObject = _hShutdownCaptureEvent;
while (1) {
if (AGC()) {
uint32_t currentMicLevel = 0;
if (MicrophoneVolume(currentMicLevel) == 0) {
// This doesn't set the system volume, just stores it.
_Lock();
if (_ptrAudioBuffer) {
_ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
}
_UnLock();
}
}
DWORD waitResult =
WaitForSingleObject(waitObject, GET_MIC_VOLUME_INTERVAL_MS);
switch (waitResult) {
case WAIT_OBJECT_0: // _hShutdownCaptureEvent
return 0;
case WAIT_TIMEOUT: // timeout notification
break;
default: // unexpected error
RTC_LOG(LS_WARNING) << "unknown wait termination on get volume thread";
return 1;
}
}
}
DWORD AudioDeviceWindowsCore::DoSetCaptureVolumeThread() {
HANDLE waitArray[2] = {_hShutdownCaptureEvent, _hSetCaptureVolumeEvent};
while (1) {
DWORD waitResult = WaitForMultipleObjects(2, waitArray, FALSE, INFINITE);
switch (waitResult) {
case WAIT_OBJECT_0: // _hShutdownCaptureEvent
return 0;
case WAIT_OBJECT_0 + 1: // _hSetCaptureVolumeEvent
break;
default: // unexpected error
RTC_LOG(LS_WARNING) << "unknown wait termination on set volume thread";
return 1;
}
_Lock();
uint32_t newMicLevel = _newMicLevel;
_UnLock();
if (SetMicrophoneVolume(newMicLevel) == -1) {
RTC_LOG(LS_WARNING)
<< "the required modification of the microphone volume failed";
}
}
}
// ----------------------------------------------------------------------------
// DoRenderThread
// ----------------------------------------------------------------------------
@ -3188,8 +3053,6 @@ DWORD AudioDeviceWindowsCore::DoCaptureThreadPollDMO() {
break;
}
// TODO(andrew): handle AGC.
if (bytesProduced > 0) {
const int kSamplesProduced = bytesProduced / _recAudioFrameSize;
// TODO(andrew): verify that this is always satisfied. It might
@ -3451,20 +3314,6 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread() {
syncBufIndex -= _recBlockSize;
sndCardRecDelay -= 10;
}
if (_AGC) {
uint32_t newMicLevel = _ptrAudioBuffer->NewMicLevel();
if (newMicLevel != 0) {
// The VQE will only deliver non-zero microphone levels when a
// change is needed. Set this new mic level (received from the
// observer as return value in the callback).
RTC_LOG(LS_VERBOSE) << "AGC change of volume: new=" << newMicLevel;
// We store this outside of the audio buffer to avoid
// having it overwritten by the getter thread.
_newMicLevel = newMicLevel;
SetEvent(_hSetCaptureVolumeEvent);
}
}
} else {
// If GetBuffer returns AUDCLNT_E_BUFFER_ERROR, the thread consuming the
// audio samples must wait for the next processing pass. The client

View File

@ -129,10 +129,6 @@ public:
virtual int32_t StopRecording();
virtual bool Recording() const;
// Microphone Automatic Gain Control (AGC)
virtual int32_t SetAGC(bool enable);
virtual bool AGC() const;
// Audio mixer initialization
virtual int32_t InitSpeaker();
virtual bool SpeakerIsInitialized() const;
@ -201,12 +197,6 @@ private: // thread functions
static DWORD WINAPI WSAPIRenderThread(LPVOID context);
DWORD DoRenderThread();
static DWORD WINAPI GetCaptureVolumeThread(LPVOID context);
DWORD DoGetCaptureVolumeThread();
static DWORD WINAPI SetCaptureVolumeThread(LPVOID context);
DWORD DoSetCaptureVolumeThread();
void _Lock() { _critSect.Enter(); };
void _UnLock() { _critSect.Leave(); };
@ -274,10 +264,6 @@ private: // thread functions
HANDLE _hCaptureStartedEvent;
HANDLE _hShutdownCaptureEvent;
HANDLE _hGetCaptureVolumeThread;
HANDLE _hSetCaptureVolumeThread;
HANDLE _hSetCaptureVolumeEvent;
HANDLE _hMmTask;
UINT _playAudioFrameSize;
@ -318,12 +304,8 @@ private:
uint16_t _inputDeviceIndex;
uint16_t _outputDeviceIndex;
bool _AGC;
uint16_t _playBufDelay;
uint16_t _newMicLevel;
mutable char _str[512];
};

View File

@ -233,16 +233,6 @@ bool FakeAudioCaptureModule::Recording() const {
return recording_;
}
int32_t FakeAudioCaptureModule::SetAGC(bool /*enable*/) {
// No AGC but not needed since audio is pregenerated. Return success.
return 0;
}
bool FakeAudioCaptureModule::AGC() const {
RTC_NOTREACHED();
return 0;
}
int32_t FakeAudioCaptureModule::InitSpeaker() {
// No speaker, just playing from file. Return success.
return 0;

View File

@ -90,9 +90,6 @@ class FakeAudioCaptureModule
int32_t StopRecording() override;
bool Recording() const override;
int32_t SetAGC(bool enable) override;
bool AGC() const override;
int32_t InitSpeaker() override;
bool SpeakerIsInitialized() const override;
int32_t InitMicrophone() override;