Loading services/audioflinger/Threads.h +2 −0 Original line number Diff line number Diff line Loading @@ -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: Loading services/audioflinger/TrackBase.h +8 −1 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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; } Loading services/audioflinger/Tracks.cpp +17 −5 Original line number Diff line number Diff line Loading @@ -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), Loading Loading @@ -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; } Loading @@ -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 || Loading @@ -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); Loading @@ -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 Loading Loading @@ -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) Loading Loading
services/audioflinger/Threads.h +2 −0 Original line number Diff line number Diff line Loading @@ -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: Loading
services/audioflinger/TrackBase.h +8 −1 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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; } Loading
services/audioflinger/Tracks.cpp +17 −5 Original line number Diff line number Diff line Loading @@ -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), Loading Loading @@ -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; } Loading @@ -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 || Loading @@ -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); Loading @@ -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 Loading Loading @@ -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) Loading