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

Commit 53cec228 authored by Glenn Kasten's avatar Glenn Kasten
Browse files

Add IAudioTrack::getTimestamp()

with dummy implementation in AudioFlinger::TrackHandle, and
implement AudioTrack::getTimestamp() using IAudioTrack.

Also document invariant that mAudioTrack and control block are always
non-0 after successful initialization.

Change-Id: I9861d1454cff7decf795d5d5898ac7999a9f3b7e
parent ce70374b
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ public:
     *  - INVALID_OPERATION: AudioTrack is already initialized
     *  - BAD_VALUE: invalid parameter (channelMask, format, sampleRate...)
     *  - NO_INIT: audio server or audio hardware not initialized
     * If status is not equal to NO_ERROR, don't call any other APIs on this AudioTrack.
     * If sharedBuffer is non-0, the frameCount parameter is ignored and
     * replaced by the shared buffer's total allocated size in frame units.
     *
@@ -249,7 +250,7 @@ public:
                            transfer_type transferType = TRANSFER_DEFAULT,
                            const audio_offload_info_t *offloadInfo = NULL);

    /* Result of constructing the AudioTrack. This must be checked
    /* Result of constructing the AudioTrack. This must be checked for successful initialization
     * before using any AudioTrack API (except for set()), because using
     * an uninitialized AudioTrack produces undefined results.
     * See set() method above for possible return codes.
@@ -646,7 +647,7 @@ protected:
            bool     isOffloaded() const
                { return (mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0; }

    // may be changed if IAudioTrack is re-created
    // Next 3 fields may be changed if IAudioTrack is re-created, but always != 0
    sp<IAudioTrack>         mAudioTrack;
    sp<IMemory>             mCblkMemory;
    audio_track_cblk_t*     mCblk;                  // re-load after mLock.unlock()
+4 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <binder/IMemory.h>
#include <utils/LinearTransform.h>
#include <utils/String8.h>
#include <media/AudioTimestamp.h>

namespace android {

@@ -86,6 +87,9 @@ public:

    /* Send parameters to the audio hardware */
    virtual status_t    setParameters(const String8& keyValuePairs) = 0;

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

// ----------------------------------------------------------------------------
+7 −10
Original line number Diff line number Diff line
@@ -148,10 +148,8 @@ AudioTrack::~AudioTrack()
            mAudioTrackThread->requestExitAndWait();
            mAudioTrackThread.clear();
        }
        if (mAudioTrack != 0) {
        mAudioTrack->asBinder()->unlinkToDeath(mDeathNotifier, this);
        mAudioTrack.clear();
        }
        IPCThreadState::self()->flushCommands();
        AudioSystem::releaseAudioSessionId(mSessionId);
    }
@@ -222,6 +220,7 @@ status_t AudioTrack::set(

    AutoMutex lock(mLock);

    // invariant that mAudioTrack != 0 is true only after set() returns successfully
    if (mAudioTrack != 0) {
        ALOGE("Track already in use");
        return INVALID_OPERATION;
@@ -965,6 +964,7 @@ status_t AudioTrack::createTrack_l(
        ALOGE("Could not get control block");
        return NO_INIT;
    }
    // invariant that mAudioTrack != 0 is true only after set() returns successfully
    if (mAudioTrack != 0) {
        mAudioTrack->asBinder()->unlinkToDeath(mDeathNotifier, this);
        mDeathNotifier.clear();
@@ -1705,16 +1705,13 @@ status_t AudioTrack::restoreTrack_l(const char *from)
status_t AudioTrack::setParameters(const String8& keyValuePairs)
{
    AutoMutex lock(mLock);
    if (mAudioTrack != 0) {
    return mAudioTrack->setParameters(keyValuePairs);
    } else {
        return NO_INIT;
    }
}

status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)
{
    return INVALID_OPERATION;
    AutoMutex lock(mLock);
    return mAudioTrack->getTimestamp(timestamp);
}

String8 AudioTrack::getParameters(const String8& keys)
+29 −1
Original line number Diff line number Diff line
@@ -39,7 +39,8 @@ enum {
    ALLOCATE_TIMED_BUFFER,
    QUEUE_TIMED_BUFFER,
    SET_MEDIA_TIME_TRANSFORM,
    SET_PARAMETERS
    SET_PARAMETERS,
    GET_TIMESTAMP,
};

class BpAudioTrack : public BpInterface<IAudioTrack>
@@ -166,6 +167,21 @@ public:
        }
        return status;
    }

    virtual status_t getTimestamp(AudioTimestamp& timestamp) {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        status_t status = remote()->transact(GET_TIMESTAMP, data, &reply);
        if (status == NO_ERROR) {
            status = reply.readInt32();
            if (status == NO_ERROR) {
                timestamp.mPosition = reply.readInt32();
                timestamp.mTime.tv_sec = reply.readInt32();
                timestamp.mTime.tv_nsec = reply.readInt32();
            }
        }
        return status;
    }
};

IMPLEMENT_META_INTERFACE(AudioTrack, "android.media.IAudioTrack");
@@ -241,6 +257,18 @@ status_t BnAudioTrack::onTransact(
            reply->writeInt32(setParameters(keyValuePairs));
            return NO_ERROR;
        } break;
        case GET_TIMESTAMP: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            AudioTimestamp timestamp;
            status_t status = getTimestamp(timestamp);
            reply->writeInt32(status);
            if (status == NO_ERROR) {
                reply->writeInt32(timestamp.mPosition);
                reply->writeInt32(timestamp.mTime.tv_sec);
                reply->writeInt32(timestamp.mTime.tv_nsec);
            }
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+1 −0
Original line number Diff line number Diff line
@@ -411,6 +411,7 @@ private:
        virtual status_t    setMediaTimeTransform(const LinearTransform& xform,
                                                  int target);
        virtual status_t    setParameters(const String8& keyValuePairs);
        virtual status_t    getTimestamp(AudioTimestamp& timestamp);

        virtual status_t onTransact(
            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
Loading