diff options
author | Glenn Kasten <gkasten@google.com> | 2014-05-08 15:40:09 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-05-08 15:40:09 +0000 |
commit | eee8fc78703dd77244407250402fe7464fe50fd3 (patch) | |
tree | 05ce4a680a40cdf961de44a3b366e0898d7c4511 /services | |
parent | cdedf74e34117f9834055973880ee728f11d97cd (diff) | |
parent | b880f5e5fc07397ddd09a94ba18bdf4fa62aae00 (diff) | |
download | frameworks_av-eee8fc78703dd77244407250402fe7464fe50fd3.zip frameworks_av-eee8fc78703dd77244407250402fe7464fe50fd3.tar.gz frameworks_av-eee8fc78703dd77244407250402fe7464fe50fd3.tar.bz2 |
Merge "Add a per-thread heap that is read-only to clients"
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/Threads.cpp | 8 | ||||
-rw-r--r-- | services/audioflinger/Threads.h | 11 |
2 files changed, 19 insertions, 0 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index a916b32..2c5a0eb 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -143,6 +143,12 @@ static const int kPriorityFastMixer = 3; // See the client's minBufCount and mNotificationFramesAct calculations for details. static const int kFastTrackMultiplier = 2; +// See Thread::readOnlyHeap(). +// Initially this heap is used to allocate client buffers for "fast" AudioRecord. +// Eventually it will be the single buffer that FastCapture writes into via HAL read(), +// and that all "fast" AudioRecord clients read from. In either case, the size can be small. +static const size_t kRecordThreadReadOnlyHeapSize = 0x1000; + // ---------------------------------------------------------------------------- #ifdef ADD_BATTERY_DATA @@ -4635,6 +4641,8 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger, #ifdef TEE_SINK , mTeeSink(teeSink) #endif + , mReadOnlyHeap(new MemoryDealer(kRecordThreadReadOnlyHeapSize, + "RecordThreadRO", MemoryHeapBase::READ_ONLY)) { snprintf(mName, kNameLength, "AudioIn_%X", id); mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName); diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h index 5617c0c..8ea8683 100644 --- a/services/audioflinger/Threads.h +++ b/services/audioflinger/Threads.h @@ -226,6 +226,13 @@ public: virtual status_t setSyncEvent(const sp<SyncEvent>& event) = 0; virtual bool isValidSyncEvent(const sp<SyncEvent>& event) const = 0; + // Return a reference to a per-thread heap which can be used to allocate IMemory + // objects that will be read-only to client processes, read/write to mediaserver, + // and shared by all client processes of the thread. + // The heap is per-thread rather than common across all threads, because + // clients can't be trusted not to modify the offset of the IMemory they receive. + // If a thread does not have such a heap, this method returns 0. + virtual sp<MemoryDealer> readOnlyHeap() const { return 0; } mutable Mutex mLock; @@ -947,6 +954,8 @@ public: virtual status_t initCheck() const { return (mInput == NULL) ? NO_INIT : NO_ERROR; } + virtual sp<MemoryDealer> readOnlyHeap() const { return mReadOnlyHeap; } + sp<AudioFlinger::RecordThread::RecordTrack> createRecordTrack_l( const sp<AudioFlinger::Client>& client, uint32_t sampleRate, @@ -1021,4 +1030,6 @@ private: // For dumpsys const sp<NBAIO_Sink> mTeeSink; + + const sp<MemoryDealer> mReadOnlyHeap; }; |