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

Commit 16d87618 authored by Ytai Ben-Tsvi's avatar Ytai Ben-Tsvi
Browse files

Include the returned IAudio{Track,Record} in response parcelable

In preparation to AIDLizing IAudioFlinger, having two return values is
inconvenient. It is also not consistent with most other methods, which
mostly return status_t. This change puts the returned
IAudio{Track,Record} in the response parcelable instead of having them
as separate return values.

Test: Audio-related CTS tests from CtsMediaTestCases
Change-Id: I97cbec21ca936b4e00e5caa06760ce00922739e8
parent 71109da4
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -748,7 +748,6 @@ status_t AudioRecord::createRecord_l(const Modulo<uint32_t> &epoch, const String
    IAudioFlinger::CreateRecordInput input;
    IAudioFlinger::CreateRecordOutput output;
    audio_session_t originalSessionId;
    sp<media::IAudioRecord> record;
    void *iMemPointer;
    audio_track_cblk_t* cblk;
    status_t status;
@@ -817,7 +816,7 @@ status_t AudioRecord::createRecord_l(const Modulo<uint32_t> &epoch, const String

    do {
        media::CreateRecordResponse response;
        record = audioFlinger->createRecord(VALUE_OR_FATAL(input.toAidl()), response, &status);
        status = audioFlinger->createRecord(VALUE_OR_FATAL(input.toAidl()), response);
        output = VALUE_OR_FATAL(IAudioFlinger::CreateRecordOutput::fromAidl(response));
        if (status == NO_ERROR) {
            break;
@@ -893,7 +892,7 @@ status_t AudioRecord::createRecord_l(const Modulo<uint32_t> &epoch, const String
        IInterface::asBinder(mAudioRecord)->unlinkToDeath(mDeathNotifier, this);
        mDeathNotifier.clear();
    }
    mAudioRecord = record;
    mAudioRecord = output.audioRecord;
    mCblkMemory = output.cblk;
    mBufferMemory = output.buffers;
    IPCThreadState::self()->flushCommands();
+4 −6
Original line number Diff line number Diff line
@@ -1608,9 +1608,7 @@ status_t AudioTrack::createTrack_l()
    input.opPackageName = mOpPackageName;

    media::CreateTrackResponse response;
    sp<media::IAudioTrack> track = audioFlinger->createTrack(VALUE_OR_FATAL(input.toAidl()),
                                                             response,
                                                             &status);
    status = audioFlinger->createTrack(VALUE_OR_FATAL(input.toAidl()), response);
    IAudioFlinger::CreateTrackOutput output = VALUE_OR_FATAL(
            IAudioFlinger::CreateTrackOutput::fromAidl(
                    response));
@@ -1623,7 +1621,7 @@ status_t AudioTrack::createTrack_l()
        }
        goto exit;
    }
    ALOG_ASSERT(track != 0);
    ALOG_ASSERT(output.audioTrack != 0);

    mFrameCount = output.frameCount;
    mNotificationFramesAct = (uint32_t)output.notificationFrameCount;
@@ -1646,7 +1644,7 @@ status_t AudioTrack::createTrack_l()

    // FIXME compare to AudioRecord
    std::optional<media::SharedFileRegion> sfr;
    track->getCblk(&sfr);
    output.audioTrack->getCblk(&sfr);
    sp<IMemory> iMem = VALUE_OR_FATAL(aidl2legacy_NullableSharedFileRegion_IMemory(sfr));
    if (iMem == 0) {
        ALOGE("%s(%d): Could not get control block", __func__, mPortId);
@@ -1668,7 +1666,7 @@ status_t AudioTrack::createTrack_l()
        IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);
        mDeathNotifier.clear();
    }
    mAudioTrack = track;
    mAudioTrack = output.audioTrack;
    mCblkMemory = iMem;
    IPCThreadState::self()->flushCommands();

+32 −51
Original line number Diff line number Diff line
@@ -153,6 +153,7 @@ IAudioFlinger::CreateTrackOutput::toAidl() const {
    aidl.afLatencyMs = VALUE_OR_RETURN(convertIntegral<int32_t>(afLatencyMs));
    aidl.outputId = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(outputId));
    aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(portId));
    aidl.audioTrack = audioTrack;
    return aidl;
}

@@ -173,6 +174,7 @@ IAudioFlinger::CreateTrackOutput::fromAidl(
    legacy.afLatencyMs = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.afLatencyMs));
    legacy.outputId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.outputId));
    legacy.portId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
    legacy.audioTrack = aidl.audioTrack;
    return legacy;
}

@@ -226,6 +228,7 @@ IAudioFlinger::CreateRecordOutput::toAidl() const {
    aidl.cblk = VALUE_OR_RETURN(legacy2aidl_NullableIMemory_SharedFileRegion(cblk));
    aidl.buffers = VALUE_OR_RETURN(legacy2aidl_NullableIMemory_SharedFileRegion(buffers));
    aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(portId));
    aidl.audioRecord = audioRecord;
    return aidl;
}

