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

Commit b0a7bc9d authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy: set track spatialization state from audio policy manager.

When an audio track is created, AudioPolicyManager.getOutputForAttr()
will return if it is actually being spatialized. This will allow removing
the duplicated logic in audio flinger to tell if a track is spatialized and
also to only enable the spatializer effect if spatialized tracks are active
and connected to the spatializer mixer.

Bug: 227740874
Test: music and spatial audio playback regression
Change-Id: If75c8ad06afdf3b47e3cc5d30c777af22d6fc35e
parent a6a90507
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -959,7 +959,8 @@ status_t AudioSystem::getOutputForAttr(audio_attributes_t* attr,
                                       audio_output_flags_t flags,
                                       audio_port_handle_t* selectedDeviceId,
                                       audio_port_handle_t* portId,
                                       std::vector<audio_io_handle_t>* secondaryOutputs) {
                                       std::vector<audio_io_handle_t>* secondaryOutputs,
                                       bool *isSpatialized) {
    if (attr == nullptr) {
        ALOGE("%s NULL audio attributes", __func__);
        return BAD_VALUE;
@@ -1012,6 +1013,7 @@ status_t AudioSystem::getOutputForAttr(audio_attributes_t* attr,
    *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(responseAidl.portId));
    *secondaryOutputs = VALUE_OR_RETURN_STATUS(convertContainer<std::vector<audio_io_handle_t>>(
            responseAidl.secondaryOutputs, aidl2legacy_int32_t_audio_io_handle_t));
    *isSpatialized = responseAidl.isSpatialized;

    return OK;
}
+2 −0
Original line number Diff line number Diff line
@@ -31,4 +31,6 @@ parcelable GetOutputForAttrResponse {
    int portId;
    /** Interpreted as audio_io_handle_t[]. */
    int[] secondaryOutputs;
    /** True if the track is connected to a spatializer mixer and actually spatialized */
    boolean isSpatialized;
}
+2 −1
Original line number Diff line number Diff line
@@ -286,7 +286,8 @@ public:
                                     audio_output_flags_t flags,
                                     audio_port_handle_t *selectedDeviceId,
                                     audio_port_handle_t *portId,
                                     std::vector<audio_io_handle_t> *secondaryOutputs);
                                     std::vector<audio_io_handle_t> *secondaryOutputs,
                                     bool *isSpatialized);
    static status_t startOutput(audio_port_handle_t portId);
    static status_t stopOutput(audio_port_handle_t portId);
    static void releaseOutput(audio_port_handle_t portId);
+6 −4
Original line number Diff line number Diff line
@@ -585,14 +585,14 @@ status_t AudioFlinger::openMmapStream(MmapStreamInterface::stream_direction_t di
        fullConfig.channel_mask = config->channel_mask;
        fullConfig.format = config->format;
        std::vector<audio_io_handle_t> secondaryOutputs;

        bool isSpatialized;
        ret = AudioSystem::getOutputForAttr(&localAttr, &io,
                                            actualSessionId,
                                            &streamType, client.attributionSource,
                                            &fullConfig,
                                            (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_MMAP_NOIRQ |
                                                    AUDIO_OUTPUT_FLAG_DIRECT),
                                            deviceId, &portId, &secondaryOutputs);
                                            deviceId, &portId, &secondaryOutputs, &isSpatialized);
        ALOGW_IF(!secondaryOutputs.empty(),
                 "%s does not support secondary outputs, ignoring them", __func__);
    } else {
@@ -1034,6 +1034,7 @@ status_t AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
    audio_stream_type_t streamType;
    audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
    std::vector<audio_io_handle_t> secondaryOutputs;
    bool isSpatialized = false;;

    // TODO b/182392553: refactor or make clearer
    pid_t clientPid =
@@ -1077,7 +1078,8 @@ status_t AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
    output.selectedDeviceId = input.selectedDeviceId;
    lStatus = AudioSystem::getOutputForAttr(&localAttr, &output.outputId, sessionId, &streamType,
                                            adjAttributionSource, &input.config, input.flags,
                                            &output.selectedDeviceId, &portId, &secondaryOutputs);
                                            &output.selectedDeviceId, &portId, &secondaryOutputs,
                                            &isSpatialized);

    if (lStatus != NO_ERROR || output.outputId == AUDIO_IO_HANDLE_NONE) {
        ALOGE("createTrack() getOutputForAttr() return error %d or invalid output handle", lStatus);
@@ -1143,7 +1145,7 @@ status_t AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
                                      input.notificationsPerBuffer, input.speed,
                                      input.sharedBuffer, sessionId, &output.flags,
                                      callingPid, adjAttributionSource, input.clientInfo.clientTid,
                                      &lStatus, portId, input.audioTrackCallback);
                                      &lStatus, portId, input.audioTrackCallback, isSpatialized);
        LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (track == 0));
        // we don't abort yet if lStatus != NO_ERROR; there is still work to be done regardless

+4 −1
Original line number Diff line number Diff line
@@ -82,7 +82,8 @@ public:
                                /** default behaviour is to start when there are as many frames
                                  * ready as possible (aka. Buffer is full). */
                                size_t frameCountToBeReady = SIZE_MAX,
                                float speed = 1.0f);
                                float speed = 1.0f,
                                bool isSpatialized = false);
    virtual             ~Track();
    virtual status_t    initCheck() const;

@@ -201,6 +202,7 @@ public:

    audio_output_flags_t getOutputFlags() const { return mFlags; }
    float getSpeed() const { return mSpeed; }
    bool isSpatialized() const override { return mIsSpatialized; }

protected:
    // for numerous
@@ -351,6 +353,7 @@ private:
    audio_output_flags_t mFlags;
    TeePatches  mTeePatches;
    const float         mSpeed;
    const bool          mIsSpatialized;
};  // end of Track


Loading