Add support for mmap stream
Add support for MMAP streams created by Oboe service.
- A new audio thread class MmapThread deriving from ThreadBase
is added to manage permissions, volume, routing and wakelocks for activity
on MMAP streams.
- Requests received over MmapStreamInterface to open, start and stop
a MMAP stream are forwarded to audio policy manager so that activity
on MMAP capture and playback streams is visible to audio policy and
taken into account in volume and routing management.
`
Bug: Bug: 33398120
Test: manual test
Change-Id: I957906495fe9277d2972d810b633f50cd1e14ec3
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index 9746075..b03d003 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -98,7 +98,8 @@
mTerminated(false),
mType(type),
mThreadIoHandle(thread->id()),
- mPortId(portId)
+ mPortId(portId),
+ mIsInvalid(false)
{
const uid_t callingUid = IPCThreadState::self()->getCallingUid();
if (!isTrustedCallingUid(callingUid) || clientUid == AUDIO_UID_INVALID) {
@@ -365,7 +366,6 @@
// mSinkTimestamp
mFastIndex(-1),
mCachedVolume(1.0),
- mIsInvalid(false),
mResumeToStopping(false),
mFlushHwPending(false),
mFlags(flags)
@@ -1042,8 +1042,8 @@
void AudioFlinger::PlaybackThread::Track::invalidate()
{
+ TrackBase::invalidate();
signalClientFlag(CBLK_INVALID);
- mIsInvalid = true;
}
void AudioFlinger::PlaybackThread::Track::disable()
@@ -1599,6 +1599,7 @@
void AudioFlinger::RecordThread::RecordTrack::invalidate()
{
+ TrackBase::invalidate();
// FIXME should use proxy, and needs work
audio_track_cblk_t* cblk = mCblk;
android_atomic_or(CBLK_INVALID, &cblk->mFlags);
@@ -1735,4 +1736,76 @@
mProxy->releaseBuffer(buffer);
}
+
+
+AudioFlinger::MmapThread::MmapTrack::MmapTrack(ThreadBase *thread,
+ uint32_t sampleRate,
+ audio_format_t format,
+ audio_channel_mask_t channelMask,
+ audio_session_t sessionId,
+ uid_t uid,
+ audio_port_handle_t portId)
+ : TrackBase(thread, NULL, sampleRate, format,
+ channelMask, 0, NULL, sessionId, uid, false,
+ ALLOC_NONE,
+ TYPE_DEFAULT, portId)
+{
+}
+
+AudioFlinger::MmapThread::MmapTrack::~MmapTrack()
+{
+}
+
+status_t AudioFlinger::MmapThread::MmapTrack::initCheck() const
+{
+ return NO_ERROR;
+}
+
+status_t AudioFlinger::MmapThread::MmapTrack::start(AudioSystem::sync_event_t event __unused,
+ audio_session_t triggerSession __unused)
+{
+ return NO_ERROR;
+}
+
+void AudioFlinger::MmapThread::MmapTrack::stop()
+{
+}
+
+// AudioBufferProvider interface
+status_t AudioFlinger::MmapThread::MmapTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer)
+{
+ buffer->frameCount = 0;
+ buffer->raw = nullptr;
+ return INVALID_OPERATION;
+}
+
+// ExtendedAudioBufferProvider interface
+size_t AudioFlinger::MmapThread::MmapTrack::framesReady() const {
+ return 0;
+}
+
+int64_t AudioFlinger::MmapThread::MmapTrack::framesReleased() const
+{
+ return 0;
+}
+
+void AudioFlinger::MmapThread::MmapTrack::onTimestamp(const ExtendedTimestamp ×tamp __unused)
+{
+}
+
+/*static*/ void AudioFlinger::MmapThread::MmapTrack::appendDumpHeader(String8& result)
+{
+ result.append(" Client Fmt Chn mask SRate\n");
+}
+
+void AudioFlinger::MmapThread::MmapTrack::dump(char* buffer, size_t size)
+{
+ snprintf(buffer, size, " %6u %3u %08X %5u\n",
+ mUid,
+ mFormat,
+ mChannelMask,
+ mSampleRate);
+
+}
+
} // namespace android