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

Commit f26596b5 authored by jiabin's avatar jiabin
Browse files

APM: use the device profile to update dynamic profiles.

In AIDL HAL, getParameters API is no longer supported. The profiles of
dynamic mix port will be determined by the connected device, which can
be known by calling getAudioPort API. In APM, use the device profiles
to update dynamic profiles when calling getParameters fails.

Bug: 277785275
Test: atest audiopolicy_tests
Test: manually with AIDL HAL
Change-Id: I99455c76267368c19b5be8e1667a10de84e3cedd
parent 61e0b547
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -327,6 +327,24 @@ bool AudioProfileVector::hasDynamicRateFor(audio_format_t format) const
    return false;
}

const SampleRateSet AudioProfileVector::getSampleRatesFor(audio_format_t format) const {
    for (const auto& profile : *this) {
        if (profile->getFormat() == format) {
            return profile->getSampleRates();
        }
    }
    return {};
}

const ChannelMaskSet AudioProfileVector::getChannelMasksFor(audio_format_t format) const {
    for (const auto& profile : *this) {
        if (profile->getFormat() == format) {
            return profile->getChannels();
        }
    }
    return {};
}

bool AudioProfileVector::contains(const sp<AudioProfile>& profile, bool ignoreDynamicFlags) const
{
    for (const auto& audioProfile : *this) {
+3 −0
Original line number Diff line number Diff line
@@ -139,6 +139,9 @@ public:
    bool hasDynamicProfile() const;
    bool hasDynamicRateFor(audio_format_t format) const;

    const SampleRateSet getSampleRatesFor(audio_format_t format) const;
    const ChannelMaskSet getChannelMasksFor(audio_format_t format) const;

    bool contains(const sp<AudioProfile>& profile, bool ignoreDynamicFlags = false) const;

    virtual void dump(std::string *dst, int spaces) const;
+2 −3
Original line number Diff line number Diff line
@@ -167,9 +167,8 @@ status_t StreamHalAidl::getParameters(const String8& keys __unused, String8 *val
    ALOGD("%p %s::%s", this, getClassName().c_str(), __func__);
    TIME_CHECK();
    values->clear();
    if (!mStream) return NO_INIT;
    ALOGE("%s not implemented yet", __func__);
    return OK;
    // AIDL HAL doesn't support getParameters API.
    return INVALID_OPERATION;
}

status_t StreamHalAidl::getFrameSize(size_t *size) {
+19 −9
Original line number Diff line number Diff line
@@ -7708,12 +7708,17 @@ void AudioPolicyManager::updateAudioProfiles(const sp<DeviceDescriptor>& devDesc
                ioHandle, String8(AudioParameter::keyStreamSupportedFormats));
        ALOGV("%s: supported formats %d, %s", __FUNCTION__, ioHandle, reply.string());
        AudioParameter repliedParameters(reply);
        FormatVector formats;
        if (repliedParameters.get(
                String8(AudioParameter::keyStreamSupportedFormats), reply) != NO_ERROR) {
            ALOGE("%s: failed to retrieve format, bailing out", __FUNCTION__);
                String8(AudioParameter::keyStreamSupportedFormats), reply) == NO_ERROR) {
            formats = formatsFromString(reply.string());
        } else if (devDesc->hasValidAudioProfile()) {
            ALOGD("%s: using the device profiles", __func__);
            formats = devDesc->getAudioProfiles().getSupportedFormats();
        } else {
            ALOGE("%s: failed to retrieve format, bailing out", __func__);
            return;
        }
        FormatVector formats = formatsFromString(reply.string());
        mReportedFormatsMap[devDesc] = formats;
        if (device == AUDIO_DEVICE_OUT_HDMI
                || isDeviceOfModule(devDesc, AUDIO_HARDWARE_MODULE_ID_MSD)) {
@@ -7723,7 +7728,7 @@ void AudioPolicyManager::updateAudioProfiles(const sp<DeviceDescriptor>& devDesc
    }

    for (audio_format_t format : profiles.getSupportedFormats()) {
        ChannelMaskSet channelMasks;
        std::optional<ChannelMaskSet> channelMasks;
        SampleRateSet samplingRates;
        AudioParameter requestedParameters;
        requestedParameters.addInt(String8(AudioParameter::keyFormat), format);
@@ -7738,6 +7743,8 @@ void AudioPolicyManager::updateAudioProfiles(const sp<DeviceDescriptor>& devDesc
            if (repliedParameters.get(
                    String8(AudioParameter::keyStreamSupportedSamplingRates), reply) == NO_ERROR) {
                samplingRates = samplingRatesFromString(reply.string());
            } else {
                samplingRates = devDesc->getAudioProfiles().getSampleRatesFor(format);
            }
        }
        if (profiles.hasDynamicChannelsFor(format)) {
@@ -7749,14 +7756,17 @@ void AudioPolicyManager::updateAudioProfiles(const sp<DeviceDescriptor>& devDesc
            if (repliedParameters.get(
                    String8(AudioParameter::keyStreamSupportedChannels), reply) == NO_ERROR) {
                channelMasks = channelMasksFromString(reply.string());
                if (device == AUDIO_DEVICE_OUT_HDMI
                        || isDeviceOfModule(devDesc, AUDIO_HARDWARE_MODULE_ID_MSD)) {
                    modifySurroundChannelMasks(&channelMasks);
            } else {
                channelMasks = devDesc->getAudioProfiles().getChannelMasksFor(format);
            }
            if (channelMasks.has_value() && (device == AUDIO_DEVICE_OUT_HDMI
                    || isDeviceOfModule(devDesc, AUDIO_HARDWARE_MODULE_ID_MSD))) {
                modifySurroundChannelMasks(&channelMasks.value());
            }
        }
        addDynamicAudioProfileAndSort(
                profiles, new AudioProfile(format, channelMasks, samplingRates));
                profiles, new AudioProfile(
                        format, channelMasks.value_or(ChannelMaskSet()), samplingRates));
    }
}