Cleanup of the APM creation
This CL removes the possibility that APM cannot be created, i.e., that the create method can return nullptr. That was already the case implicitly but this CL makes that behavior explicit. Bug: webrtc:5298 Change-Id: I2706ea538c9d1b4bcd65faecab637640a209a4dc Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/183101 Reviewed-by: Sam Zackrisson <saza@webrtc.org> Commit-Queue: Per Åhgren <peah@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32029}
This commit is contained in:
@ -35,16 +35,10 @@ AudioProcessing* AudioProcessingBuilder::Create(const webrtc::Config& config) {
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
// Standard implementation.
|
// Standard implementation.
|
||||||
AudioProcessingImpl* apm = new rtc::RefCountedObject<AudioProcessingImpl>(
|
return new rtc::RefCountedObject<AudioProcessingImpl>(
|
||||||
config, std::move(capture_post_processing_),
|
config, std::move(capture_post_processing_),
|
||||||
std::move(render_pre_processing_), std::move(echo_control_factory_),
|
std::move(render_pre_processing_), std::move(echo_control_factory_),
|
||||||
std::move(echo_detector_), std::move(capture_analyzer_));
|
std::move(echo_detector_), std::move(capture_analyzer_));
|
||||||
if (apm->Initialize() != AudioProcessing::kNoError) {
|
|
||||||
delete apm;
|
|
||||||
apm = nullptr;
|
|
||||||
}
|
|
||||||
return apm;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,6 +307,8 @@ AudioProcessingImpl::AudioProcessingImpl(
|
|||||||
config_.gain_controller1.analog_gain_controller.enable_digital_adaptive =
|
config_.gain_controller1.analog_gain_controller.enable_digital_adaptive =
|
||||||
!config.Get<ExperimentalAgc>().digital_adaptive_disabled;
|
!config.Get<ExperimentalAgc>().digital_adaptive_disabled;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioProcessingImpl::~AudioProcessingImpl() = default;
|
AudioProcessingImpl::~AudioProcessingImpl() = default;
|
||||||
@ -315,7 +317,8 @@ int AudioProcessingImpl::Initialize() {
|
|||||||
// Run in a single-threaded manner during initialization.
|
// Run in a single-threaded manner during initialization.
|
||||||
MutexLock lock_render(&mutex_render_);
|
MutexLock lock_render(&mutex_render_);
|
||||||
MutexLock lock_capture(&mutex_capture_);
|
MutexLock lock_capture(&mutex_capture_);
|
||||||
return InitializeLocked();
|
InitializeLocked();
|
||||||
|
return kNoError;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioProcessingImpl::Initialize(int capture_input_sample_rate_hz,
|
int AudioProcessingImpl::Initialize(int capture_input_sample_rate_hz,
|
||||||
@ -356,7 +359,7 @@ int AudioProcessingImpl::MaybeInitializeRender(
|
|||||||
return InitializeLocked(processing_config);
|
return InitializeLocked(processing_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioProcessingImpl::InitializeLocked() {
|
void AudioProcessingImpl::InitializeLocked() {
|
||||||
UpdateActiveSubmoduleStates();
|
UpdateActiveSubmoduleStates();
|
||||||
|
|
||||||
const int render_audiobuffer_sample_rate_hz =
|
const int render_audiobuffer_sample_rate_hz =
|
||||||
@ -425,7 +428,6 @@ int AudioProcessingImpl::InitializeLocked() {
|
|||||||
if (aec_dump_) {
|
if (aec_dump_) {
|
||||||
aec_dump_->WriteInitMessage(formats_.api_format, rtc::TimeUTCMillis());
|
aec_dump_->WriteInitMessage(formats_.api_format, rtc::TimeUTCMillis());
|
||||||
}
|
}
|
||||||
return kNoError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) {
|
int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) {
|
||||||
@ -519,7 +521,8 @@ int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) {
|
|||||||
capture_nonlocked_.capture_processing_format.sample_rate_hz();
|
capture_nonlocked_.capture_processing_format.sample_rate_hz();
|
||||||
}
|
}
|
||||||
|
|
||||||
return InitializeLocked();
|
InitializeLocked();
|
||||||
|
return kNoError;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
|
void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
|
||||||
|
@ -140,7 +140,7 @@ class AudioProcessingImpl : public AudioProcessing {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Overridden in a mock.
|
// Overridden in a mock.
|
||||||
virtual int InitializeLocked()
|
virtual void InitializeLocked()
|
||||||
RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_render_, mutex_capture_);
|
RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_render_, mutex_capture_);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -37,9 +37,9 @@ class MockInitialize : public AudioProcessingImpl {
|
|||||||
explicit MockInitialize(const webrtc::Config& config)
|
explicit MockInitialize(const webrtc::Config& config)
|
||||||
: AudioProcessingImpl(config) {}
|
: AudioProcessingImpl(config) {}
|
||||||
|
|
||||||
MOCK_METHOD(int, InitializeLocked, (), (override));
|
MOCK_METHOD(void, InitializeLocked, (), (override));
|
||||||
int RealInitializeLocked() RTC_NO_THREAD_SAFETY_ANALYSIS {
|
void RealInitializeLocked() RTC_NO_THREAD_SAFETY_ANALYSIS {
|
||||||
return AudioProcessingImpl::InitializeLocked();
|
AudioProcessingImpl::InitializeLocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
MOCK_METHOD(void, AddRef, (), (const, override));
|
MOCK_METHOD(void, AddRef, (), (const, override));
|
||||||
|
@ -488,6 +488,7 @@ class RTC_EXPORT AudioProcessing : public rtc::RefCountInterface {
|
|||||||
// rate and number of channels) have changed. Passing updated parameters
|
// rate and number of channels) have changed. Passing updated parameters
|
||||||
// directly to |ProcessStream()| and |ProcessReverseStream()| is permissible.
|
// directly to |ProcessStream()| and |ProcessReverseStream()| is permissible.
|
||||||
// If the parameters are known at init-time though, they may be provided.
|
// If the parameters are known at init-time though, they may be provided.
|
||||||
|
// TODO(webrtc:5298): Change to return void.
|
||||||
virtual int Initialize() = 0;
|
virtual int Initialize() = 0;
|
||||||
|
|
||||||
// The int16 interfaces require:
|
// The int16 interfaces require:
|
||||||
|
@ -30,13 +30,10 @@ AudioProcessing* AudioProcessingBuilderForTesting::Create() {
|
|||||||
|
|
||||||
AudioProcessing* AudioProcessingBuilderForTesting::Create(
|
AudioProcessing* AudioProcessingBuilderForTesting::Create(
|
||||||
const webrtc::Config& config) {
|
const webrtc::Config& config) {
|
||||||
AudioProcessingImpl* apm = new rtc::RefCountedObject<AudioProcessingImpl>(
|
return new rtc::RefCountedObject<AudioProcessingImpl>(
|
||||||
config, std::move(capture_post_processing_),
|
config, std::move(capture_post_processing_),
|
||||||
std::move(render_pre_processing_), std::move(echo_control_factory_),
|
std::move(render_pre_processing_), std::move(echo_control_factory_),
|
||||||
std::move(echo_detector_), std::move(capture_analyzer_));
|
std::move(echo_detector_), std::move(capture_analyzer_));
|
||||||
int error = apm->Initialize();
|
|
||||||
RTC_CHECK_EQ(error, AudioProcessing::kNoError);
|
|
||||||
return apm;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
Reference in New Issue
Block a user