diff --git a/src/modules/module-echo-cancel/aec-webrtc.cpp b/src/modules/module-echo-cancel/aec-webrtc.cpp index 976d37e3b..288de133b 100644 --- a/src/modules/module-echo-cancel/aec-webrtc.cpp +++ b/src/modules/module-echo-cancel/aec-webrtc.cpp @@ -23,6 +23,9 @@ * DEALINGS IN THE SOFTWARE. */ +#include +#include + #include "echo-cancel.h" #include @@ -32,20 +35,21 @@ #include struct impl { - webrtc::AudioProcessing *apm = NULL; + std::unique_ptr apm; spa_audio_info_raw info; - float** play_buffer; - float** rec_buffer; - float** out_buffer; + std::unique_ptr play_buffer, rec_buffer, out_buffer; + + impl(std::unique_ptr apm, const spa_audio_info_raw& info) + : apm(std::move(apm)), + info(info), + play_buffer(std::make_unique(info.channels)), + rec_buffer(std::make_unique(info.channels)), + out_buffer(std::make_unique(info.channels)) + { } }; static void *webrtc_create(const struct pw_properties *args, const spa_audio_info_raw *info) { - struct impl *impl; - webrtc::AudioProcessing *apm; - webrtc::ProcessingConfig pconfig; - webrtc::Config config; - bool extended_filter = pw_properties_get_bool(args, "webrtc.extended_filter", true); bool delay_agnostic = pw_properties_get_bool(args, "webrtc.delay_agnostic", true); bool high_pass_filter = pw_properties_get_bool(args, "webrtc.high_pass_filter", true); @@ -63,24 +67,24 @@ static void *webrtc_create(const struct pw_properties *args, const spa_audio_inf // Disable by default bool intelligibility = pw_properties_get_bool(args, "webrtc.intelligibility", false); + webrtc::Config config; config.Set(new webrtc::ExtendedFilter(extended_filter)); config.Set(new webrtc::DelayAgnostic(delay_agnostic)); config.Set(new webrtc::ExperimentalAgc(experimental_agc)); config.Set(new webrtc::ExperimentalNs(experimental_ns)); config.Set(new webrtc::Intelligibility(intelligibility)); - apm = webrtc::AudioProcessing::Create(config); - - pconfig = {{ + webrtc::ProcessingConfig pconfig = {{ webrtc::StreamConfig(info->rate, info->channels, false), /* input stream */ webrtc::StreamConfig(info->rate, info->channels, false), /* output stream */ webrtc::StreamConfig(info->rate, info->channels, false), /* reverse input stream */ webrtc::StreamConfig(info->rate, info->channels, false), /* reverse output stream */ }}; + auto apm = std::unique_ptr(webrtc::AudioProcessing::Create(config)); if (apm->Initialize(pconfig) != webrtc::AudioProcessing::kNoError) { pw_log_error("Error initialising webrtc audio processing module"); - goto error; + return nullptr; } apm->high_pass_filter()->Enable(high_pass_filter); @@ -96,33 +100,14 @@ static void *webrtc_create(const struct pw_properties *args, const spa_audio_inf apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveDigital); apm->gain_control()->Enable(gain_control); - impl = (struct impl *)calloc(1, sizeof(struct impl)); - impl->info = *info; - - impl->play_buffer = (float **)calloc(info->channels, sizeof(float*)); - impl->rec_buffer = (float **)calloc(info->channels, sizeof(float*)); - impl->out_buffer = (float **)calloc(info->channels, sizeof(float*)); - - impl->apm = apm; - - return impl; - -error: - if (apm) - delete apm; - - return NULL; + return new impl(std::move(apm), *info); } static void webrtc_destroy(void *ec) { auto impl = static_cast(ec); - delete impl->apm; - free(impl->play_buffer); - free(impl->rec_buffer); - free(impl->out_buffer); - free(impl); + delete impl; } static int webrtc_run(void *ec, const float *rec[], const float *play[], float *out[], uint32_t n_samples) @@ -146,7 +131,7 @@ static int webrtc_run(void *ec, const float *rec[], const float *play[], float * /* FIXME: ProcessReverseStream may change the playback buffer, in which * case we should use that, if we ever expose the intelligibility * enhancer */ - if (impl->apm->ProcessReverseStream(impl->play_buffer, config, config, impl->play_buffer) != + if (impl->apm->ProcessReverseStream(impl->play_buffer.get(), config, config, impl->play_buffer.get()) != webrtc::AudioProcessing::kNoError) { pw_log_error("Processing reverse stream failed"); } @@ -154,7 +139,7 @@ static int webrtc_run(void *ec, const float *rec[], const float *play[], float * // Extra delay introduced by multiple frames impl->apm->set_stream_delay_ms((num_blocks - 1) * 10); - if (impl->apm->ProcessStream(impl->rec_buffer, config, config, impl->out_buffer) != + if (impl->apm->ProcessStream(impl->rec_buffer.get(), config, config, impl->out_buffer.get()) != webrtc::AudioProcessing::kNoError) { pw_log_error("Processing stream failed"); }