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

Commit 6181ffd9 authored by Glenn Kasten's avatar Glenn Kasten
Browse files

Allow track buffer "allocation" to be from pipe

Change-Id: Ib9ac170f8e8b7746b3588157a56cbee3b753a1cb
parent 77a3374a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -301,6 +301,8 @@ public:
                // If a thread does not have such a heap, this method returns 0.
                virtual sp<MemoryDealer>    readOnlyHeap() const { return 0; }

                virtual sp<IMemory> pipeMemory() const { return 0; }

    mutable     Mutex                   mLock;

protected:
+8 −1
Original line number Diff line number Diff line
@@ -39,6 +39,13 @@ public:
        STARTING_2,     // for RecordTrack only
    };

    // where to allocate the data buffer
    enum alloc_type {
        ALLOC_CBLK,     // allocate immediately after control block
        ALLOC_READONLY, // allocate from a separate read-only heap per thread
        ALLOC_PIPE,     // do not allocate; use the pipe buffer
    };

                        TrackBase(ThreadBase *thread,
                                const sp<Client>& client,
                                uint32_t sampleRate,
@@ -50,7 +57,7 @@ public:
                                int uid,
                                IAudioFlinger::track_flags_t flags,
                                bool isOut,
                                bool useReadOnlyHeap = false);
                                alloc_type alloc = ALLOC_CBLK);
    virtual             ~TrackBase();
    virtual status_t    initCheck() const { return getCblk() != 0 ? NO_ERROR : NO_MEMORY; }

+17 −5
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
            int clientUid,
            IAudioFlinger::track_flags_t flags,
            bool isOut,
            bool useReadOnlyHeap)
            alloc_type alloc)
    :   RefBase(),
        mThread(thread),
        mClient(client),
@@ -117,7 +117,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
    // ALOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize);
    size_t size = sizeof(audio_track_cblk_t);
    size_t bufferSize = (sharedBuffer == 0 ? roundup(frameCount) : frameCount) * mFrameSize;
    if (sharedBuffer == 0 && !useReadOnlyHeap) {
    if (sharedBuffer == 0 && alloc == ALLOC_CBLK) {
        size += bufferSize;
    }

@@ -139,7 +139,8 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
    // construct the shared structure in-place.
    if (mCblk != NULL) {
        new(mCblk) audio_track_cblk_t();
        if (useReadOnlyHeap) {
        switch (alloc) {
        case ALLOC_READONLY: {
            const sp<MemoryDealer> roHeap(thread->readOnlyHeap());
            if (roHeap == 0 ||
                    (mBufferMemory = roHeap->allocate(bufferSize)) == 0 ||
@@ -153,7 +154,17 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
                return;
            }
            memset(mBuffer, 0, bufferSize);
        } else {
            } break;
        case ALLOC_PIPE:
            mBufferMemory = thread->pipeMemory();
            // mBuffer is the virtual address as seen from current process (mediaserver),
            // and should normally be coming from mBufferMemory->pointer().
            // However in this case the TrackBase does not reference the buffer directly.
            // It should references the buffer via the pipe.
            // Therefore, to detect incorrect usage of the buffer, we set mBuffer to NULL.
            mBuffer = NULL;
            break;
        case ALLOC_CBLK:
            // clear all buffers
            if (sharedBuffer == 0) {
                mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
@@ -164,6 +175,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
                mCblk->mFlags = CBLK_FORCEREADY;    // FIXME hack, need to fix the track ready logic
#endif
            }
            break;
        }

#ifdef TEE_SINK
@@ -1842,7 +1854,7 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack(
    :   TrackBase(thread, client, sampleRate, format,
                  channelMask, frameCount, 0 /*sharedBuffer*/, sessionId, uid,
                  flags, false /*isOut*/,
                  (flags & IAudioFlinger::TRACK_FAST) != 0 /*useReadOnlyHeap*/),
                  (flags & IAudioFlinger::TRACK_FAST) != 0 ? ALLOC_READONLY : ALLOC_CBLK),
        mOverflow(false), mResampler(NULL), mRsmpOutBuffer(NULL), mRsmpOutFrameCount(0),
        // See real initialization of mRsmpInFront at RecordThread::start()
        mRsmpInUnrel(0), mRsmpInFront(0), mFramesToDrop(0), mResamplerBufferProvider(NULL)