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

Commit 2279660b authored by Shunkai Yao's avatar Shunkai Yao
Browse files

Effect AIDL: fix several bugs in Visualizer AIDL

 - peak and rms parameter correct
 - fix the capture buffer wrap around copy

Bug: 302132812
Test: atest CtsMediaAudioTestCases
Change-Id: I3404073ddb61d9fdb48d2ddcdb80fdd5c408e3e6
Merged-In: I3404073ddb61d9fdb48d2ddcdb80fdd5c408e3e6
parent 1084dc34
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -169,8 +169,8 @@ status_t AidlConversionVisualizer::visualizerMeasure(uint32_t* replySize, void*
    const auto& measure = VALUE_OR_RETURN_STATUS(GET_PARAMETER_SPECIFIC_FIELD(
            aidlParam, Visualizer, visualizer, Visualizer::measurement, Visualizer::Measurement));
    int32_t* reply = (int32_t *) pReplyData;
    *reply++ = measure.rms;
    *reply = measure.peak;
    *reply++ = measure.peak;
    *reply = measure.rms;
    return OK;
}

+17 −18
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ RetCode VisualizerContext::initParams(const Parameter::Common& common) {
#endif
    mChannelCount = channelCount;
    mCommon = common;
    std::fill(mCaptureBuf.begin(), mCaptureBuf.end(), 0x80);
    return RetCode::SUCCESS;
}

@@ -84,7 +85,7 @@ RetCode VisualizerContext::disable() {

void VisualizerContext::reset() {
    std::lock_guard lg(mMutex);
    std::fill_n(mCaptureBuf.begin(), kMaxCaptureBufSize, 0x80);
    std::fill(mCaptureBuf.begin(), mCaptureBuf.end(), 0x80);
}

RetCode VisualizerContext::setCaptureSamples(int samples) {
@@ -190,13 +191,12 @@ Visualizer::Measurement VisualizerContext::getMeasure() {
}

std::vector<uint8_t> VisualizerContext::capture() {
    std::vector<uint8_t> result;
    std::lock_guard lg(mMutex);
    uint32_t captureSamples = mCaptureSamples;
    std::vector<uint8_t> result(captureSamples, 0x80);
    // cts android.media.audio.cts.VisualizerTest expecting silence data when effect not running
    // RETURN_VALUE_IF(mState != State::ACTIVE, result, "illegalState");
    if (mState != State::ACTIVE) {
        result.resize(mCaptureSamples);
        memset(result.data(), 0x80, mCaptureSamples);
        return result;
    }

@@ -214,7 +214,7 @@ std::vector<uint8_t> VisualizerContext::capture() {
    if (latencyMs < 0) {
        latencyMs = 0;
    }
    uint32_t deltaSamples = mCaptureSamples + mCommon.input.base.sampleRate * latencyMs / 1000;
    uint32_t deltaSamples = captureSamples + mCommon.input.base.sampleRate * latencyMs / 1000;

    // large sample rate, latency, or capture size, could cause overflow.
    // do not offset more than the size of buffer.
@@ -224,21 +224,21 @@ std::vector<uint8_t> VisualizerContext::capture() {
    }

    int32_t capturePoint;
    //capturePoint = (int32_t)mCaptureIdx - deltaSamples;
    __builtin_sub_overflow((int32_t) mCaptureIdx, deltaSamples, &capturePoint);
    // a negative capturePoint means we wrap the buffer.
    if (capturePoint < 0) {
        uint32_t size = -capturePoint;
        if (size > mCaptureSamples) {
            size = mCaptureSamples;
        if (size > captureSamples) {
            size = captureSamples;
        }
        result.insert(result.end(), &mCaptureBuf[kMaxCaptureBufSize + capturePoint],
                        &mCaptureBuf[kMaxCaptureBufSize + capturePoint + size]);
        mCaptureSamples -= size;
        std::copy(std::begin(mCaptureBuf) + kMaxCaptureBufSize - size,
                  std::begin(mCaptureBuf) + kMaxCaptureBufSize, result.begin());
        captureSamples -= size;
        capturePoint = 0;
    }
    result.insert(result.end(), &mCaptureBuf[capturePoint],
                    &mCaptureBuf[capturePoint + mCaptureSamples]);
    std::copy(std::begin(mCaptureBuf) + capturePoint,
              std::begin(mCaptureBuf) + capturePoint + captureSamples,
              result.begin() + mCaptureSamples - captureSamples);
    mLastCaptureIdx = mCaptureIdx;
    return result;
}
@@ -262,10 +262,9 @@ IEffect::Status VisualizerContext::process(float* in, float* out, int samples) {
        }
        maxSample *= 1 << 15; // scale to int16_t, with exactly 1 << 15 representing positive num.
        rmsSqAcc *= 1 << 30; // scale to int16_t * 2
        mPastMeasurements[mMeasurementBufferIdx] = {
        mPastMeasurements[mMeasurementBufferIdx] = {.mIsValid = true,
                                                    .mPeakU16 = (uint16_t)maxSample,
                .mRmsSquared = rmsSqAcc / samples,
                .mIsValid = true };
                                                    .mRmsSquared = rmsSqAcc / samples};
        if (++mMeasurementBufferIdx >= mMeasurementWindowSizeInBuffers) {
            mMeasurementBufferIdx = 0;
        }