@@ -245,6 +248,7 @@ IAudioFlinger::CreateRecordOutput::fromAidl(
    legacy.cblk = VALUE_OR_RETURN(aidl2legacy_NullableSharedFileRegion_IMemory(aidl.cblk));
    legacy.buffers = VALUE_OR_RETURN(aidl2legacy_NullableSharedFileRegion_IMemory(aidl.buffers));
    legacy.portId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
    legacy.audioRecord = aidl.audioRecord;
    return legacy;
}

@@ -256,75 +260,58 @@ public:
    {
    }

    virtual sp<media::IAudioTrack> createTrack(const media::CreateTrackRequest& input,
                                               media::CreateTrackResponse& output,
                                               status_t* status)
    virtual status_t createTrack(const media::CreateTrackRequest& input,
                                 media::CreateTrackResponse& output)
    {
        Parcel data, reply;
        sp<media::IAudioTrack> track;
        status_t status;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());

        if (status == nullptr) {
            return track;
        }

        data.writeParcelable(input);

        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
        if (lStatus != NO_ERROR) {
            ALOGE("createTrack transaction error %d", lStatus);
            *status = DEAD_OBJECT;
            return track;
            return DEAD_OBJECT;
        }
        *status = reply.readInt32();
        if (*status != NO_ERROR) {
            ALOGE("createTrack returned error %d", *status);
            return track;
        status = reply.readInt32();
        if (status != NO_ERROR) {
            ALOGE("createTrack returned error %d", status);
            return status;
        }
        track = interface_cast<media::IAudioTrack>(reply.readStrongBinder());
        if (track == 0) {
        output.readFromParcel(&reply);
        if (output.audioTrack == 0) {
            ALOGE("createTrack returned an NULL IAudioTrack with status OK");
            *status = DEAD_OBJECT;
            return track;
            return DEAD_OBJECT;
        }
        output.readFromParcel(&reply);
        return track;
        return OK;
    }

    virtual sp<media::IAudioRecord> createRecord(const media::CreateRecordRequest& input,
                                                 media::CreateRecordResponse& output,
                                                 status_t* status)
    virtual status_t createRecord(const media::CreateRecordRequest& input,
                                  media::CreateRecordResponse& output)
    {
        Parcel data, reply;
        sp<media::IAudioRecord> record;
        status_t status;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());

        if (status == nullptr) {
            return record;
        }

        data.writeParcelable(input);

        status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply);
        if (lStatus != NO_ERROR) {
            ALOGE("createRecord transaction error %d", lStatus);
            *status = DEAD_OBJECT;
            return record;
            return DEAD_OBJECT;
        }
        *status = reply.readInt32();
        if (*status != NO_ERROR) {
            ALOGE("createRecord returned error %d", *status);
            return record;
        status = reply.readInt32();
        if (status != NO_ERROR) {
            ALOGE("createRecord returned error %d", status);
            return status;
        }

        record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
        if (record == 0) {
        output.readFromParcel(&reply);
        if (output.audioRecord == 0) {
            ALOGE("createRecord returned a NULL IAudioRecord with status OK");
            *status = DEAD_OBJECT;
            return record;
            return DEAD_OBJECT;
        }
        output.readFromParcel(&reply);
        return record;
        return OK;
    }

    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
@@ -1199,16 +1186,13 @@ status_t BnAudioFlinger::onTransact(
            status_t status;
            media::CreateTrackResponse output;

            sp<media::IAudioTrack> track= createTrack(input,
                                                      output,
                                                      &status);
            status = createTrack(input, output);

            LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
            LOG_ALWAYS_FATAL_IF((output.audioTrack != 0) != (status == NO_ERROR));
            reply->writeInt32(status);
            if (status != NO_ERROR) {
                return NO_ERROR;
            }
            reply->writeStrongBinder(IInterface::asBinder(track));
            output.writeToParcel(reply);
            return NO_ERROR;
        } break;
@@ -1224,16 +1208,13 @@ status_t BnAudioFlinger::onTransact(
            status_t status;
            media::CreateRecordResponse output;

            sp<media::IAudioRecord> record = createRecord(input,
                                                          output,
                                                          &status);
            status = createRecord(input, output);

            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
            LOG_ALWAYS_FATAL_IF((output.audioRecord != 0) != (status == NO_ERROR));
            reply->writeInt32(status);
            if (status != NO_ERROR) {
                return NO_ERROR;
            }
            reply->writeStrongBinder(IInterface::asBinder(record));
            output.writeToParcel(reply);
            return NO_ERROR;
        } break;
+3 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.media;

import android.media.IAudioRecord;
import android.media.SharedFileRegion;

/**
@@ -40,4 +41,6 @@ parcelable CreateRecordResponse {
    @nullable SharedFileRegion buffers;
    /** Interpreted as audio_port_handle_t. */
    int portId;
    /** The newly created record. */
    @nullable IAudioRecord audioRecord;
}
+4 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.media;

import android.media.IAudioTrack;

/**
 * CreateTrackOutput contains all output arguments returned by AudioFlinger to AudioTrack
 * when calling createTrack() including arguments that were passed as I/O for update by
@@ -39,4 +41,6 @@ parcelable CreateTrackResponse {
    int outputId;
    /** Interpreted as audio_port_handle_t. */
    int portId;
    /** The newly created track. */
    @nullable IAudioTrack audioTrack;
}
Loading