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

Commit 10a768a0 authored by Kuowei Li's avatar Kuowei Li
Browse files

audio: add calculateBufferSizeFrames for vendor implementation.

In case of encoded format, the buffer size might be varied due to
vendor implementation. Adding virtual calculateBufferSizeFrames()
so that vendor can override it if necessary.

Bug: 383082824
Test: atest VtsHalAudioCoreTargetTest
Change-Id: Ica146990ce475ddd0183eab7e415277d0a4de270
parent 584871b6
Loading
Loading
Loading
Loading
+26 −4
Original line number Diff line number Diff line
@@ -184,8 +184,12 @@ ndk::ScopedAStatus Module::createStreamContext(
    const int32_t nominalLatencyMs = getNominalLatencyMs(*portConfigIt);
    // Since this is a private method, it is assumed that
    // validity of the portConfigId has already been checked.
    const int32_t minimumStreamBufferSizeFrames =
            calculateBufferSizeFrames(nominalLatencyMs, portConfigIt->sampleRate.value().value);
    int32_t minimumStreamBufferSizeFrames = 0;
    if (!calculateBufferSizeFrames(
                portConfigIt->format.value(), nominalLatencyMs,
                portConfigIt->sampleRate.value().value, &minimumStreamBufferSizeFrames).isOk()) {
        return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
    }
    if (in_bufferSizeFrames < minimumStreamBufferSizeFrames) {
        LOG(ERROR) << __func__ << ": " << mType << ": insufficient buffer size "
                   << in_bufferSizeFrames << ", must be at least " << minimumStreamBufferSizeFrames;
@@ -378,6 +382,18 @@ int32_t Module::getNominalLatencyMs(const AudioPortConfig&) {
    return kLatencyMs;
}

ndk::ScopedAStatus Module::calculateBufferSizeFrames(
        const ::aidl::android::media::audio::common::AudioFormatDescription &format,
        int32_t latencyMs, int32_t sampleRateHz, int32_t *bufferSizeFrames) {
    if (format.type == AudioFormatType::PCM) {
        *bufferSizeFrames = calculateBufferSizeFramesForPcm(latencyMs, sampleRateHz);
        return ndk::ScopedAStatus::ok();
    }
    LOG(ERROR) << __func__ << ": " << mType << ": format " << format.toString()
        << " is not supported";
    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}

ndk::ScopedAStatus Module::createMmapBuffer(
        const ::aidl::android::hardware::audio::core::StreamContext& context __unused,
        ::aidl::android::hardware::audio::core::StreamDescriptor* desc __unused) {
@@ -1123,8 +1139,14 @@ ndk::ScopedAStatus Module::setAudioPatch(const AudioPatch& in_requested, AudioPa
    *_aidl_return = in_requested;
    auto maxSampleRateIt = std::max_element(sampleRates.begin(), sampleRates.end());
    const int32_t latencyMs = getNominalLatencyMs(*(maxSampleRateIt->second));
    _aidl_return->minimumStreamBufferSizeFrames =
            calculateBufferSizeFrames(latencyMs, maxSampleRateIt->first);
    if (!calculateBufferSizeFrames(
                maxSampleRateIt->second->format.value(), latencyMs, maxSampleRateIt->first,
                &_aidl_return->minimumStreamBufferSizeFrames).isOk()) {
        if (patchesBackup.has_value()) {
            mPatches = std::move(*patchesBackup);
        }
        return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
    }
    _aidl_return->latenciesMs.clear();
    _aidl_return->latenciesMs.insert(_aidl_return->latenciesMs.end(),
                                     _aidl_return->sinkPortConfigIds.size(), latencyMs);
+4 −1
Original line number Diff line number Diff line
@@ -207,12 +207,15 @@ class Module : public BnModule {
    virtual std::unique_ptr<Configuration> initializeConfig();
    virtual int32_t getNominalLatencyMs(
            const ::aidl::android::media::audio::common::AudioPortConfig& portConfig);
    virtual ndk::ScopedAStatus calculateBufferSizeFrames(
            const ::aidl::android::media::audio::common::AudioFormatDescription &format,
            int32_t latencyMs, int32_t sampleRateHz, int32_t *bufferSizeFrames);
    virtual ndk::ScopedAStatus createMmapBuffer(
            const ::aidl::android::hardware::audio::core::StreamContext& context,
            ::aidl::android::hardware::audio::core::StreamDescriptor* desc);

    // Utility and helper functions accessible to subclasses.
    static int32_t calculateBufferSizeFrames(int32_t latencyMs, int32_t sampleRateHz) {
    static int32_t calculateBufferSizeFramesForPcm(int32_t latencyMs, int32_t sampleRateHz) {
        const int32_t rawSizeFrames =
                aidl::android::hardware::audio::common::frameCountFromDurationMs(latencyMs,
                                                                                 sampleRateHz);