diff --git a/talk/media/webrtc/fakewebrtcvoiceengine.h b/talk/media/webrtc/fakewebrtcvoiceengine.h index b7a7262af7..bf22a290b8 100644 --- a/talk/media/webrtc/fakewebrtcvoiceengine.h +++ b/talk/media/webrtc/fakewebrtcvoiceengine.h @@ -74,6 +74,7 @@ class FakeAudioProcessing : public webrtc::AudioProcessing { experimental_ns_enabled_ = config.Get().enabled; } + WEBRTC_STUB_CONST(input_sample_rate_hz, ()); WEBRTC_STUB_CONST(proc_sample_rate_hz, ()); WEBRTC_STUB_CONST(proc_split_sample_rate_hz, ()); WEBRTC_STUB_CONST(num_input_channels, ()); diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc index e99720ddb4..67ad266d50 100644 --- a/webrtc/modules/audio_processing/audio_processing_impl.cc +++ b/webrtc/modules/audio_processing/audio_processing_impl.cc @@ -501,6 +501,12 @@ void AudioProcessingImpl::SetExtraOptions(const Config& config) { } } +int AudioProcessingImpl::input_sample_rate_hz() const { + // Accessed from outside APM, hence a lock is needed. + rtc::CritScope cs(&crit_capture_); + return formats_.api_format.input_stream().sample_rate_hz(); +} + int AudioProcessingImpl::proc_sample_rate_hz() const { // Used as callback from submodules, hence locking is not allowed. return capture_nonlocked_.fwd_proc_format.sample_rate_hz(); diff --git a/webrtc/modules/audio_processing/audio_processing_impl.h b/webrtc/modules/audio_processing/audio_processing_impl.h index eb349769d0..87a145ab3c 100644 --- a/webrtc/modules/audio_processing/audio_processing_impl.h +++ b/webrtc/modules/audio_processing/audio_processing_impl.h @@ -81,6 +81,7 @@ class AudioProcessingImpl : public AudioProcessing { void set_delay_offset_ms(int offset) override; int delay_offset_ms() const override; void set_stream_key_pressed(bool key_pressed) override; + int input_sample_rate_hz() const override; // Render-side exclusive methods possibly running APM in a // multi-threaded manner. Acquire the render lock. diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h index c8ddc6a483..5fcc4d4672 100644 --- a/webrtc/modules/audio_processing/include/audio_processing.h +++ b/webrtc/modules/audio_processing/include/audio_processing.h @@ -279,6 +279,10 @@ class AudioProcessing { // ensures the options are applied immediately. virtual void SetExtraOptions(const Config& config) = 0; + // TODO(peah): Remove after voice engine no longer requires it to resample + // the reverse stream to the forward rate. + virtual int input_sample_rate_hz() const = 0; + // TODO(ajm): Only intended for internal use. Make private and friend the // necessary classes? virtual int proc_sample_rate_hz() const = 0; diff --git a/webrtc/voice_engine/output_mixer.cc b/webrtc/voice_engine/output_mixer.cc index d46ee6296d..d3a4f7fc8f 100644 --- a/webrtc/voice_engine/output_mixer.cc +++ b/webrtc/voice_engine/output_mixer.cc @@ -517,8 +517,20 @@ OutputMixer::DoOperationsOnCombinedSignal(bool feed_data_to_apm) } // --- Far-end Voice Quality Enhancement (AudioProcessing Module) - if (feed_data_to_apm) - APMProcessReverseStream(); + if (feed_data_to_apm) { + // Convert from mixing to AudioProcessing sample rate, similarly to how it + // is done on the send side. Downmix to mono. + AudioFrame frame; + frame.num_channels_ = 1; + frame.sample_rate_hz_ = _audioProcessingModulePtr->input_sample_rate_hz(); + RemixAndResample(_audioFrame, &audioproc_resampler_, &frame); + + if (_audioProcessingModulePtr->AnalyzeReverseStream(&frame) != 0) { + WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1), + "AudioProcessingModule::AnalyzeReverseStream() => error"); + RTC_DCHECK(false); + } + } // --- External media processing { @@ -549,13 +561,6 @@ OutputMixer::DoOperationsOnCombinedSignal(bool feed_data_to_apm) // Private methods // ---------------------------------------------------------------------------- -void OutputMixer::APMProcessReverseStream() { - if (_audioProcessingModulePtr->ProcessReverseStream(&_audioFrame) != 0) { - WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, -1), - "AudioProcessingModule::ProcessReverseStream() => error"); - } -} - int OutputMixer::InsertInbandDtmfTone() { diff --git a/webrtc/voice_engine/output_mixer.h b/webrtc/voice_engine/output_mixer.h index 8c0a2de53b..c042a038dd 100644 --- a/webrtc/voice_engine/output_mixer.h +++ b/webrtc/voice_engine/output_mixer.h @@ -102,7 +102,6 @@ public: private: OutputMixer(uint32_t instanceId); - void APMProcessReverseStream(); int InsertInbandDtmfTone(); // uses