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

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

Add selectPresentation API to IAudioTrack

The Java AudioTrack interface has a setPresentation API. This
calls the setParameters API in IAudioTrack. However, this does
not eventuate into a call into the android.hardware.audio@4.0
IStreamOut selectPresentation API.

Add selectPresentation API to IAudioTrack and call down to the
android.hardware.audio@4.0 IStreamOut selectPresentation API.
Translate into calls to setParameters API for legacy HAL
interfaces.

Bug: 63901775
Test: compile
Change-Id: Id634a107f3f93ab18dc80d2bd0af67bda35e859f
parent e4eb88fa
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -2452,13 +2452,8 @@ status_t AudioTrack::setParameters(const String8& keyValuePairs)
status_t AudioTrack::selectPresentation(int presentationId, int programId)
{
    AutoMutex lock(mLock);
    AudioParameter param = AudioParameter();
    param.addInt(String8(AudioParameter::keyPresentationId), presentationId);
    param.addInt(String8(AudioParameter::keyProgramId), programId);
    ALOGV("%s(%d): PresentationId/ProgramId[%s]",
            __func__, mId, param.toString().string());

    return mAudioTrack->setParameters(param.toString());
    ALOGV("%s(%d): PresentationId:%d ProgramId:%d", __func__, mId, presentationId, programId);
    return mAudioTrack->selectPresentation(presentationId, programId);
}

VolumeShaper::Status AudioTrack::applyVolumeShaper(
+19 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ enum {
    PAUSE,
    ATTACH_AUX_EFFECT,
    SET_PARAMETERS,
    SELECT_PRESENTATION,
    GET_TIMESTAMP,
    SIGNAL,
    APPLY_VOLUME_SHAPER,
@@ -127,6 +128,19 @@ public:
        return status;
    }

    /* Selects the presentation (if available) */
    virtual status_t selectPresentation(int presentationId, int programId) {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        data.writeInt32(presentationId);
        data.writeInt32(programId);
        status_t status = remote()->transact(SELECT_PRESENTATION, data, &reply);
        if (status == NO_ERROR) {
            status = reply.readInt32();
        }
        return status;
    }

    virtual status_t getTimestamp(AudioTimestamp& timestamp) {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
@@ -239,6 +253,11 @@ status_t BnAudioTrack::onTransact(
            reply->writeInt32(setParameters(keyValuePairs));
            return NO_ERROR;
        } break;
        case SELECT_PRESENTATION: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            reply->writeInt32(selectPresentation(data.readInt32(), data.readInt32()));
            return NO_ERROR;
        } break;
        case GET_TIMESTAMP: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            AudioTimestamp timestamp;
+3 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ public:
    /* Send parameters to the audio hardware */
    virtual status_t    setParameters(const String8& keyValuePairs) = 0;

    /* Selects the presentation (if available) */
    virtual status_t    selectPresentation(int presentationId, int programId) = 0;

    /* Return NO_ERROR if timestamp is valid.  timestamp is undefined otherwise. */
    virtual status_t    getTimestamp(AudioTimestamp& timestamp) = 0;

+19 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <android/hardware/audio/2.0/IStreamOutCallback.h>
#include <android/hardware/audio/4.0/IStreamOutCallback.h>
#include <hwbinder/IPCThreadState.h>
#include <media/AudioParameter.h>
#include <mediautils/SchedulingPolicyService.h>
#include <utils/Log.h>

@@ -347,6 +348,24 @@ status_t StreamOutHalHidl::setVolume(float left, float right) {
    return processReturn("setVolume", mStream->setVolume(left, right));
}

#if MAJOR_VERSION == 2
status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
    if (mStream == 0) return NO_INIT;
    std::vector<ParameterValue> parameters;
    String8 halParameters;
    parameters.push_back({AudioParameter::keyPresentationId, std::to_string(presentationId)});
    parameters.push_back({AudioParameter::keyProgramId, std::to_string(programId)});
    parametersToHal(hidl_vec<ParameterValue>(parameters), &halParameters);
    return setParameters(halParameters);
}
#elif MAJOR_VERSION == 4
status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
    if (mStream == 0) return NO_INIT;
    return processReturn("selectPresentation",
            mStream->selectPresentation(presentationId, programId));
}
#endif

status_t StreamOutHalHidl::write(const void *buffer, size_t bytes, size_t *written) {
    if (mStream == 0) return NO_INIT;
    *written = 0;
+3 −0
Original line number Diff line number Diff line
@@ -131,6 +131,9 @@ class StreamOutHalHidl : public StreamOutHalInterface, public StreamHalHidl {
    // Use this method in situations where audio mixing is done in the hardware.
    virtual status_t setVolume(float left, float right);

    // Selects the audio presentation (if available).
    virtual status_t selectPresentation(int presentationId, int programId);

    // Write audio buffer to driver.
    virtual status_t write(const void *buffer, size_t bytes, size_t *written);

Loading