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

Commit 6c0057a9 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 4496165 from 3700e162 to pi-release

Change-Id: Ifdad3b1f2d008f6b9de65d9ceb80377f07a6ea2b
parents b4785605 3700e162
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -49,7 +49,7 @@ public:
            int index, int colorFormat, bool metaOnly) = 0;
            int index, int colorFormat, bool metaOnly) = 0;
    virtual status_t getFrameAtIndex(
    virtual status_t getFrameAtIndex(
            std::vector<VideoFrame*>* frames,
            std::vector<VideoFrame*>* frames,
            int frameIndex, int numFrames, int colorFormat, bool metaOnly);
            int frameIndex, int numFrames, int colorFormat, bool metaOnly) = 0;
    virtual MediaAlbumArt* extractAlbumArt() = 0;
    virtual MediaAlbumArt* extractAlbumArt() = 0;
    virtual const char* extractMetadata(int keyCode) = 0;
    virtual const char* extractMetadata(int keyCode) = 0;
};
};
+79 −84
Original line number Original line Diff line number Diff line
@@ -296,6 +296,43 @@ void AudioFlinger::EffectModule::process()
    const bool auxType =
    const bool auxType =
            (mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY;
            (mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY;


    // safeInputOutputSampleCount is 0 if the channel count between input and output
    // buffers do not match. This prevents automatic accumulation or copying between the
    // input and output effect buffers without an intermediary effect process.
    // TODO: consider implementing channel conversion.
    const size_t safeInputOutputSampleCount =
            inChannelCount != outChannelCount ? 0
                    : outChannelCount * std::min(
                            mConfig.inputCfg.buffer.frameCount,
                            mConfig.outputCfg.buffer.frameCount);
    const auto accumulateInputToOutput = [this, safeInputOutputSampleCount]() {
#ifdef FLOAT_EFFECT_CHAIN
        accumulate_float(
                mConfig.outputCfg.buffer.f32,
                mConfig.inputCfg.buffer.f32,
                safeInputOutputSampleCount);
#else
        accumulate_i16(
                mConfig.outputCfg.buffer.s16,
                mConfig.inputCfg.buffer.s16,
                safeInputOutputSampleCount);
#endif
    };
    const auto copyInputToOutput = [this, safeInputOutputSampleCount]() {
#ifdef FLOAT_EFFECT_CHAIN
        memcpy(
                mConfig.outputCfg.buffer.f32,
                mConfig.inputCfg.buffer.f32,
                safeInputOutputSampleCount * sizeof(*mConfig.outputCfg.buffer.f32));

#else
        memcpy(
                mConfig.outputCfg.buffer.s16,
                mConfig.inputCfg.buffer.s16,
                safeInputOutputSampleCount * sizeof(*mConfig.outputCfg.buffer.s16));
#endif
    };

    if (isProcessEnabled()) {
    if (isProcessEnabled()) {
        int ret;
        int ret;
        if (isProcessImplemented()) {
        if (isProcessImplemented()) {
@@ -308,97 +345,69 @@ void AudioFlinger::EffectModule::process()
                    static_assert(sizeof(float) <= sizeof(int32_t),
                    static_assert(sizeof(float) <= sizeof(int32_t),
                            "in-place conversion requires sizeof(float) <= sizeof(int32_t)");
                            "in-place conversion requires sizeof(float) <= sizeof(int32_t)");


                    const int32_t * const p32 = mConfig.inputCfg.buffer.s32;
                    memcpy_to_float_from_q4_27(
                    float * const pFloat = mConfig.inputCfg.buffer.f32;
                            mConfig.inputCfg.buffer.f32,
                    memcpy_to_float_from_q4_27(pFloat, p32, mConfig.inputCfg.buffer.frameCount);
                } else {
                    memcpy_to_i16_from_q4_27(mConfig.inputCfg.buffer.s16,
                            mConfig.inputCfg.buffer.s32,
                            mConfig.inputCfg.buffer.s32,
                            mConfig.inputCfg.buffer.frameCount);
                            mConfig.inputCfg.buffer.frameCount);
                }
                } else
#else
#endif
                memcpy_to_i16_from_q4_27(mConfig.inputCfg.buffer.s16,
                {
                    memcpy_to_i16_from_q4_27(
                            mConfig.inputCfg.buffer.s16,
                            mConfig.inputCfg.buffer.s32,
                            mConfig.inputCfg.buffer.s32,
                            mConfig.inputCfg.buffer.frameCount);
                            mConfig.inputCfg.buffer.frameCount);
#endif
                }
            }
            }
#ifdef FLOAT_EFFECT_CHAIN
#ifdef FLOAT_EFFECT_CHAIN
            if (mSupportsFloat) {
            if (!mSupportsFloat) { // convert input to int16_t as effect doesn't support float.
                ret = mEffectInterface->process();
            } else {
                {   // convert input to int16_t as effect doesn't support float.
                if (!auxType) {
                if (!auxType) {
                    if (mInConversionBuffer.get() == nullptr) {
                    if (mInConversionBuffer.get() == nullptr) {
                        ALOGW("%s: mInConversionBuffer is null, bypassing", __func__);
                        ALOGW("%s: mInConversionBuffer is null, bypassing", __func__);
                        goto data_bypass;
                        goto data_bypass;
                    }
                    }
                        const float * const pIn = mInBuffer->audioBuffer()->f32;
                        int16_t * const pIn16 = mInConversionBuffer->audioBuffer()->s16;
                    memcpy_to_i16_from_float(
                    memcpy_to_i16_from_float(
                                pIn16, pIn, inChannelCount * mConfig.inputCfg.buffer.frameCount);
                            mInConversionBuffer->audioBuffer()->s16,
                            mInBuffer->audioBuffer()->f32,
                            inChannelCount * mConfig.inputCfg.buffer.frameCount);
                }
                }
                if (mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
                if (mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
                    if (mOutConversionBuffer.get() == nullptr) {
                    if (mOutConversionBuffer.get() == nullptr) {
                        ALOGW("%s: mOutConversionBuffer is null, bypassing", __func__);
                        ALOGW("%s: mOutConversionBuffer is null, bypassing", __func__);
                        goto data_bypass;
                        goto data_bypass;
                    }
                    }
                        int16_t * const pOut16 = mOutConversionBuffer->audioBuffer()->s16;
                        const float * const pOut = mOutBuffer->audioBuffer()->f32;
                    memcpy_to_i16_from_float(
                    memcpy_to_i16_from_float(
                                pOut16,
                            mOutConversionBuffer->audioBuffer()->s16,
                                pOut,
                            mOutBuffer->audioBuffer()->f32,
                            outChannelCount * mConfig.outputCfg.buffer.frameCount);
                            outChannelCount * mConfig.outputCfg.buffer.frameCount);
                }
                }
            }
            }
#endif


            ret = mEffectInterface->process();
            ret = mEffectInterface->process();


                {   // convert output back to float.
#ifdef FLOAT_EFFECT_CHAIN
                    const int16_t * const pOut16 = mOutConversionBuffer->audioBuffer()->s16;
            if (!mSupportsFloat) { // convert output int16_t back to float.
                    float * const pOut = mOutBuffer->audioBuffer()->f32;
                memcpy_to_float_from_i16(
                memcpy_to_float_from_i16(
                            pOut, pOut16, outChannelCount * mConfig.outputCfg.buffer.frameCount);
                        mOutBuffer->audioBuffer()->f32,
                }
                        mOutConversionBuffer->audioBuffer()->s16,
                        outChannelCount * mConfig.outputCfg.buffer.frameCount);
            }
            }
#else
            ret = mEffectInterface->process();
#endif
#endif
        } else {
        } else {
#ifdef FLOAT_EFFECT_CHAIN
#ifdef FLOAT_EFFECT_CHAIN
            data_bypass:
            data_bypass:
#endif
#endif
            if (!auxType  /* aux effects do not require data bypass */
            if (!auxType  /* aux effects do not require data bypass */
                    && mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw
                    && mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw) {
                    && inChannelCount == outChannelCount) {
                const size_t sampleCount = std::min(
                        mConfig.inputCfg.buffer.frameCount,
                        mConfig.outputCfg.buffer.frameCount) * outChannelCount;

#ifdef FLOAT_EFFECT_CHAIN
                const float * const in = mConfig.inputCfg.buffer.f32;
                float * const out = mConfig.outputCfg.buffer.f32;

                if (mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
                    accumulate_float(out, in, sampleCount);
                } else {
                    memcpy(mConfig.outputCfg.buffer.f32, mConfig.inputCfg.buffer.f32,
                            sampleCount * sizeof(*mConfig.outputCfg.buffer.f32));
                }

#else
                const int16_t * const in = mConfig.inputCfg.buffer.s16;
                int16_t * const out = mConfig.outputCfg.buffer.s16;

                if (mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
                if (mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
                    accumulate_i16(out, in, sampleCount);
                    accumulateInputToOutput();
                } else {
                } else {
                    memcpy(mConfig.outputCfg.buffer.s16, mConfig.inputCfg.buffer.s16,
                    copyInputToOutput();
                            sampleCount * sizeof(*mConfig.outputCfg.buffer.s16));
                }
                }
#endif
            }
            }
            ret = -ENODATA;
            ret = -ENODATA;
        }
        }

        // force transition to IDLE state when engine is ready
        // force transition to IDLE state when engine is ready
        if (mState == STOPPED && ret == -ENODATA) {
        if (mState == STOPPED && ret == -ENODATA) {
            mDisableWaitCnt = 1;
            mDisableWaitCnt = 1;
@@ -417,21 +426,8 @@ void AudioFlinger::EffectModule::process()
        // If an insert effect is idle and input buffer is different from output buffer,
        // If an insert effect is idle and input buffer is different from output buffer,
        // accumulate input onto output
        // accumulate input onto output
        sp<EffectChain> chain = mChain.promote();
        sp<EffectChain> chain = mChain.promote();
        if (chain != 0
        if (chain.get() != nullptr && chain->activeTrackCnt() != 0) {
                && chain->activeTrackCnt() != 0
            accumulateInputToOutput();
                && inChannelCount == outChannelCount) {
            const size_t sampleCount = std::min(
                    mConfig.inputCfg.buffer.frameCount,
                    mConfig.outputCfg.buffer.frameCount) * outChannelCount;
#ifdef FLOAT_EFFECT_CHAIN
            const float * const in = mConfig.inputCfg.buffer.f32;
            float * const out = mConfig.outputCfg.buffer.f32;
            accumulate_float(out, in, sampleCount);
#else
            const int16_t * const in = mConfig.inputCfg.buffer.s16;
            int16_t * const out = mConfig.outputCfg.buffer.s16;
            accumulate_i16(out, in, sampleCount);
#endif
        }
        }
    }
    }
}
}
@@ -927,7 +923,6 @@ void AudioFlinger::EffectModule::setInBuffer(const sp<EffectBufferHalInterface>&
            (void)EffectBufferHalInterface::allocate(size, &mInConversionBuffer);
            (void)EffectBufferHalInterface::allocate(size, &mInConversionBuffer);
        }
        }
        if (mInConversionBuffer.get() != nullptr) {
        if (mInConversionBuffer.get() != nullptr) {
            // FIXME: confirm buffer has enough size.
            mInConversionBuffer->setFrameCount(inFrameCount);
            mInConversionBuffer->setFrameCount(inFrameCount);
            mEffectInterface->setInBuffer(mInConversionBuffer);
            mEffectInterface->setInBuffer(mInConversionBuffer);
        } else if (size > 0) {
        } else if (size > 0) {
+4 −6
Original line number Original line Diff line number Diff line
@@ -27,14 +27,12 @@ namespace android {


sp<AudioPort> AudioPortVector::findByTagName(const String8 &tagName) const
sp<AudioPort> AudioPortVector::findByTagName(const String8 &tagName) const
{
{
    sp<AudioPort> port = 0;
    for (const auto& port : *this) {
    for (size_t i = 0; i < size(); i++) {
        if (port->getTagName() == tagName) {
        if (itemAt(i)->getTagName() == tagName) {
            return port;
            port = itemAt(i);
            break;
        }
        }
    }
    }
    return port;
    return nullptr;
}
}


status_t AudioRouteVector::dump(int fd, int spaces) const
status_t AudioRouteVector::dump(int fd, int spaces) const
+8 −10
Original line number Original line Diff line number Diff line
@@ -74,11 +74,11 @@ void AudioPort::toAudioPort(struct audio_port *port) const
    SortedVector<audio_format_t> flatenedFormats;
    SortedVector<audio_format_t> flatenedFormats;
    SampleRateVector flatenedRates;
    SampleRateVector flatenedRates;
    ChannelsVector flatenedChannels;
    ChannelsVector flatenedChannels;
    for (size_t profileIndex = 0; profileIndex < mProfiles.size(); profileIndex++) {
    for (const auto& profile : mProfiles) {
        if (mProfiles[profileIndex]->isValid()) {
        if (profile->isValid()) {
            audio_format_t formatToExport = mProfiles[profileIndex]->getFormat();
            audio_format_t formatToExport = profile->getFormat();
            const SampleRateVector &ratesToExport = mProfiles[profileIndex]->getSampleRates();
            const SampleRateVector &ratesToExport = profile->getSampleRates();
            const ChannelsVector &channelsToExport = mProfiles[profileIndex]->getChannels();
            const ChannelsVector &channelsToExport = profile->getChannels();


            if (flatenedFormats.indexOf(formatToExport) < 0) {
            if (flatenedFormats.indexOf(formatToExport) < 0) {
                flatenedFormats.add(formatToExport);
                flatenedFormats.add(formatToExport);
@@ -130,14 +130,12 @@ void AudioPort::toAudioPort(struct audio_port *port) const


void AudioPort::importAudioPort(const sp<AudioPort>& port, bool force __unused)
void AudioPort::importAudioPort(const sp<AudioPort>& port, bool force __unused)
{
{
    size_t indexToImport;
    for (const auto& profileToImport : port->mProfiles) {
    for (indexToImport = 0; indexToImport < port->mProfiles.size(); indexToImport++) {
        const sp<AudioProfile> &profileToImport = port->mProfiles[indexToImport];
        if (profileToImport->isValid()) {
        if (profileToImport->isValid()) {
            // Import only valid port, i.e. valid format, non empty rates and channels masks
            // Import only valid port, i.e. valid format, non empty rates and channels masks
            bool hasSameProfile = false;
            bool hasSameProfile = false;
            for (size_t profileIndex = 0; profileIndex < mProfiles.size(); profileIndex++) {
            for (const auto& profile : mProfiles) {
                if (*mProfiles[profileIndex] == *profileToImport) {
                if (*profile == *profileToImport) {
                    // never import a profile twice
                    // never import a profile twice
                    hasSameProfile = true;
                    hasSameProfile = true;
                    break;
                    break;
+1 −2
Original line number Original line Diff line number Diff line
@@ -233,8 +233,7 @@ status_t AudioProfileVector::checkExactProfile(uint32_t samplingRate,
        return NO_ERROR;
        return NO_ERROR;
    }
    }


    for (size_t i = 0; i < size(); i++) {
    for (const auto& profile : *this) {
        const sp<AudioProfile> profile = itemAt(i);
        if (profile->checkExact(samplingRate, channelMask, format) == NO_ERROR) {
        if (profile->checkExact(samplingRate, channelMask, format) == NO_ERROR) {
            return NO_ERROR;
            return NO_ERROR;
        }
        }
Loading