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

Commit b929e417 authored by Glenn Kasten's avatar Glenn Kasten
Browse files

Move buffers pointer out of the control block

This is part of a series to clean up the control block.

Change-Id: Ie474557db7cb360f2d9a0f11600a68f5a3d46f07
parent a47f3165
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -389,6 +389,7 @@ private:
    sp<IAudioRecord>        mAudioRecord;
    sp<IMemory>             mCblkMemory;
    audio_track_cblk_t*     mCblk;
    void*                   mBuffers;           // starting address of buffers in shared memory

    int                     mPreviousPriority;          // before start()
    SchedPolicy             mPreviousSchedulingGroup;
+1 −0
Original line number Diff line number Diff line
@@ -510,6 +510,7 @@ protected:
    uint32_t                mFrameCount;

    audio_track_cblk_t*     mCblk;                  // re-load after mLock.unlock()
    void*                   mBuffers;               // starting address of buffers in shared memory
    audio_format_t          mFormat;
    audio_stream_type_t     mStreamType;
    uint8_t                 mChannelCount;
+5 −4
Original line number Diff line number Diff line
@@ -58,9 +58,7 @@ struct audio_track_cblk_t
                uint32_t    userBase;
                uint32_t    serverBase;

                // if there is a shared buffer, "buffers" is the value of pointer() for the shared
                // buffer, otherwise "buffers" points immediately after the control block
                void*       buffers;
                int         mPad1;          // unused, but preserves cache line alignment
                uint32_t    frameCount;

                // Cache line boundary
@@ -111,7 +109,10 @@ public:

                bool        stepServer(uint32_t frameCount, bool isOut);

                void*       buffer(uint32_t offset) const;
                // if there is a shared buffer, "buffers" is the value of pointer() for the shared
                // buffer, otherwise "buffers" points immediately after the control block
                void*       buffer(void *buffers, uint32_t offset) const;

                uint32_t    framesAvailableIn() { return framesAvailable(false); }
                uint32_t    framesAvailableOut() { return framesAvailable(true); }
                uint32_t    framesAvailableIn_l() { return framesAvailable_l(false); }
+2 −2
Original line number Diff line number Diff line
@@ -465,7 +465,7 @@ status_t AudioRecord::openRecord_l(
    mCblkMemory.clear();
    mCblkMemory = cblk;
    mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer());
    mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
    mBuffers = (char*)mCblk + sizeof(audio_track_cblk_t);
    mCblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
    mCblk->waitTimeMs = 0;
    return NO_ERROR;
@@ -561,7 +561,7 @@ create_new_record:

    audioBuffer->frameCount  = framesReq;
    audioBuffer->size        = framesReq*cblk->frameSize;
    audioBuffer->raw         = (int8_t*)cblk->buffer(u);
    audioBuffer->raw         = cblk->buffer(mBuffers, u);
    active = mActive;
    return active ? status_t(NO_ERROR) : status_t(STOPPED);
}
+6 −6
Original line number Diff line number Diff line
@@ -895,9 +895,9 @@ status_t AudioTrack::createTrack_l(
        }
    }
    if (sharedBuffer == 0) {
        cblk->buffers = (char*)cblk + sizeof(audio_track_cblk_t);
        mBuffers = (char*)cblk + sizeof(audio_track_cblk_t);
    } else {
        cblk->buffers = sharedBuffer->pointer();
        mBuffers = sharedBuffer->pointer();
        // Force buffer full condition as data is already present in shared memory
        cblk->stepUserOut(cblk->frameCount);
    }
@@ -1027,7 +1027,7 @@ create_new_track:

    audioBuffer->frameCount = framesReq;
    audioBuffer->size = framesReq * cblk->frameSize;
    audioBuffer->raw = (int8_t *)cblk->buffer(u);
    audioBuffer->raw = cblk->buffer(mBuffers, u);
    active = mActive;
    return active ? status_t(NO_ERROR) : status_t(STOPPED);
}
@@ -1373,7 +1373,7 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& refCblk, bool fromStart
                if (user > server) {
                    frames = ((user - server) > newCblk->frameCount) ?
                            newCblk->frameCount : (user - server);
                    memset(newCblk->buffers, 0, frames * newCblk->frameSize);
                    memset(mBuffers, 0, frames * newCblk->frameSize);
                }
                // restart playback even if buffer is not completely filled.
                android_atomic_or(CBLK_FORCEREADY, &newCblk->flags);
@@ -1486,7 +1486,7 @@ void AudioTrack::AudioTrackThread::resume()

audio_track_cblk_t::audio_track_cblk_t()
    : lock(Mutex::SHARED), cv(Condition::SHARED), user(0), server(0),
    userBase(0), serverBase(0), buffers(NULL), frameCount(0),
    userBase(0), serverBase(0), frameCount(0),
    loopStart(UINT_MAX), loopEnd(UINT_MAX), loopCount(0), mVolumeLR(0x10001000),
    mSendLevel(0), flags(0)
{
@@ -1588,7 +1588,7 @@ bool audio_track_cblk_t::stepServer(uint32_t frameCount, bool isOut)
    return true;
}

void* audio_track_cblk_t::buffer(uint32_t offset) const
void* audio_track_cblk_t::buffer(void *buffers, uint32_t offset) const
{
    return (int8_t *)buffers + (offset - userBase) * frameSize;
}
Loading