diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index 258e2e1424..28a8829a4d 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -44,6 +44,7 @@ namespace webrtc { class ApmDataDumper; +class AudioFrame; class AudioConverter; class AudioProcessingImpl : public AudioProcessing { @@ -80,6 +81,9 @@ class AudioProcessingImpl : public AudioProcessing { // Capture-side exclusive methods possibly running APM in a // multi-threaded manner. Acquire the capture lock. + int ProcessStream(AudioFrame* frame) override { + return ProcessAudioFrame(this, frame); + } int ProcessStream(const int16_t* const src, const StreamConfig& input_config, const StreamConfig& output_config, @@ -98,6 +102,9 @@ class AudioProcessingImpl : public AudioProcessing { // Render-side exclusive methods possibly running APM in a // multi-threaded manner. Acquire the render lock. + int ProcessReverseStream(AudioFrame* frame) override { + return ProcessReverseAudioFrame(this, frame); + } int ProcessReverseStream(const int16_t* const src, const StreamConfig& input_config, const StreamConfig& output_config, diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index 265507dd66..953ccebaba 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h @@ -39,6 +39,7 @@ namespace webrtc { class AecDump; class AudioBuffer; +class AudioFrame; class StreamConfig; class ProcessingConfig; @@ -522,6 +523,18 @@ class RTC_EXPORT AudioProcessing : public rtc::RefCountInterface { // Enqueue a runtime setting. virtual void SetRuntimeSetting(RuntimeSetting setting) = 0; + // Processes a 10 ms |frame| of the primary audio stream. On the client-side, + // this is the near-end (or captured) audio. + // + // If needed for enabled functionality, any function with the set_stream_ tag + // must be called prior to processing the current frame. Any getter function + // with the stream_ tag which is needed should be called after processing. + // + // The |sample_rate_hz_|, |num_channels_|, and |samples_per_channel_| + // members of |frame| must be valid. If changed from the previous call to this + // method, it will trigger an initialization. + virtual int ProcessStream(AudioFrame* frame) = 0; + // Accepts and produces a 10 ms frame interleaved 16 bit integer audio as // specified in |input_config| and |output_config|. |src| and |dest| may use // the same memory, if desired. @@ -542,6 +555,20 @@ class RTC_EXPORT AudioProcessing : public rtc::RefCountInterface { const StreamConfig& output_config, float* const* dest) = 0; + // Processes a 10 ms |frame| of the reverse direction audio stream. The frame + // may be modified. On the client-side, this is the far-end (or to be + // rendered) audio. + // + // It is necessary to provide this if echo processing is enabled, as the + // reverse stream forms the echo reference signal. It is recommended, but not + // necessary, to provide if gain control is enabled. On the server-side this + // typically will not be used. If you're not sure what to pass in here, + // chances are you don't need to use it. + // + // The |sample_rate_hz_|, |num_channels_|, and |samples_per_channel_| + // members of |frame| must be valid. + virtual int ProcessReverseStream(AudioFrame* frame) = 0; + // Accepts and produces a 10 ms frame of interleaved 16 bit integer audio for // the reverse direction audio stream as specified in |input_config| and // |output_config|. |src| and |dest| may use the same memory, if desired. diff --git a/modules/audio_processing/include/mock_audio_processing.h b/modules/audio_processing/include/mock_audio_processing.h index 66c5831e79..f3e936185f 100644 --- a/modules/audio_processing/include/mock_audio_processing.h +++ b/modules/audio_processing/include/mock_audio_processing.h @@ -81,6 +81,7 @@ class MockAudioProcessing : public ::testing::NiceMock { MOCK_CONST_METHOD0(num_reverse_channels, size_t()); MOCK_METHOD1(set_output_will_be_muted, void(bool muted)); MOCK_METHOD1(SetRuntimeSetting, void(RuntimeSetting setting)); + MOCK_METHOD1(ProcessStream, int(AudioFrame* frame)); MOCK_METHOD4(ProcessStream, int(const int16_t* const src, const StreamConfig& input_config, @@ -99,6 +100,7 @@ class MockAudioProcessing : public ::testing::NiceMock { const StreamConfig& input_config, const StreamConfig& output_config, float* const* dest)); + MOCK_METHOD1(ProcessReverseStream, int(AudioFrame* frame)); MOCK_METHOD4(ProcessReverseStream, int(const int16_t* const src, const StreamConfig& input_config, diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn index f52797d67f..123e54840b 100644 --- a/test/fuzzers/BUILD.gn +++ b/test/fuzzers/BUILD.gn @@ -436,7 +436,6 @@ rtc_library("audio_processing_fuzzer_helper") { "../../api/audio:audio_frame_api", "../../modules/audio_processing", "../../modules/audio_processing:api", - "../../modules/audio_processing:audio_frame_proxies", "../../rtc_base:checks", "../../rtc_base:rtc_base_approved", "//third_party/abseil-cpp/absl/types:optional", diff --git a/test/fuzzers/audio_processing_fuzzer_helper.cc b/test/fuzzers/audio_processing_fuzzer_helper.cc index cb53a04cbb..87b68f42e3 100644 --- a/test/fuzzers/audio_processing_fuzzer_helper.cc +++ b/test/fuzzers/audio_processing_fuzzer_helper.cc @@ -16,7 +16,6 @@ #include #include "api/audio/audio_frame.h" -#include "modules/audio_processing/include/audio_frame_proxies.h" #include "modules/audio_processing/include/audio_processing.h" #include "rtc_base/checks.h" @@ -131,9 +130,9 @@ void FuzzAudioProcessing(test::FuzzDataHelper* fuzz_data, GenerateFixedFrame(fuzz_data, input_rate, num_channels, &fixed_frame); if (is_capture) { - apm_return_code = ProcessAudioFrame(apm.get(), &fixed_frame); + apm_return_code = apm->ProcessStream(&fixed_frame); } else { - apm_return_code = ProcessReverseAudioFrame(apm.get(), &fixed_frame); + apm_return_code = apm->ProcessReverseStream(&fixed_frame); } }