From ff3d7a969ff03764c580ffcb79bd8d4633662d71 Mon Sep 17 00:00:00 2001 From: Kirill Kirilenko Date: Wed, 11 Nov 2020 17:32:27 +0300 Subject: [PATCH] Calculate frame size in AudioEffect --- src/AudioEffect.cpp | 8 +++----- src/AudioEffect.h | 5 +++-- src/AudioProcessor.cpp | 12 ++++-------- src/SpeexDSP.cpp | 9 +++++++-- src/SpeexDSP.h | 6 ++++-- src/WebRTCDSP.cpp | 11 +++++++---- src/WebRTCDSP.h | 6 ++++-- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/AudioEffect.cpp b/src/AudioEffect.cpp index 7959868..f594609 100644 --- a/src/AudioEffect.cpp +++ b/src/AudioEffect.cpp @@ -2,16 +2,14 @@ namespace SpeexWebRTCTest { -AudioEffect::AudioEffect(unsigned int frameSize, - const QAudioFormat& mainFormat, - const QAudioFormat& auxFormat) - : frameSize_(frameSize), mainFormat_(mainFormat), auxFormat_(auxFormat) +AudioEffect::AudioEffect(const QAudioFormat& mainFormat, const QAudioFormat& auxFormat) + : mainFormat_(mainFormat), auxFormat_(auxFormat) { } unsigned int AudioEffect::getFrameSize() const { - return frameSize_; + return mainFormat_.sampleRate() * requiredFrameSizeMs() / 1000; } const QAudioFormat& AudioEffect::getMainFormat() const diff --git a/src/AudioEffect.h b/src/AudioEffect.h index 1c89045..368079f 100644 --- a/src/AudioEffect.h +++ b/src/AudioEffect.h @@ -12,7 +12,7 @@ class AudioEffect : public QObject { Q_OBJECT public: - AudioEffect(unsigned int frameSize, const QAudioFormat& mainFormat, const QAudioFormat& auxFormat); + AudioEffect(const QAudioFormat& mainFormat, const QAudioFormat& auxFormat); virtual void processFrame(QAudioBuffer& mainBuffer, const QAudioBuffer& auxBuffer) = 0; @@ -30,11 +30,12 @@ protected: voiceActive_ = active; } + virtual unsigned int requiredFrameSizeMs() const = 0; + signals: void voiceActivityChanged(bool voice); private: - const unsigned int frameSize_; const QAudioFormat mainFormat_; const QAudioFormat auxFormat_; diff --git a/src/AudioProcessor.cpp b/src/AudioProcessor.cpp index 17b0fe2..0e0234f 100644 --- a/src/AudioProcessor.cpp +++ b/src/AudioProcessor.cpp @@ -196,15 +196,11 @@ Backend AudioProcessor::getCurrentBackend() const void AudioProcessor::switchBackend(Backend backend) { if (backend == Backend::Speex) - { - bufferSize_ = format_.sampleRate() * 0.025; // 25ms - dsp_.reset(new SpeexDSP(bufferSize_, format_, monitorFormat_)); - } + dsp_.reset(new SpeexDSP(format_, monitorFormat_)); else - { - bufferSize_ = format_.sampleRate() * 0.01; // 10ms - dsp_.reset(new WebRTCDSP(bufferSize_, format_, monitorFormat_)); - } + dsp_.reset(new WebRTCDSP(format_, monitorFormat_)); + + bufferSize_ = dsp_->getFrameSize(); connect(dsp_.get(), &AudioEffect::voiceActivityChanged, this, &AudioProcessor::voiceActivityChanged); diff --git a/src/SpeexDSP.cpp b/src/SpeexDSP.cpp index dfb5ece..fc2a547 100644 --- a/src/SpeexDSP.cpp +++ b/src/SpeexDSP.cpp @@ -13,8 +13,8 @@ int on = 1; int off = 0; } // namespace -SpeexDSP::SpeexDSP(unsigned int frameSize, const QAudioFormat& mainFormat, const QAudioFormat& auxFormat) - : AudioEffect(frameSize, mainFormat, auxFormat) +SpeexDSP::SpeexDSP(const QAudioFormat& mainFormat, const QAudioFormat& auxFormat) + : AudioEffect(mainFormat, auxFormat) { preprocess_ = speex_preprocess_state_init(getFrameSize(), getMainFormat().sampleRate()); echo_ = speex_echo_state_init_mc(getFrameSize(), getFrameSize() * 10, @@ -78,4 +78,9 @@ void SpeexDSP::setParameter(const QString& param, QVariant value) throw std::invalid_argument("Invalid param"); } +unsigned int SpeexDSP::requiredFrameSizeMs() const +{ + return 25; +} + } // namespace SpeexWebRTCTest diff --git a/src/SpeexDSP.h b/src/SpeexDSP.h index 0e195a4..530a741 100644 --- a/src/SpeexDSP.h +++ b/src/SpeexDSP.h @@ -10,17 +10,19 @@ typedef struct SpeexEchoState_ SpeexEchoState; namespace SpeexWebRTCTest { -class SpeexDSP : public AudioEffect +class SpeexDSP final : public AudioEffect { Q_OBJECT public: - SpeexDSP(unsigned int frameSize, const QAudioFormat& mainFormat, const QAudioFormat& auxFormat); + SpeexDSP(const QAudioFormat& mainFormat, const QAudioFormat& auxFormat); ~SpeexDSP() override; void processFrame(QAudioBuffer& mainBuffer, const QAudioBuffer& auxBuffer) override; void setParameter(const QString& param, QVariant value) override; private: + unsigned int requiredFrameSizeMs() const override; + SpeexPreprocessState* preprocess_ = nullptr; SpeexEchoState* echo_ = nullptr; diff --git a/src/WebRTCDSP.cpp b/src/WebRTCDSP.cpp index 3bef0e1..ca745b4 100644 --- a/src/WebRTCDSP.cpp +++ b/src/WebRTCDSP.cpp @@ -37,10 +37,8 @@ void convert(const webrtc::AudioFrame& from, QAudioBuffer& to) } // namespace -WebRTCDSP::WebRTCDSP(unsigned int frameSize, - const QAudioFormat& mainFormat, - const QAudioFormat& auxFormat) - : AudioEffect(frameSize, mainFormat, auxFormat) +WebRTCDSP::WebRTCDSP(const QAudioFormat& mainFormat, const QAudioFormat& auxFormat) + : AudioEffect(mainFormat, auxFormat) { apm_ = webrtc::AudioProcessing::Create(); if (!apm_) @@ -181,4 +179,9 @@ void WebRTCDSP::setParameter(const QString& param, QVariant value) throw std::invalid_argument("Invalid param"); } +unsigned int WebRTCDSP::requiredFrameSizeMs() const +{ + return 10; +} + } // namespace SpeexWebRTCTest diff --git a/src/WebRTCDSP.h b/src/WebRTCDSP.h index 8c17b0d..c89881e 100644 --- a/src/WebRTCDSP.h +++ b/src/WebRTCDSP.h @@ -9,17 +9,19 @@ class AudioProcessing; namespace SpeexWebRTCTest { -class WebRTCDSP : public AudioEffect +class WebRTCDSP final : public AudioEffect { Q_OBJECT public: - WebRTCDSP(unsigned int frameSize, const QAudioFormat& mainFormat, const QAudioFormat& auxFormat); + WebRTCDSP(const QAudioFormat& mainFormat, const QAudioFormat& auxFormat); ~WebRTCDSP() override; void processFrame(QAudioBuffer& mainBuffer, const QAudioBuffer& auxBuffer) override; void setParameter(const QString& param, QVariant value) override; private: + unsigned int requiredFrameSizeMs() const override; + webrtc::AudioProcessing* apm_; };