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

Commit 0064ac30 authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy: return input source updates to audio flinger

Make sure the input source updated by getInputForAttr() is also used by
audio flinger for consistency of source metadata forwarded to the audio HAL.

Bug: 363831992
Test: atest audiopolicymanager_test
Flag: EXEMPT bug fix
Change-Id: I4d59d271deab5c1f4b06dc1c5642c1135a487132
parent c0652c6d
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1415,7 +1415,8 @@ status_t AudioSystem::getInputForAttr(const audio_attributes_t* attr,
                                      audio_config_base_t* config,
                                      audio_input_flags_t flags,
                                      audio_port_handle_t* selectedDeviceId,
                                      audio_port_handle_t* portId) {
                                      audio_port_handle_t* portId,
                                      audio_source_t* source) {
    if (attr == NULL) {
        ALOGE("getInputForAttr NULL attr - shouldn't happen");
        return BAD_VALUE;
@@ -1463,7 +1464,7 @@ status_t AudioSystem::getInputForAttr(const audio_attributes_t* attr,
    *selectedDeviceId = VALUE_OR_RETURN_STATUS(
            aidl2legacy_int32_t_audio_port_handle_t(response.selectedDeviceId));
    *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(response.portId));

    *source = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioSource_audio_source_t(response.source));
    return OK;
}

+3 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.media;

import android.media.audio.common.AudioConfigBase;
import android.media.audio.common.AudioSource;

/**
 * {@hide}
@@ -32,4 +33,6 @@ parcelable GetInputForAttrResponse {
    int virtualDeviceId;
    /** The suggested config if fails to get an input. **/
    AudioConfigBase config;
    /** The audio source, possibly updated by audio policy manager */
    AudioSource source;
}
+3 −1
Original line number Diff line number Diff line
@@ -370,6 +370,7 @@ public:
     * @param[in|out] selectedDeviceId the requested device id for playback, the actual device id
     *                                 for playback will be returned
     * @param[out] portId the generated port id to identify the client
     * @param[out] source the audio source validated by audio policy manager
     * @return if the call is successful or not
     */
    static status_t getInputForAttr(const audio_attributes_t *attr,
@@ -380,7 +381,8 @@ public:
                                    audio_config_base_t *config,
                                    audio_input_flags_t flags,
                                    audio_port_handle_t *selectedDeviceId,
                                    audio_port_handle_t *portId);
                                    audio_port_handle_t *portId,
                                    audio_source_t *source);

    static status_t startInput(audio_port_handle_t portId);
    static status_t stopInput(audio_port_handle_t portId);
+7 −2
Original line number Diff line number Diff line
@@ -649,12 +649,15 @@ status_t AudioFlinger::openMmapStream(MmapStreamInterface::stream_direction_t di
                 "%s does not support secondary outputs, ignoring them", __func__);
    } else {
        audio_port_handle_t deviceId = getFirstDeviceId(*deviceIds);
        audio_source_t source = AUDIO_SOURCE_DEFAULT;
        ret = AudioSystem::getInputForAttr(&localAttr, &io,
                                              RECORD_RIID_INVALID,
                                              actualSessionId,
                                              adjAttributionSource,
                                              config,
                                              AUDIO_INPUT_FLAG_MMAP_NOIRQ, &deviceId, &portId);
                                              AUDIO_INPUT_FLAG_MMAP_NOIRQ,
                                              &deviceId, &portId, &source);
        localAttr.source = source;
        deviceIds->clear();
        if (deviceId != AUDIO_PORT_HANDLE_NONE) {
            deviceIds->push_back(deviceId);
@@ -2587,17 +2590,19 @@ status_t AudioFlinger::createRecord(const media::CreateRecordRequest& _input,
        output.selectedDeviceId = input.selectedDeviceId;
        portId = AUDIO_PORT_HANDLE_NONE;
    }
    audio_source_t source = AUDIO_SOURCE_DEFAULT;
    lStatus = AudioSystem::getInputForAttr(&input.attr, &output.inputId,
                                      input.riid,
                                      sessionId,
                                    // FIXME compare to AudioTrack
                                      adjAttributionSource,
                                      &input.config,
                                      output.flags, &output.selectedDeviceId, &portId);
                                      output.flags, &output.selectedDeviceId, &portId, &source);
    if (lStatus != NO_ERROR) {
        ALOGE("createRecord() getInputForAttr return error %d", lStatus);
        goto Exit;
    }
    input.attr.source = source;

    {
        audio_utils::lock_guard _l(mutex());
+4 −1
Original line number Diff line number Diff line
@@ -10588,6 +10588,7 @@ status_t MmapThread::start(const AudioClient& client,
        config.channel_mask = mChannelMask;
        config.format = mFormat;
        audio_port_handle_t deviceId = getFirstDeviceId(mDeviceIds);
        audio_source_t source = AUDIO_SOURCE_DEFAULT;
        mutex().unlock();
        ret = AudioSystem::getInputForAttr(&localAttr, &io,
                                              RECORD_RIID_INVALID,
@@ -10596,9 +10597,11 @@ status_t MmapThread::start(const AudioClient& client,
                                              &config,
                                              AUDIO_INPUT_FLAG_MMAP_NOIRQ,
                                              &deviceId,
                                              &portId);
                                              &portId,
                                              &source);
        mutex().lock();
        // localAttr is const for getInputForAttr.
        localAttr.source = source;
    }
    // APM should not chose a different input or output stream for the same set of attributes
    // and audo configuration
Loading