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

Commit ba028d00 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add getDirectProfilesForAttributes"

parents 190fcdaf f2196d8f
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -2314,6 +2314,28 @@ status_t AudioSystem::getDirectPlaybackSupport(const audio_attributes_t *attr,
    return NO_ERROR;
}

status_t AudioSystem::getDirectProfilesForAttributes(const audio_attributes_t* attr,
                                                std::vector<audio_profile>* audioProfiles) {
    if (attr == nullptr) {
        return BAD_VALUE;
    }

    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) {
        return PERMISSION_DENIED;
    }

    media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
            legacy2aidl_audio_attributes_t_AudioAttributesInternal(*attr));

    std::vector<media::audio::common::AudioProfile> audioProfilesAidl;
    RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
            aps->getDirectProfilesForAttributes(attrAidl, &audioProfilesAidl)));
    *audioProfiles = VALUE_OR_RETURN_STATUS(convertContainer<std::vector<audio_profile>>(
                    audioProfilesAidl, aidl2legacy_AudioProfile_audio_profile, false /*isInput*/));

    return NO_ERROR;
}

class CaptureStateListenerImpl : public media::BnCaptureStateListener,
                                 public IBinder::DeathRecipient {
+8 −1
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.media.audio.common.AudioDevice;
import android.media.audio.common.AudioDeviceDescription;
import android.media.audio.common.AudioFormatDescription;
import android.media.audio.common.AudioMode;
import android.media.audio.common.AudioProfile;
import android.media.audio.common.AudioOffloadInfo;
import android.media.audio.common.AudioSource;
import android.media.audio.common.AudioStreamType;
@@ -383,4 +384,10 @@ interface IAudioPolicyService {
     */
    AudioDirectMode getDirectPlaybackSupport(in AudioAttributesInternal attr,
                                              in AudioConfig config);

    /**
     * Query audio profiles available for direct playback on the current output device(s)
     * for the specified audio attributes.
     */
    AudioProfile[] getDirectProfilesForAttributes(in AudioAttributesInternal attr);
}
+15 −0
Original line number Diff line number Diff line
@@ -122,6 +122,21 @@ convertContainer(const InputContainer& input, const Func& itemConversion) {
    return output;
}

/**
 * A generic template that helps convert containers of convertible types
 * using an item conversion function with an additional parameter.
 */
template<typename OutputContainer, typename InputContainer, typename Func, typename Parameter>
ConversionResult<OutputContainer>
convertContainer(const InputContainer& input, const Func& itemConversion, const Parameter& param) {
    OutputContainer output;
    auto ins = std::inserter(output, output.begin());
    for (const auto& item : input) {
        *ins = VALUE_OR_RETURN(itemConversion(item, param));
    }
    return output;
}

/**
 * A generic template that helps to "zip" two input containers of the same size
 * into a single vector of converted types. The conversion function must
+10 −0
Original line number Diff line number Diff line
@@ -550,6 +550,16 @@ public:
                                             audio_direct_mode_t *directMode);


    /**
     * Query which direct audio profiles are available for the specified audio attributes.
     * @param attr audio attributes describing the playback use case
     * @param audioProfiles out: a vector of audio profiles
     * @return NO_ERROR in case of success, DEAD_OBJECT, NO_INIT, BAD_VALUE, PERMISSION_DENIED
     *         in case of error.
     */
    static status_t getDirectProfilesForAttributes(const audio_attributes_t* attr,
                                            std::vector<audio_profile>* audioProfiles);

    // A listener for capture state changes.
    class CaptureStateListener : public virtual RefBase {
    public:
+45 −24
Original line number Diff line number Diff line
@@ -154,6 +154,26 @@ AudioProfile& AudioProfile::operator=(const AudioProfile& other) {

ConversionResult<AudioProfile::Aidl>
AudioProfile::toParcelable(bool isInput) const {
    media::audio::common::AudioProfile parcelable = VALUE_OR_RETURN(toCommonParcelable(isInput));
    media::AudioProfileSys parcelableSys;
    parcelableSys.isDynamicFormat = mIsDynamicFormat;
    parcelableSys.isDynamicChannels = mIsDynamicChannels;
    parcelableSys.isDynamicRate = mIsDynamicRate;
    return std::make_pair(parcelable, parcelableSys);
}

ConversionResult<sp<AudioProfile>> AudioProfile::fromParcelable(
        const AudioProfile::Aidl& aidl, bool isInput) {
    sp<AudioProfile> legacy = VALUE_OR_RETURN(fromCommonParcelable(aidl.first, isInput));
    const auto& parcelableSys = aidl.second;
    legacy->mIsDynamicFormat = parcelableSys.isDynamicFormat;
    legacy->mIsDynamicChannels = parcelableSys.isDynamicChannels;
    legacy->mIsDynamicRate = parcelableSys.isDynamicRate;
    return legacy;
}

ConversionResult<media::audio::common::AudioProfile>
AudioProfile::toCommonParcelable(bool isInput) const {
    media::audio::common::AudioProfile parcelable;
    parcelable.name = mName;
    parcelable.format = VALUE_OR_RETURN(
@@ -173,35 +193,26 @@ AudioProfile::toParcelable(bool isInput) const {
                                                   convertIntegral<int32_t, uint32_t>));
    parcelable.encapsulationType = VALUE_OR_RETURN(
            legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(mEncapsulationType));
    media::AudioProfileSys parcelableSys;
    parcelableSys.isDynamicFormat = mIsDynamicFormat;
    parcelableSys.isDynamicChannels = mIsDynamicChannels;
    parcelableSys.isDynamicRate = mIsDynamicRate;
    return std::make_pair(parcelable, parcelableSys);
    return parcelable;
}

ConversionResult<sp<AudioProfile>> AudioProfile::fromParcelable(
        const AudioProfile::Aidl& aidl, bool isInput) {
ConversionResult<sp<AudioProfile>> AudioProfile::fromCommonParcelable(
        const media::audio::common::AudioProfile& aidl, bool isInput) {
    sp<AudioProfile> legacy = new AudioProfile();
    const auto& parcelable = aidl.first;
    legacy->mName = parcelable.name;
    legacy->mName = aidl.name;
    legacy->mFormat = VALUE_OR_RETURN(
            aidl2legacy_AudioFormatDescription_audio_format_t(parcelable.format));
            aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
    legacy->mChannelMasks = VALUE_OR_RETURN(
            convertContainer<ChannelMaskSet>(parcelable.channelMasks,
            convertContainer<ChannelMaskSet>(aidl.channelMasks,
            [isInput](const AudioChannelLayout& l) {
                return aidl2legacy_AudioChannelLayout_audio_channel_mask_t(l, isInput);
            }));
    legacy->mSamplingRates = VALUE_OR_RETURN(
            convertContainer<SampleRateSet>(parcelable.sampleRates,
            convertContainer<SampleRateSet>(aidl.sampleRates,
                                            convertIntegral<uint32_t, int32_t>));
    legacy->mEncapsulationType = VALUE_OR_RETURN(
            aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
                    parcelable.encapsulationType));
    const auto& parcelableSys = aidl.second;
    legacy->mIsDynamicFormat = parcelableSys.isDynamicFormat;
    legacy->mIsDynamicChannels = parcelableSys.isDynamicChannels;
    legacy->mIsDynamicRate = parcelableSys.isDynamicRate;
                    aidl.encapsulationType));
    return legacy;
}

@@ -215,6 +226,16 @@ legacy2aidl_AudioProfile(const sp<AudioProfile>& legacy, bool isInput) {
    return legacy->toParcelable(isInput);
}

ConversionResult<sp<AudioProfile>>
aidl2legacy_AudioProfile_common(const media::audio::common::AudioProfile& aidl, bool isInput) {
    return AudioProfile::fromCommonParcelable(aidl, isInput);
}

ConversionResult<media::audio::common::AudioProfile>
legacy2aidl_AudioProfile_common(const sp<AudioProfile>& legacy, bool isInput) {
    return legacy->toCommonParcelable(isInput);
}

ssize_t AudioProfileVector::add(const sp<AudioProfile> &profile)
{
    ssize_t index = size();
Loading