Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 395b6a12 authored by Vivek Singh's avatar Vivek Singh Committed by Ricardo Cerqueira
Browse files

audioflinger: Fix for removing noise while resuming playback after pause

-Issue: While resuming playback after pausing and seeking to backward,
there is a noise.
-Rootcause: When Resuming a Playback after Pausing and seeking,
AudioResampler's reset() function is resetting their member
variables but derived classes' s member variable are not resetting.
This is causing a noise in Playback because AudioResamplerSinc,
AudioResamplerOrder1 and AudioResamplerCubic's member variables
pointing to some previous state/values.
-Fix: To reset the derived class member variables,
override the reset function in all the derived classes.

Change-Id: I0584947ac203f9470cdc4a680ebccadf60e4e7db
CRs-Fixed: 482838
parent a7108232
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ private:
    static const int kPreInterpShift = kNumPhaseBits - kNumInterpBits;

    void init() {}
    void reset();
    void resampleMono16(int32_t* out, size_t outFrameCount,
            AudioBufferProvider* provider);
    void resampleStereo16(int32_t* out, size_t outFrameCount,
@@ -294,6 +295,14 @@ void AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount,
    }
}

void AudioResamplerOrder1::reset() {
    mInputIndex = 0;
    mPhaseFraction = 0;
    mBuffer.frameCount = 0;
    mX0L = 0;
    mX0R = 0;
}

void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount,
        AudioBufferProvider* provider) {

+8 −0
Original line number Diff line number Diff line
@@ -32,6 +32,14 @@ void AudioResamplerCubic::init() {
    memset(&right, 0, sizeof(state));
}

void AudioResamplerCubic::reset(){
   mInputIndex = 0;
   mPhaseFraction = 0;
   mBuffer.frameCount = 0;
   memset(&left, 0, sizeof(state));
   memset(&right, 0, sizeof(state));
}

void AudioResamplerCubic::resample(int32_t* out, size_t outFrameCount,
        AudioBufferProvider* provider) {

+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ private:
        int32_t a, b, c, y0, y1, y2, y3;
    } state;
    void init();
    void reset ();
    void resampleMono16(int32_t* out, size_t outFrameCount,
            AudioBufferProvider* provider);
    void resampleStereo16(int32_t* out, size_t outFrameCount,
+9 −0
Original line number Diff line number Diff line
@@ -497,6 +497,15 @@ void AudioResamplerSinc::init() {
    mRingFull = mImpulse + (numCoefs+1)*mChannelCount;
}

void AudioResamplerSinc::reset(){
    mInputIndex = 0;
    mPhaseFraction = 0;
    mBuffer.frameCount = 0;
    const Constants& c(*mConstants);
    const size_t stateSize = (2*c.halfNumCoefs) * mChannelCount * 2;
    memset(mState, 0, sizeof(int16_t)*stateSize);
}

void AudioResamplerSinc::setVolume(int16_t left, int16_t right) {
    AudioResampler::setVolume(left, right);
    mVolumeSIMD[0] = int32_t(left)<<16;
+2 −0
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ public:
private:
    void init();

    void reset();

    virtual void setVolume(int16_t left, int16_t right);

    template<int CHANNELS>