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

Commit 17031564 authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

Fix AudioSystem::getAudioPort implementation

The implementation used to try to convert the complete provided
audio port into AIDL before passing to AP Service. The
corresponding AP Service method has been changed to only take
the port ID—the only piece of information which is actually
used by APM.

Bug: 221075345
Test: in preparation by a contractor
Change-Id: Id274ee14a8bfd2dcbfbb22b7a09b89dc6b7314ce
parent 04f3e76b
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -1497,13 +1497,12 @@ status_t AudioSystem::getAudioPort(struct audio_port_v7* port) {
    if (port == nullptr) {
        return BAD_VALUE;
    }

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

    media::AudioPort portAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_v7_AudioPort(*port));
    media::AudioPort portAidl;
    RETURN_STATUS_IF_ERROR(
            statusTFromBinderStatus(aps->getAudioPort(portAidl, &portAidl)));
            statusTFromBinderStatus(aps->getAudioPort(port->id, &portAidl)));
    *port = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioPort_audio_port_v7(portAidl));
    return OK;
}
+2 −2
Original line number Diff line number Diff line
@@ -216,8 +216,8 @@ interface IAudioPolicyService {
                       inout Int count,
                       out AudioPort[] ports);

    /** Get attributes for a given audio port. */
    AudioPort getAudioPort(in AudioPort port);
    /** Get attributes for the audio port with the given id (AudioPort.hal.id field). */
    AudioPort getAudioPort(int /* audio_port_handle_t */ portId);

    /**
     * Create an audio patch between several source and sink ports.
+2 −1
Original line number Diff line number Diff line
@@ -374,7 +374,8 @@ public:
                                   struct audio_port_v7 *ports,
                                   unsigned int *generation);

    /* Get attributes for a given audio port */
    /* Get attributes for a given audio port. On input, the port
     * only needs the 'id' field to be filled in. */
    static status_t getAudioPort(struct audio_port_v7 *port);

    /* Create an audio patch between several source and sink ports */
+2 −5
Original line number Diff line number Diff line
@@ -1567,12 +1567,9 @@ Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
    return Status::ok();
}

Status AudioPolicyService::getAudioPort(const media::AudioPort& portAidl,
Status AudioPolicyService::getAudioPort(int portId,
                                        media::AudioPort* _aidl_return) {
    audio_port_v7 port = VALUE_OR_RETURN_BINDER_STATUS(
            aidl2legacy_AudioPort_audio_port_v7(portAidl));
    RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPort(port)));

    audio_port_v7 port{ .id = portId };
    Mutex::Autolock _l(mLock);
    if (mAudioPolicyManager == NULL) {
        return binderStatusFromStatusT(NO_INIT);
+1 −1
Original line number Diff line number Diff line
@@ -176,7 +176,7 @@ public:
    binder::Status listAudioPorts(media::AudioPortRole role, media::AudioPortType type,
                                  Int* count, std::vector<media::AudioPort>* ports,
                                  int32_t* _aidl_return) override;
    binder::Status getAudioPort(const media::AudioPort& port,
    binder::Status getAudioPort(int portId,
                                media::AudioPort* _aidl_return) override;
    binder::Status createAudioPatch(const media::AudioPatch& patch, int32_t handle,
                                    int32_t* _aidl_return) override;