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

Commit fef5d0cd authored by David Li's avatar David Li Committed by Android Build Cherrypicker Worker
Browse files

libaudiohal@aidl: update AudioPortConfig to HAL if AudioConfig changed

Update the AudioPortConfig's sample rate, channel mask and format if
there is a exist one and the configs are different.

Bug: 251215866
Test: mm
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d02a82fc662d7b326a647fc10e66d374a614f2ad)
Merged-In: I09378c35290f842596a5a853b34bc40797c564b7
Change-Id: I09378c35290f842596a5a853b34bc40797c564b7
parent c5f2ca78
Loading
Loading
Loading
Loading
+53 −28
Original line number Diff line number Diff line
@@ -238,6 +238,29 @@ status_t Hal2AidlMapper::createOrUpdatePortConfig(
    return OK;
}

status_t Hal2AidlMapper::createOrUpdatePortConfigRetry(
        const AudioPortConfig& requestedPortConfig, AudioPortConfig* result, bool* created) {
    AudioPortConfig suggestedOrAppliedPortConfig;
    RETURN_STATUS_IF_ERROR(createOrUpdatePortConfig(requestedPortConfig,
                    &suggestedOrAppliedPortConfig, created));
    if (suggestedOrAppliedPortConfig.id == 0) {
        // Try again with the suggested config
        suggestedOrAppliedPortConfig.id = requestedPortConfig.id;
        AudioPortConfig appliedPortConfig;
        RETURN_STATUS_IF_ERROR(createOrUpdatePortConfig(suggestedOrAppliedPortConfig,
                        &appliedPortConfig, created));
        if (appliedPortConfig.id == 0) {
            ALOGE("%s: module %s did not apply suggested config %s", __func__,
                    mInstance.c_str(), suggestedOrAppliedPortConfig.toString().c_str());
            return NO_INIT;
        }
        *result = appliedPortConfig;
    } else {
        *result = suggestedOrAppliedPortConfig;
    }
    return OK;
}

void Hal2AidlMapper::eraseConnectedPort(int32_t portId) {
    mPorts.erase(portId);
    mConnectedPorts.erase(portId);
@@ -295,28 +318,20 @@ status_t Hal2AidlMapper::findOrCreateDevicePortConfig(
        if (config != nullptr) {
            setPortConfigFromConfig(&requestedPortConfig, *config);
        }
        AudioPortConfig suggestedOrAppliedPortConfig;
        RETURN_STATUS_IF_ERROR(createOrUpdatePortConfig(requestedPortConfig,
                        &suggestedOrAppliedPortConfig, created));
        if (suggestedOrAppliedPortConfig.id == 0) {
            // Try again with the suggested config
            suggestedOrAppliedPortConfig.id = requestedPortConfig.id;
            AudioPortConfig appliedPortConfig;
            RETURN_STATUS_IF_ERROR(createOrUpdatePortConfig(suggestedOrAppliedPortConfig,
                            &appliedPortConfig, created));
            if (appliedPortConfig.id == 0) {
                ALOGE("%s: module %s did not apply suggested config %s", __func__,
                        mInstance.c_str(), suggestedOrAppliedPortConfig.toString().c_str());
                return NO_INIT;
            }
            *portConfig = appliedPortConfig;
        return createOrUpdatePortConfigRetry(requestedPortConfig, portConfig, created);
    } else {
            *portConfig = suggestedOrAppliedPortConfig;
        AudioPortConfig requestedPortConfig = portConfigIt->second;
        if (config != nullptr) {
            setPortConfigFromConfig(&requestedPortConfig, *config);
        }

        if (requestedPortConfig != portConfigIt->second) {
            return createOrUpdatePortConfigRetry(requestedPortConfig, portConfig, created);
        } else {
            *portConfig = portConfigIt->second;
            *created = false;
        }
    }
    return OK;
}

@@ -371,13 +386,13 @@ status_t Hal2AidlMapper::findOrCreateMixPortConfig(
        return BAD_VALUE;
    } else {
        AudioPortConfig requestedPortConfig = portConfigIt->second;
        if (requestedPortConfig.ext.getTag() == AudioPortExt::Tag::mix) {
        setPortConfigFromConfig(&requestedPortConfig, config);

        AudioPortMixExt& mixExt = requestedPortConfig.ext.get<AudioPortExt::Tag::mix>();
        if (mixExt.usecase.getTag() == AudioPortMixExtUseCase::Tag::source &&
                source != AudioSource::SYS_RESERVED_INVALID) {
            mixExt.usecase.get<AudioPortMixExtUseCase::Tag::source>() = source;
        }
        }

        if (requestedPortConfig != portConfigIt->second) {
            return createOrUpdatePortConfig(requestedPortConfig, portConfig, created);
@@ -411,10 +426,20 @@ status_t Hal2AidlMapper::findOrCreatePortConfig(
                requestedPortConfig.ext.get<Tag::mix>().handle, source, destinationPortIds,
                portConfig, created);
    } else if (requestedPortConfig.ext.getTag() == Tag::device) {
        if (const auto& p = requestedPortConfig;
                p.sampleRate.has_value() && p.channelMask.has_value() &&
                p.format.has_value()) {
            AudioConfig config;
            setConfigFromPortConfig(&config, requestedPortConfig);
            return findOrCreateDevicePortConfig(
                    requestedPortConfig.ext.get<Tag::device>().device, &config,
                    portConfig, created);
        } else {
            return findOrCreateDevicePortConfig(
                    requestedPortConfig.ext.get<Tag::device>().device, nullptr /*config*/,
                    portConfig, created);
        }
    }
    ALOGW("%s: unsupported audio port config: %s",
            __func__, requestedPortConfig.toString().c_str());
    return BAD_VALUE;
+3 −0
Original line number Diff line number Diff line
@@ -126,6 +126,9 @@ class Hal2AidlMapper {
    status_t createOrUpdatePortConfig(
            const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig,
            ::aidl::android::media::audio::common::AudioPortConfig* result, bool *created);
    status_t createOrUpdatePortConfigRetry(
            const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig,
            ::aidl::android::media::audio::common::AudioPortConfig* result, bool *created);
    void eraseConnectedPort(int32_t portId);
    status_t findOrCreatePatch(
        const std::set<int32_t>& sourcePortConfigIds,