• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2012, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 
19 #define LOG_TAG "AudioFlinger"
20 //#define LOG_NDEBUG 0
21 #define ATRACE_TAG ATRACE_TAG_AUDIO
22 
23 #include "Configuration.h"
24 #include <linux/futex.h>
25 #include <math.h>
26 #include <sys/syscall.h>
27 #include <utils/Log.h>
28 #include <utils/Trace.h>
29 
30 #include <private/media/AudioTrackShared.h>
31 
32 #include "AudioFlinger.h"
33 
34 #include <media/nbaio/Pipe.h>
35 #include <media/nbaio/PipeReader.h>
36 #include <media/RecordBufferConverter.h>
37 #include <mediautils/ServiceUtilities.h>
38 #include <audio_utils/minifloat.h>
39 
40 // ----------------------------------------------------------------------------
41 
42 // Note: the following macro is used for extremely verbose logging message.  In
43 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
44 // 0; but one side effect of this is to turn all LOGV's as well.  Some messages
45 // are so verbose that we want to suppress them even when we have ALOG_ASSERT
46 // turned on.  Do not uncomment the #def below unless you really know what you
47 // are doing and want to see all of the extremely verbose messages.
48 //#define VERY_VERY_VERBOSE_LOGGING
49 #ifdef VERY_VERY_VERBOSE_LOGGING
50 #define ALOGVV ALOGV
51 #else
52 #define ALOGVV(a...) do { } while(0)
53 #endif
54 
55 namespace android {
56 
57 using media::VolumeShaper;
58 // ----------------------------------------------------------------------------
59 //      TrackBase
60 // ----------------------------------------------------------------------------
61 #undef LOG_TAG
62 #define LOG_TAG "AF::TrackBase"
63 
64 static volatile int32_t nextTrackId = 55;
65 
66 // TrackBase constructor must be called with AudioFlinger::mLock held
TrackBase(ThreadBase * thread,const sp<Client> & client,const audio_attributes_t & attr,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,void * buffer,size_t bufferSize,audio_session_t sessionId,pid_t creatorPid,uid_t clientUid,bool isOut,alloc_type alloc,track_type type,audio_port_handle_t portId,std::string metricsId)67 AudioFlinger::ThreadBase::TrackBase::TrackBase(
68             ThreadBase *thread,
69             const sp<Client>& client,
70             const audio_attributes_t& attr,
71             uint32_t sampleRate,
72             audio_format_t format,
73             audio_channel_mask_t channelMask,
74             size_t frameCount,
75             void *buffer,
76             size_t bufferSize,
77             audio_session_t sessionId,
78             pid_t creatorPid,
79             uid_t clientUid,
80             bool isOut,
81             alloc_type alloc,
82             track_type type,
83             audio_port_handle_t portId,
84             std::string metricsId)
85     :   RefBase(),
86         mThread(thread),
87         mClient(client),
88         mCblk(NULL),
89         // mBuffer, mBufferSize
90         mState(IDLE),
91         mAttr(attr),
92         mSampleRate(sampleRate),
93         mFormat(format),
94         mChannelMask(channelMask),
95         mChannelCount(isOut ?
96                 audio_channel_count_from_out_mask(channelMask) :
97                 audio_channel_count_from_in_mask(channelMask)),
98         mFrameSize(audio_has_proportional_frames(format) ?
99                 mChannelCount * audio_bytes_per_sample(format) : sizeof(int8_t)),
100         mFrameCount(frameCount),
101         mSessionId(sessionId),
102         mIsOut(isOut),
103         mId(android_atomic_inc(&nextTrackId)),
104         mTerminated(false),
105         mType(type),
106         mThreadIoHandle(thread ? thread->id() : AUDIO_IO_HANDLE_NONE),
107         mPortId(portId),
108         mIsInvalid(false),
109         mTrackMetrics(std::move(metricsId), isOut),
110         mCreatorPid(creatorPid)
111 {
112     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
113     if (!isAudioServerOrMediaServerUid(callingUid) || clientUid == AUDIO_UID_INVALID) {
114         ALOGW_IF(clientUid != AUDIO_UID_INVALID && clientUid != callingUid,
115                 "%s(%d): uid %d tried to pass itself off as %d",
116                  __func__, mId, callingUid, clientUid);
117         clientUid = callingUid;
118     }
119     // clientUid contains the uid of the app that is responsible for this track, so we can blame
120     // battery usage on it.
121     mUid = clientUid;
122 
123     // ALOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize);
124 
125     size_t minBufferSize = buffer == NULL ? roundup(frameCount) : frameCount;
126     // check overflow when computing bufferSize due to multiplication by mFrameSize.
127     if (minBufferSize < frameCount  // roundup rounds down for values above UINT_MAX / 2
128             || mFrameSize == 0   // format needs to be correct
129             || minBufferSize > SIZE_MAX / mFrameSize) {
130         android_errorWriteLog(0x534e4554, "34749571");
131         return;
132     }
133     minBufferSize *= mFrameSize;
134 
135     if (buffer == nullptr) {
136         bufferSize = minBufferSize; // allocated here.
137     } else if (minBufferSize > bufferSize) {
138         android_errorWriteLog(0x534e4554, "38340117");
139         return;
140     }
141 
142     size_t size = sizeof(audio_track_cblk_t);
143     if (buffer == NULL && alloc == ALLOC_CBLK) {
144         // check overflow when computing allocation size for streaming tracks.
145         if (size > SIZE_MAX - bufferSize) {
146             android_errorWriteLog(0x534e4554, "34749571");
147             return;
148         }
149         size += bufferSize;
150     }
151 
152     if (client != 0) {
153         mCblkMemory = client->heap()->allocate(size);
154         if (mCblkMemory == 0 ||
155                 (mCblk = static_cast<audio_track_cblk_t *>(mCblkMemory->unsecurePointer())) == NULL) {
156             ALOGE("%s(%d): not enough memory for AudioTrack size=%zu", __func__, mId, size);
157             client->heap()->dump("AudioTrack");
158             mCblkMemory.clear();
159             return;
160         }
161     } else {
162         mCblk = (audio_track_cblk_t *) malloc(size);
163         if (mCblk == NULL) {
164             ALOGE("%s(%d): not enough memory for AudioTrack size=%zu", __func__, mId, size);
165             return;
166         }
167     }
168 
169     // construct the shared structure in-place.
170     if (mCblk != NULL) {
171         new(mCblk) audio_track_cblk_t();
172         switch (alloc) {
173         case ALLOC_READONLY: {
174             const sp<MemoryDealer> roHeap(thread->readOnlyHeap());
175             if (roHeap == 0 ||
176                     (mBufferMemory = roHeap->allocate(bufferSize)) == 0 ||
177                     (mBuffer = mBufferMemory->unsecurePointer()) == NULL) {
178                 ALOGE("%s(%d): not enough memory for read-only buffer size=%zu",
179                         __func__, mId, bufferSize);
180                 if (roHeap != 0) {
181                     roHeap->dump("buffer");
182                 }
183                 mCblkMemory.clear();
184                 mBufferMemory.clear();
185                 return;
186             }
187             memset(mBuffer, 0, bufferSize);
188             } break;
189         case ALLOC_PIPE:
190             mBufferMemory = thread->pipeMemory();
191             // mBuffer is the virtual address as seen from current process (mediaserver),
192             // and should normally be coming from mBufferMemory->unsecurePointer().
193             // However in this case the TrackBase does not reference the buffer directly.
194             // It should references the buffer via the pipe.
195             // Therefore, to detect incorrect usage of the buffer, we set mBuffer to NULL.
196             mBuffer = NULL;
197             bufferSize = 0;
198             break;
199         case ALLOC_CBLK:
200             // clear all buffers
201             if (buffer == NULL) {
202                 mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
203                 memset(mBuffer, 0, bufferSize);
204             } else {
205                 mBuffer = buffer;
206 #if 0
207                 mCblk->mFlags = CBLK_FORCEREADY;    // FIXME hack, need to fix the track ready logic
208 #endif
209             }
210             break;
211         case ALLOC_LOCAL:
212             mBuffer = calloc(1, bufferSize);
213             break;
214         case ALLOC_NONE:
215             mBuffer = buffer;
216             break;
217         default:
218             LOG_ALWAYS_FATAL("%s(%d): invalid allocation type: %d", __func__, mId, (int)alloc);
219         }
220         mBufferSize = bufferSize;
221 
222 #ifdef TEE_SINK
223         mTee.set(sampleRate, mChannelCount, format, NBAIO_Tee::TEE_FLAG_TRACK);
224 #endif
225 
226     }
227 }
228 
initCheck() const229 status_t AudioFlinger::ThreadBase::TrackBase::initCheck() const
230 {
231     status_t status;
232     if (mType == TYPE_OUTPUT || mType == TYPE_PATCH) {
233         status = cblk() != NULL ? NO_ERROR : NO_MEMORY;
234     } else {
235         status = getCblk() != 0 ? NO_ERROR : NO_MEMORY;
236     }
237     return status;
238 }
239 
~TrackBase()240 AudioFlinger::ThreadBase::TrackBase::~TrackBase()
241 {
242     // delete the proxy before deleting the shared memory it refers to, to avoid dangling reference
243     mServerProxy.clear();
244     releaseCblk();
245     mCblkMemory.clear();    // free the shared memory before releasing the heap it belongs to
246     if (mClient != 0) {
247         // Client destructor must run with AudioFlinger client mutex locked
248         Mutex::Autolock _l(mClient->audioFlinger()->mClientLock);
249         // If the client's reference count drops to zero, the associated destructor
250         // must run with AudioFlinger lock held. Thus the explicit clear() rather than
251         // relying on the automatic clear() at end of scope.
252         mClient.clear();
253     }
254     // flush the binder command buffer
255     IPCThreadState::self()->flushCommands();
256 }
257 
258 // AudioBufferProvider interface
259 // getNextBuffer() = 0;
260 // This implementation of releaseBuffer() is used by Track and RecordTrack
releaseBuffer(AudioBufferProvider::Buffer * buffer)261 void AudioFlinger::ThreadBase::TrackBase::releaseBuffer(AudioBufferProvider::Buffer* buffer)
262 {
263 #ifdef TEE_SINK
264     mTee.write(buffer->raw, buffer->frameCount);
265 #endif
266 
267     ServerProxy::Buffer buf;
268     buf.mFrameCount = buffer->frameCount;
269     buf.mRaw = buffer->raw;
270     buffer->frameCount = 0;
271     buffer->raw = NULL;
272     mServerProxy->releaseBuffer(&buf);
273 }
274 
setSyncEvent(const sp<SyncEvent> & event)275 status_t AudioFlinger::ThreadBase::TrackBase::setSyncEvent(const sp<SyncEvent>& event)
276 {
277     mSyncEvents.add(event);
278     return NO_ERROR;
279 }
280 
PatchTrackBase(sp<ClientProxy> proxy,const ThreadBase & thread,const Timeout & timeout)281 AudioFlinger::ThreadBase::PatchTrackBase::PatchTrackBase(sp<ClientProxy> proxy,
282                                                          const ThreadBase& thread,
283                                                          const Timeout& timeout)
284     : mProxy(proxy)
285 {
286     if (timeout) {
287         setPeerTimeout(*timeout);
288     } else {
289         // Double buffer mixer
290         uint64_t mixBufferNs = ((uint64_t)2 * thread.frameCount() * 1000000000) /
291                                               thread.sampleRate();
292         setPeerTimeout(std::chrono::nanoseconds{mixBufferNs});
293     }
294 }
295 
setPeerTimeout(std::chrono::nanoseconds timeout)296 void AudioFlinger::ThreadBase::PatchTrackBase::setPeerTimeout(std::chrono::nanoseconds timeout) {
297     mPeerTimeout.tv_sec = timeout.count() / std::nano::den;
298     mPeerTimeout.tv_nsec = timeout.count() % std::nano::den;
299 }
300 
301 
302 // ----------------------------------------------------------------------------
303 //      Playback
304 // ----------------------------------------------------------------------------
305 #undef LOG_TAG
306 #define LOG_TAG "AF::TrackHandle"
307 
TrackHandle(const sp<AudioFlinger::PlaybackThread::Track> & track)308 AudioFlinger::TrackHandle::TrackHandle(const sp<AudioFlinger::PlaybackThread::Track>& track)
309     : BnAudioTrack(),
310       mTrack(track)
311 {
312 }
313 
~TrackHandle()314 AudioFlinger::TrackHandle::~TrackHandle() {
315     // just stop the track on deletion, associated resources
316     // will be freed from the main thread once all pending buffers have
317     // been played. Unless it's not in the active track list, in which
318     // case we free everything now...
319     mTrack->destroy();
320 }
321 
getCblk() const322 sp<IMemory> AudioFlinger::TrackHandle::getCblk() const {
323     return mTrack->getCblk();
324 }
325 
start()326 status_t AudioFlinger::TrackHandle::start() {
327     return mTrack->start();
328 }
329 
stop()330 void AudioFlinger::TrackHandle::stop() {
331     mTrack->stop();
332 }
333 
flush()334 void AudioFlinger::TrackHandle::flush() {
335     mTrack->flush();
336 }
337 
pause()338 void AudioFlinger::TrackHandle::pause() {
339     mTrack->pause();
340 }
341 
attachAuxEffect(int EffectId)342 status_t AudioFlinger::TrackHandle::attachAuxEffect(int EffectId)
343 {
344     return mTrack->attachAuxEffect(EffectId);
345 }
346 
setParameters(const String8 & keyValuePairs)347 status_t AudioFlinger::TrackHandle::setParameters(const String8& keyValuePairs) {
348     return mTrack->setParameters(keyValuePairs);
349 }
350 
selectPresentation(int presentationId,int programId)351 status_t AudioFlinger::TrackHandle::selectPresentation(int presentationId, int programId) {
352     return mTrack->selectPresentation(presentationId, programId);
353 }
354 
applyVolumeShaper(const sp<VolumeShaper::Configuration> & configuration,const sp<VolumeShaper::Operation> & operation)355 VolumeShaper::Status AudioFlinger::TrackHandle::applyVolumeShaper(
356         const sp<VolumeShaper::Configuration>& configuration,
357         const sp<VolumeShaper::Operation>& operation) {
358     return mTrack->applyVolumeShaper(configuration, operation);
359 }
360 
getVolumeShaperState(int id)361 sp<VolumeShaper::State> AudioFlinger::TrackHandle::getVolumeShaperState(int id) {
362     return mTrack->getVolumeShaperState(id);
363 }
364 
getTimestamp(AudioTimestamp & timestamp)365 status_t AudioFlinger::TrackHandle::getTimestamp(AudioTimestamp& timestamp)
366 {
367     return mTrack->getTimestamp(timestamp);
368 }
369 
370 
signal()371 void AudioFlinger::TrackHandle::signal()
372 {
373     return mTrack->signal();
374 }
375 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)376 status_t AudioFlinger::TrackHandle::onTransact(
377     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
378 {
379     return BnAudioTrack::onTransact(code, data, reply, flags);
380 }
381 
382 // ----------------------------------------------------------------------------
383 //      AppOp for audio playback
384 // -------------------------------
385 
386 // static
387 sp<AudioFlinger::PlaybackThread::OpPlayAudioMonitor>
createIfNeeded(uid_t uid,const audio_attributes_t & attr,int id,audio_stream_type_t streamType,const std::string & opPackageName)388 AudioFlinger::PlaybackThread::OpPlayAudioMonitor::createIfNeeded(
389             uid_t uid, const audio_attributes_t& attr, int id, audio_stream_type_t streamType,
390             const std::string& opPackageName)
391 {
392     Vector <String16> packages;
393     getPackagesForUid(uid, packages);
394     if (isServiceUid(uid)) {
395         if (packages.isEmpty()) {
396             ALOGD("OpPlayAudio: not muting track:%d usage:%d for service UID %d",
397                   id,
398                   attr.usage,
399                   uid);
400             return nullptr;
401         }
402     }
403     // stream type has been filtered by audio policy to indicate whether it can be muted
404     if (streamType == AUDIO_STREAM_ENFORCED_AUDIBLE) {
405         ALOGD("OpPlayAudio: not muting track:%d usage:%d ENFORCED_AUDIBLE", id, attr.usage);
406         return nullptr;
407     }
408     if ((attr.flags & AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY)
409             == AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY) {
410         ALOGD("OpPlayAudio: not muting track:%d flags %#x have FLAG_BYPASS_INTERRUPTION_POLICY",
411             id, attr.flags);
412         return nullptr;
413     }
414 
415     String16 opPackageNameStr(opPackageName.c_str());
416     if (opPackageName.empty()) {
417         // If no package name is provided by the client, use the first associated with the uid
418         if (!packages.isEmpty()) {
419             opPackageNameStr = packages[0];
420         }
421     } else {
422         // If the provided package name is invalid, we force app ops denial by clearing the package
423         // name passed to OpPlayAudioMonitor
424         if (std::find_if(packages.begin(), packages.end(),
425                 [&opPackageNameStr](const auto& package) {
426                 return opPackageNameStr == package; }) == packages.end()) {
427             ALOGW("The package name(%s) provided does not correspond to the uid %d, "
428                   "force muting the track", opPackageName.c_str(), uid);
429             // Set package name as an empty string so that hasOpPlayAudio will always return false.
430             opPackageNameStr = String16("");
431         }
432     }
433     return new OpPlayAudioMonitor(uid, attr.usage, id, opPackageNameStr);
434 }
435 
OpPlayAudioMonitor(uid_t uid,audio_usage_t usage,int id,const String16 & opPackageName)436 AudioFlinger::PlaybackThread::OpPlayAudioMonitor::OpPlayAudioMonitor(
437         uid_t uid, audio_usage_t usage, int id, const String16& opPackageName)
438         : mHasOpPlayAudio(true), mUid(uid), mUsage((int32_t) usage), mId(id),
439           mOpPackageName(opPackageName)
440 {
441 }
442 
~OpPlayAudioMonitor()443 AudioFlinger::PlaybackThread::OpPlayAudioMonitor::~OpPlayAudioMonitor()
444 {
445     if (mOpCallback != 0) {
446         mAppOpsManager.stopWatchingMode(mOpCallback);
447     }
448     mOpCallback.clear();
449 }
450 
onFirstRef()451 void AudioFlinger::PlaybackThread::OpPlayAudioMonitor::onFirstRef()
452 {
453     checkPlayAudioForUsage();
454     if (mOpPackageName.size() != 0) {
455         mOpCallback = new PlayAudioOpCallback(this);
456         mAppOpsManager.startWatchingMode(AppOpsManager::OP_PLAY_AUDIO, mOpPackageName, mOpCallback);
457     }
458 }
459 
hasOpPlayAudio() const460 bool AudioFlinger::PlaybackThread::OpPlayAudioMonitor::hasOpPlayAudio() const {
461     return mHasOpPlayAudio.load();
462 }
463 
464 // Note this method is never called (and never to be) for audio server / patch record track
465 // - not called from constructor due to check on UID,
466 // - not called from PlayAudioOpCallback because the callback is not installed in this case
checkPlayAudioForUsage()467 void AudioFlinger::PlaybackThread::OpPlayAudioMonitor::checkPlayAudioForUsage()
468 {
469     if (mOpPackageName.size() == 0) {
470         mHasOpPlayAudio.store(false);
471     } else {
472         bool hasIt = mAppOpsManager.checkAudioOpNoThrow(AppOpsManager::OP_PLAY_AUDIO,
473                     mUsage, mUid, mOpPackageName) == AppOpsManager::MODE_ALLOWED;
474         ALOGD("OpPlayAudio: track:%d usage:%d %smuted", mId, mUsage, hasIt ? "not " : "");
475         mHasOpPlayAudio.store(hasIt);
476     }
477 }
478 
PlayAudioOpCallback(const wp<OpPlayAudioMonitor> & monitor)479 AudioFlinger::PlaybackThread::OpPlayAudioMonitor::PlayAudioOpCallback::PlayAudioOpCallback(
480         const wp<OpPlayAudioMonitor>& monitor) : mMonitor(monitor)
481 { }
482 
opChanged(int32_t op,const String16 & packageName)483 void AudioFlinger::PlaybackThread::OpPlayAudioMonitor::PlayAudioOpCallback::opChanged(int32_t op,
484             const String16& packageName) {
485     // we only have uid, so we need to check all package names anyway
486     UNUSED(packageName);
487     if (op != AppOpsManager::OP_PLAY_AUDIO) {
488         return;
489     }
490     sp<OpPlayAudioMonitor> monitor = mMonitor.promote();
491     if (monitor != NULL) {
492         monitor->checkPlayAudioForUsage();
493     }
494 }
495 
496 // static
getPackagesForUid(uid_t uid,Vector<String16> & packages)497 void AudioFlinger::PlaybackThread::OpPlayAudioMonitor::getPackagesForUid(
498     uid_t uid, Vector<String16>& packages)
499 {
500     PermissionController permissionController;
501     permissionController.getPackagesForUid(uid, packages);
502 }
503 
504 // ----------------------------------------------------------------------------
505 #undef LOG_TAG
506 #define LOG_TAG "AF::Track"
507 
508 // Track constructor must be called with AudioFlinger::mLock and ThreadBase::mLock held
Track(PlaybackThread * thread,const sp<Client> & client,audio_stream_type_t streamType,const audio_attributes_t & attr,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,void * buffer,size_t bufferSize,const sp<IMemory> & sharedBuffer,audio_session_t sessionId,pid_t creatorPid,uid_t uid,audio_output_flags_t flags,track_type type,audio_port_handle_t portId,size_t frameCountToBeReady,const std::string opPackageName)509 AudioFlinger::PlaybackThread::Track::Track(
510             PlaybackThread *thread,
511             const sp<Client>& client,
512             audio_stream_type_t streamType,
513             const audio_attributes_t& attr,
514             uint32_t sampleRate,
515             audio_format_t format,
516             audio_channel_mask_t channelMask,
517             size_t frameCount,
518             void *buffer,
519             size_t bufferSize,
520             const sp<IMemory>& sharedBuffer,
521             audio_session_t sessionId,
522             pid_t creatorPid,
523             uid_t uid,
524             audio_output_flags_t flags,
525             track_type type,
526             audio_port_handle_t portId,
527             size_t frameCountToBeReady,
528             const std::string opPackageName)
529     :   TrackBase(thread, client, attr, sampleRate, format, channelMask, frameCount,
530                   // TODO: Using unsecurePointer() has some associated security pitfalls
531                   //       (see declaration for details).
532                   //       Either document why it is safe in this case or address the
533                   //       issue (e.g. by copying).
534                   (sharedBuffer != 0) ? sharedBuffer->unsecurePointer() : buffer,
535                   (sharedBuffer != 0) ? sharedBuffer->size() : bufferSize,
536                   sessionId, creatorPid, uid, true /*isOut*/,
537                   (type == TYPE_PATCH) ? ( buffer == NULL ? ALLOC_LOCAL : ALLOC_NONE) : ALLOC_CBLK,
538                   type,
539                   portId,
540                   std::string(AMEDIAMETRICS_KEY_PREFIX_AUDIO_TRACK) + std::to_string(portId)),
541     mFillingUpStatus(FS_INVALID),
542     // mRetryCount initialized later when needed
543     mSharedBuffer(sharedBuffer),
544     mStreamType(streamType),
545     mMainBuffer(thread->sinkBuffer()),
546     mAuxBuffer(NULL),
547     mAuxEffectId(0), mHasVolumeController(false),
548     mPresentationCompleteFrames(0),
549     mFrameMap(16 /* sink-frame-to-track-frame map memory */),
550     mVolumeHandler(new media::VolumeHandler(sampleRate)),
551     mOpPlayAudioMonitor(OpPlayAudioMonitor::createIfNeeded(
552             uid, attr, id(), streamType, opPackageName)),
553     // mSinkTimestamp
554     mFrameCountToBeReady(frameCountToBeReady),
555     mFastIndex(-1),
556     mCachedVolume(1.0),
557     /* The track might not play immediately after being active, similarly as if its volume was 0.
558      * When the track starts playing, its volume will be computed. */
559     mFinalVolume(0.f),
560     mResumeToStopping(false),
561     mFlushHwPending(false),
562     mFlags(flags)
563 {
564     // client == 0 implies sharedBuffer == 0
565     ALOG_ASSERT(!(client == 0 && sharedBuffer != 0));
566 
567     ALOGV_IF(sharedBuffer != 0, "%s(%d): sharedBuffer: %p, size: %zu",
568             __func__, mId, sharedBuffer->unsecurePointer(), sharedBuffer->size());
569 
570     if (mCblk == NULL) {
571         return;
572     }
573 
574     if (!thread->isTrackAllowed_l(channelMask, format, sessionId, uid)) {
575         ALOGE("%s(%d): no more tracks available", __func__, mId);
576         releaseCblk(); // this makes the track invalid.
577         return;
578     }
579 
580     if (sharedBuffer == 0) {
581         mAudioTrackServerProxy = new AudioTrackServerProxy(mCblk, mBuffer, frameCount,
582                 mFrameSize, !isExternalTrack(), sampleRate);
583     } else {
584         mAudioTrackServerProxy = new StaticAudioTrackServerProxy(mCblk, mBuffer, frameCount,
585                 mFrameSize, sampleRate);
586     }
587     mServerProxy = mAudioTrackServerProxy;
588 
589     // only allocate a fast track index if we were able to allocate a normal track name
590     if (flags & AUDIO_OUTPUT_FLAG_FAST) {
591         // FIXME: Not calling framesReadyIsCalledByMultipleThreads() exposes a potential
592         // race with setSyncEvent(). However, if we call it, we cannot properly start
593         // static fast tracks (SoundPool) immediately after stopping.
594         //mAudioTrackServerProxy->framesReadyIsCalledByMultipleThreads();
595         ALOG_ASSERT(thread->mFastTrackAvailMask != 0);
596         int i = __builtin_ctz(thread->mFastTrackAvailMask);
597         ALOG_ASSERT(0 < i && i < (int)FastMixerState::sMaxFastTracks);
598         // FIXME This is too eager.  We allocate a fast track index before the
599         //       fast track becomes active.  Since fast tracks are a scarce resource,
600         //       this means we are potentially denying other more important fast tracks from
601         //       being created.  It would be better to allocate the index dynamically.
602         mFastIndex = i;
603         thread->mFastTrackAvailMask &= ~(1 << i);
604     }
605 
606     mServerLatencySupported = thread->type() == ThreadBase::MIXER
607             || thread->type() == ThreadBase::DUPLICATING;
608 #ifdef TEE_SINK
609     mTee.setId(std::string("_") + std::to_string(mThreadIoHandle)
610             + "_" + std::to_string(mId) + "_T");
611 #endif
612 
613     if (channelMask & AUDIO_CHANNEL_HAPTIC_ALL) {
614         mAudioVibrationController = new AudioVibrationController(this);
615         mExternalVibration = new os::ExternalVibration(
616                 mUid, opPackageName, mAttr, mAudioVibrationController);
617     }
618 
619     // Once this item is logged by the server, the client can add properties.
620     const char * const traits = sharedBuffer == 0 ? "" : "static";
621     mTrackMetrics.logConstructor(creatorPid, uid, traits, streamType);
622 }
623 
~Track()624 AudioFlinger::PlaybackThread::Track::~Track()
625 {
626     ALOGV("%s(%d)", __func__, mId);
627 
628     // The destructor would clear mSharedBuffer,
629     // but it will not push the decremented reference count,
630     // leaving the client's IMemory dangling indefinitely.
631     // This prevents that leak.
632     if (mSharedBuffer != 0) {
633         mSharedBuffer.clear();
634     }
635 }
636 
initCheck() const637 status_t AudioFlinger::PlaybackThread::Track::initCheck() const
638 {
639     status_t status = TrackBase::initCheck();
640     if (status == NO_ERROR && mCblk == nullptr) {
641         status = NO_MEMORY;
642     }
643     return status;
644 }
645 
destroy()646 void AudioFlinger::PlaybackThread::Track::destroy()
647 {
648     // NOTE: destroyTrack_l() can remove a strong reference to this Track
649     // by removing it from mTracks vector, so there is a risk that this Tracks's
650     // destructor is called. As the destructor needs to lock mLock,
651     // we must acquire a strong reference on this Track before locking mLock
652     // here so that the destructor is called only when exiting this function.
653     // On the other hand, as long as Track::destroy() is only called by
654     // TrackHandle destructor, the TrackHandle still holds a strong ref on
655     // this Track with its member mTrack.
656     sp<Track> keep(this);
657     { // scope for mLock
658         bool wasActive = false;
659         sp<ThreadBase> thread = mThread.promote();
660         if (thread != 0) {
661             Mutex::Autolock _l(thread->mLock);
662             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
663             wasActive = playbackThread->destroyTrack_l(this);
664         }
665         if (isExternalTrack() && !wasActive) {
666             AudioSystem::releaseOutput(mPortId);
667         }
668     }
669     forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); });
670 }
671 
appendDumpHeader(String8 & result)672 void AudioFlinger::PlaybackThread::Track::appendDumpHeader(String8& result)
673 {
674     result.appendFormat("Type     Id Active Client Session Port Id S  Flags "
675                         "  Format Chn mask  SRate "
676                         "ST Usg CT "
677                         " G db  L dB  R dB  VS dB "
678                         "  Server FrmCnt  FrmRdy F Underruns  Flushed"
679                         "%s\n",
680                         isServerLatencySupported() ? "   Latency" : "");
681 }
682 
appendDump(String8 & result,bool active)683 void AudioFlinger::PlaybackThread::Track::appendDump(String8& result, bool active)
684 {
685     char trackType;
686     switch (mType) {
687     case TYPE_DEFAULT:
688     case TYPE_OUTPUT:
689         if (isStatic()) {
690             trackType = 'S'; // static
691         } else {
692             trackType = ' '; // normal
693         }
694         break;
695     case TYPE_PATCH:
696         trackType = 'P';
697         break;
698     default:
699         trackType = '?';
700     }
701 
702     if (isFastTrack()) {
703         result.appendFormat("F%d %c %6d", mFastIndex, trackType, mId);
704     } else {
705         result.appendFormat("   %c %6d", trackType, mId);
706     }
707 
708     char nowInUnderrun;
709     switch (mObservedUnderruns.mBitFields.mMostRecent) {
710     case UNDERRUN_FULL:
711         nowInUnderrun = ' ';
712         break;
713     case UNDERRUN_PARTIAL:
714         nowInUnderrun = '<';
715         break;
716     case UNDERRUN_EMPTY:
717         nowInUnderrun = '*';
718         break;
719     default:
720         nowInUnderrun = '?';
721         break;
722     }
723 
724     char fillingStatus;
725     switch (mFillingUpStatus) {
726     case FS_INVALID:
727         fillingStatus = 'I';
728         break;
729     case FS_FILLING:
730         fillingStatus = 'f';
731         break;
732     case FS_FILLED:
733         fillingStatus = 'F';
734         break;
735     case FS_ACTIVE:
736         fillingStatus = 'A';
737         break;
738     default:
739         fillingStatus = '?';
740         break;
741     }
742 
743     // clip framesReadySafe to max representation in dump
744     const size_t framesReadySafe =
745             std::min(mAudioTrackServerProxy->framesReadySafe(), (size_t)99999999);
746 
747     // obtain volumes
748     const gain_minifloat_packed_t vlr = mAudioTrackServerProxy->getVolumeLR();
749     const std::pair<float /* volume */, bool /* active */> vsVolume =
750             mVolumeHandler->getLastVolume();
751 
752     // Our effective frame count is obtained by ServerProxy::getBufferSizeInFrames()
753     // as it may be reduced by the application.
754     const size_t bufferSizeInFrames = (size_t)mAudioTrackServerProxy->getBufferSizeInFrames();
755     // Check whether the buffer size has been modified by the app.
756     const char modifiedBufferChar = bufferSizeInFrames < mFrameCount
757             ? 'r' /* buffer reduced */: bufferSizeInFrames > mFrameCount
758                     ? 'e' /* error */ : ' ' /* identical */;
759 
760     result.appendFormat("%7s %6u %7u %7u %2s 0x%03X "
761                         "%08X %08X %6u "
762                         "%2u %3x %2x "
763                         "%5.2g %5.2g %5.2g %5.2g%c "
764                         "%08X %6zu%c %6zu %c %9u%c %7u",
765             active ? "yes" : "no",
766             (mClient == 0) ? getpid() : mClient->pid(),
767             mSessionId,
768             mPortId,
769             getTrackStateAsCodedString(),
770             mCblk->mFlags,
771 
772             mFormat,
773             mChannelMask,
774             sampleRate(),
775 
776             mStreamType,
777             mAttr.usage,
778             mAttr.content_type,
779 
780             20.0 * log10(mFinalVolume),
781             20.0 * log10(float_from_gain(gain_minifloat_unpack_left(vlr))),
782             20.0 * log10(float_from_gain(gain_minifloat_unpack_right(vlr))),
783             20.0 * log10(vsVolume.first), // VolumeShaper(s) total volume
784             vsVolume.second ? 'A' : ' ',  // if any VolumeShapers active
785 
786             mCblk->mServer,
787             bufferSizeInFrames,
788             modifiedBufferChar,
789             framesReadySafe,
790             fillingStatus,
791             mAudioTrackServerProxy->getUnderrunFrames(),
792             nowInUnderrun,
793             (unsigned)mAudioTrackServerProxy->framesFlushed() % 10000000
794             );
795 
796     if (isServerLatencySupported()) {
797         double latencyMs;
798         bool fromTrack;
799         if (getTrackLatencyMs(&latencyMs, &fromTrack) == OK) {
800             // Show latency in msec, followed by 't' if from track timestamp (the most accurate)
801             // or 'k' if estimated from kernel because track frames haven't been presented yet.
802             result.appendFormat(" %7.2lf %c", latencyMs, fromTrack ? 't' : 'k');
803         } else {
804             result.appendFormat("%10s", mCblk->mServer != 0 ? "unavail" : "new");
805         }
806     }
807     result.append("\n");
808 }
809 
sampleRate() const810 uint32_t AudioFlinger::PlaybackThread::Track::sampleRate() const {
811     return mAudioTrackServerProxy->getSampleRate();
812 }
813 
814 // AudioBufferProvider interface
getNextBuffer(AudioBufferProvider::Buffer * buffer)815 status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(AudioBufferProvider::Buffer* buffer)
816 {
817     ServerProxy::Buffer buf;
818     size_t desiredFrames = buffer->frameCount;
819     buf.mFrameCount = desiredFrames;
820     status_t status = mServerProxy->obtainBuffer(&buf);
821     buffer->frameCount = buf.mFrameCount;
822     buffer->raw = buf.mRaw;
823     if (buf.mFrameCount == 0 && !isStopping() && !isStopped() && !isPaused() && !isOffloaded()) {
824         ALOGV("%s(%d): underrun,  framesReady(%zu) < framesDesired(%zd), state: %d",
825                 __func__, mId, buf.mFrameCount, desiredFrames, mState);
826         mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);
827     } else {
828         mAudioTrackServerProxy->tallyUnderrunFrames(0);
829     }
830     return status;
831 }
832 
releaseBuffer(AudioBufferProvider::Buffer * buffer)833 void AudioFlinger::PlaybackThread::Track::releaseBuffer(AudioBufferProvider::Buffer* buffer)
834 {
835     interceptBuffer(*buffer);
836     TrackBase::releaseBuffer(buffer);
837 }
838 
839 // TODO: compensate for time shift between HW modules.
interceptBuffer(const AudioBufferProvider::Buffer & sourceBuffer)840 void AudioFlinger::PlaybackThread::Track::interceptBuffer(
841         const AudioBufferProvider::Buffer& sourceBuffer) {
842     auto start = std::chrono::steady_clock::now();
843     const size_t frameCount = sourceBuffer.frameCount;
844     if (frameCount == 0) {
845         return;  // No audio to intercept.
846         // Additionally PatchProxyBufferProvider::obtainBuffer (called by PathTrack::getNextBuffer)
847         // does not allow 0 frame size request contrary to getNextBuffer
848     }
849     for (auto& teePatch : mTeePatches) {
850         RecordThread::PatchRecord* patchRecord = teePatch.patchRecord.get();
851         const size_t framesWritten = patchRecord->writeFrames(
852                 sourceBuffer.i8, frameCount, mFrameSize);
853         const size_t framesLeft = frameCount - framesWritten;
854         ALOGW_IF(framesLeft != 0, "%s(%d) PatchRecord %d can not provide big enough "
855                  "buffer %zu/%zu, dropping %zu frames", __func__, mId, patchRecord->mId,
856                  framesWritten, frameCount, framesLeft);
857     }
858     auto spent = ceil<std::chrono::microseconds>(std::chrono::steady_clock::now() - start);
859     using namespace std::chrono_literals;
860     // Average is ~20us per track, this should virtually never be logged (Logging takes >200us)
861     ALOGD_IF(spent > 500us, "%s: took %lldus to intercept %zu tracks", __func__,
862              spent.count(), mTeePatches.size());
863 }
864 
865 // ExtendedAudioBufferProvider interface
866 
867 // framesReady() may return an approximation of the number of frames if called
868 // from a different thread than the one calling Proxy->obtainBuffer() and
869 // Proxy->releaseBuffer(). Also note there is no mutual exclusion in the
870 // AudioTrackServerProxy so be especially careful calling with FastTracks.
framesReady() const871 size_t AudioFlinger::PlaybackThread::Track::framesReady() const {
872     if (mSharedBuffer != 0 && (isStopped() || isStopping())) {
873         // Static tracks return zero frames immediately upon stopping (for FastTracks).
874         // The remainder of the buffer is not drained.
875         return 0;
876     }
877     return mAudioTrackServerProxy->framesReady();
878 }
879 
framesReleased() const880 int64_t AudioFlinger::PlaybackThread::Track::framesReleased() const
881 {
882     return mAudioTrackServerProxy->framesReleased();
883 }
884 
onTimestamp(const ExtendedTimestamp & timestamp)885 void AudioFlinger::PlaybackThread::Track::onTimestamp(const ExtendedTimestamp &timestamp)
886 {
887     // This call comes from a FastTrack and should be kept lockless.
888     // The server side frames are already translated to client frames.
889     mAudioTrackServerProxy->setTimestamp(timestamp);
890 
891     // We do not set drained here, as FastTrack timestamp may not go to very last frame.
892 
893     // Compute latency.
894     // TODO: Consider whether the server latency may be passed in by FastMixer
895     // as a constant for all active FastTracks.
896     const double latencyMs = timestamp.getOutputServerLatencyMs(sampleRate());
897     mServerLatencyFromTrack.store(true);
898     mServerLatencyMs.store(latencyMs);
899 }
900 
901 // Don't call for fast tracks; the framesReady() could result in priority inversion
isReady() const902 bool AudioFlinger::PlaybackThread::Track::isReady() const {
903     if (mFillingUpStatus != FS_FILLING || isStopped() || isPausing()) {
904         return true;
905     }
906 
907     if (isStopping()) {
908         if (framesReady() > 0) {
909             mFillingUpStatus = FS_FILLED;
910         }
911         return true;
912     }
913 
914     size_t bufferSizeInFrames = mServerProxy->getBufferSizeInFrames();
915     size_t framesToBeReady = std::min(mFrameCountToBeReady, bufferSizeInFrames);
916 
917     if (framesReady() >= framesToBeReady || (mCblk->mFlags & CBLK_FORCEREADY)) {
918         ALOGV("%s(%d): consider track ready with %zu/%zu, target was %zu)",
919               __func__, mId, framesReady(), bufferSizeInFrames, framesToBeReady);
920         mFillingUpStatus = FS_FILLED;
921         android_atomic_and(~CBLK_FORCEREADY, &mCblk->mFlags);
922         return true;
923     }
924     return false;
925 }
926 
start(AudioSystem::sync_event_t event __unused,audio_session_t triggerSession __unused)927 status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t event __unused,
928                                                     audio_session_t triggerSession __unused)
929 {
930     status_t status = NO_ERROR;
931     ALOGV("%s(%d): calling pid %d session %d",
932             __func__, mId, IPCThreadState::self()->getCallingPid(), mSessionId);
933 
934     sp<ThreadBase> thread = mThread.promote();
935     if (thread != 0) {
936         if (isOffloaded()) {
937             Mutex::Autolock _laf(thread->mAudioFlinger->mLock);
938             Mutex::Autolock _lth(thread->mLock);
939             sp<EffectChain> ec = thread->getEffectChain_l(mSessionId);
940             if (thread->mAudioFlinger->isNonOffloadableGlobalEffectEnabled_l() ||
941                     (ec != 0 && ec->isNonOffloadableEnabled())) {
942                 invalidate();
943                 return PERMISSION_DENIED;
944             }
945         }
946         Mutex::Autolock _lth(thread->mLock);
947         track_state state = mState;
948         // here the track could be either new, or restarted
949         // in both cases "unstop" the track
950 
951         // initial state-stopping. next state-pausing.
952         // What if resume is called ?
953 
954         if (state == PAUSED || state == PAUSING) {
955             if (mResumeToStopping) {
956                 // happened we need to resume to STOPPING_1
957                 mState = TrackBase::STOPPING_1;
958                 ALOGV("%s(%d): PAUSED => STOPPING_1 on thread %d",
959                         __func__, mId, (int)mThreadIoHandle);
960             } else {
961                 mState = TrackBase::RESUMING;
962                 ALOGV("%s(%d): PAUSED => RESUMING on thread %d",
963                         __func__,  mId, (int)mThreadIoHandle);
964             }
965         } else {
966             mState = TrackBase::ACTIVE;
967             ALOGV("%s(%d): ? => ACTIVE on thread %d",
968                     __func__, mId, (int)mThreadIoHandle);
969         }
970 
971         // states to reset position info for non-offloaded/direct tracks
972         if (!isOffloaded() && !isDirect()
973                 && (state == IDLE || state == STOPPED || state == FLUSHED)) {
974             mFrameMap.reset();
975         }
976         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
977         if (isFastTrack()) {
978             // refresh fast track underruns on start because that field is never cleared
979             // by the fast mixer; furthermore, the same track can be recycled, i.e. start
980             // after stop.
981             mObservedUnderruns = playbackThread->getFastTrackUnderruns(mFastIndex);
982         }
983         status = playbackThread->addTrack_l(this);
984         if (status == INVALID_OPERATION || status == PERMISSION_DENIED) {
985             triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
986             //  restore previous state if start was rejected by policy manager
987             if (status == PERMISSION_DENIED) {
988                 mState = state;
989             }
990         }
991 
992         // Audio timing metrics are computed a few mix cycles after starting.
993         {
994             mLogStartCountdown = LOG_START_COUNTDOWN;
995             mLogStartTimeNs = systemTime();
996             mLogStartFrames = mAudioTrackServerProxy->getTimestamp()
997                     .mPosition[ExtendedTimestamp::LOCATION_KERNEL];
998             mLogLatencyMs = 0.;
999         }
1000 
1001         if (status == NO_ERROR || status == ALREADY_EXISTS) {
1002             // for streaming tracks, remove the buffer read stop limit.
1003             mAudioTrackServerProxy->start();
1004         }
1005 
1006         // track was already in the active list, not a problem
1007         if (status == ALREADY_EXISTS) {
1008             status = NO_ERROR;
1009         } else {
1010             // Acknowledge any pending flush(), so that subsequent new data isn't discarded.
1011             // It is usually unsafe to access the server proxy from a binder thread.
1012             // But in this case we know the mixer thread (whether normal mixer or fast mixer)
1013             // isn't looking at this track yet:  we still hold the normal mixer thread lock,
1014             // and for fast tracks the track is not yet in the fast mixer thread's active set.
1015             // For static tracks, this is used to acknowledge change in position or loop.
1016             ServerProxy::Buffer buffer;
1017             buffer.mFrameCount = 1;
1018             (void) mAudioTrackServerProxy->obtainBuffer(&buffer, true /*ackFlush*/);
1019         }
1020     } else {
1021         status = BAD_VALUE;
1022     }
1023     if (status == NO_ERROR) {
1024         forEachTeePatchTrack([](auto patchTrack) { patchTrack->start(); });
1025     }
1026     return status;
1027 }
1028 
stop()1029 void AudioFlinger::PlaybackThread::Track::stop()
1030 {
1031     ALOGV("%s(%d): calling pid %d", __func__, mId, IPCThreadState::self()->getCallingPid());
1032     sp<ThreadBase> thread = mThread.promote();
1033     if (thread != 0) {
1034         Mutex::Autolock _l(thread->mLock);
1035         track_state state = mState;
1036         if (state == RESUMING || state == ACTIVE || state == PAUSING || state == PAUSED) {
1037             // If the track is not active (PAUSED and buffers full), flush buffers
1038             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
1039             if (playbackThread->mActiveTracks.indexOf(this) < 0) {
1040                 reset();
1041                 mState = STOPPED;
1042             } else if (!isFastTrack() && !isOffloaded() && !isDirect()) {
1043                 mState = STOPPED;
1044             } else {
1045                 // For fast tracks prepareTracks_l() will set state to STOPPING_2
1046                 // presentation is complete
1047                 // For an offloaded track this starts a drain and state will
1048                 // move to STOPPING_2 when drain completes and then STOPPED
1049                 mState = STOPPING_1;
1050                 if (isOffloaded()) {
1051                     mRetryCount = PlaybackThread::kMaxTrackStopRetriesOffload;
1052                 }
1053             }
1054             playbackThread->broadcast_l();
1055             ALOGV("%s(%d): not stopping/stopped => stopping/stopped on thread %d",
1056                     __func__, mId, (int)mThreadIoHandle);
1057         }
1058     }
1059     forEachTeePatchTrack([](auto patchTrack) { patchTrack->stop(); });
1060 }
1061 
pause()1062 void AudioFlinger::PlaybackThread::Track::pause()
1063 {
1064     ALOGV("%s(%d): calling pid %d", __func__, mId, IPCThreadState::self()->getCallingPid());
1065     sp<ThreadBase> thread = mThread.promote();
1066     if (thread != 0) {
1067         Mutex::Autolock _l(thread->mLock);
1068         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
1069         switch (mState) {
1070         case STOPPING_1:
1071         case STOPPING_2:
1072             if (!isOffloaded()) {
1073                 /* nothing to do if track is not offloaded */
1074                 break;
1075             }
1076 
1077             // Offloaded track was draining, we need to carry on draining when resumed
1078             mResumeToStopping = true;
1079             FALLTHROUGH_INTENDED;
1080         case ACTIVE:
1081         case RESUMING:
1082             mState = PAUSING;
1083             ALOGV("%s(%d): ACTIVE/RESUMING => PAUSING on thread %d",
1084                     __func__, mId, (int)mThreadIoHandle);
1085             playbackThread->broadcast_l();
1086             break;
1087 
1088         default:
1089             break;
1090         }
1091     }
1092     // Pausing the TeePatch to avoid a glitch on underrun, at the cost of buffered audio loss.
1093     forEachTeePatchTrack([](auto patchTrack) { patchTrack->pause(); });
1094 }
1095 
flush()1096 void AudioFlinger::PlaybackThread::Track::flush()
1097 {
1098     ALOGV("%s(%d)", __func__, mId);
1099     sp<ThreadBase> thread = mThread.promote();
1100     if (thread != 0) {
1101         Mutex::Autolock _l(thread->mLock);
1102         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
1103 
1104         // Flush the ring buffer now if the track is not active in the PlaybackThread.
1105         // Otherwise the flush would not be done until the track is resumed.
1106         // Requires FastTrack removal be BLOCK_UNTIL_ACKED
1107         if (playbackThread->mActiveTracks.indexOf(this) < 0) {
1108             (void)mServerProxy->flushBufferIfNeeded();
1109         }
1110 
1111         if (isOffloaded()) {
1112             // If offloaded we allow flush during any state except terminated
1113             // and keep the track active to avoid problems if user is seeking
1114             // rapidly and underlying hardware has a significant delay handling
1115             // a pause
1116             if (isTerminated()) {
1117                 return;
1118             }
1119 
1120             ALOGV("%s(%d): offload flush", __func__, mId);
1121             reset();
1122 
1123             if (mState == STOPPING_1 || mState == STOPPING_2) {
1124                 ALOGV("%s(%d): flushed in STOPPING_1 or 2 state, change state to ACTIVE",
1125                         __func__, mId);
1126                 mState = ACTIVE;
1127             }
1128 
1129             mFlushHwPending = true;
1130             mResumeToStopping = false;
1131         } else {
1132             if (mState != STOPPING_1 && mState != STOPPING_2 && mState != STOPPED &&
1133                     mState != PAUSED && mState != PAUSING && mState != IDLE && mState != FLUSHED) {
1134                 return;
1135             }
1136             // No point remaining in PAUSED state after a flush => go to
1137             // FLUSHED state
1138             mState = FLUSHED;
1139             // do not reset the track if it is still in the process of being stopped or paused.
1140             // this will be done by prepareTracks_l() when the track is stopped.
1141             // prepareTracks_l() will see mState == FLUSHED, then
1142             // remove from active track list, reset(), and trigger presentation complete
1143             if (isDirect()) {
1144                 mFlushHwPending = true;
1145             }
1146             if (playbackThread->mActiveTracks.indexOf(this) < 0) {
1147                 reset();
1148             }
1149         }
1150         // Prevent flush being lost if the track is flushed and then resumed
1151         // before mixer thread can run. This is important when offloading
1152         // because the hardware buffer could hold a large amount of audio
1153         playbackThread->broadcast_l();
1154     }
1155     // Flush the Tee to avoid on resume playing old data and glitching on the transition to new data
1156     forEachTeePatchTrack([](auto patchTrack) { patchTrack->flush(); });
1157 }
1158 
1159 // must be called with thread lock held
flushAck()1160 void AudioFlinger::PlaybackThread::Track::flushAck()
1161 {
1162     if (!isOffloaded() && !isDirect())
1163         return;
1164 
1165     // Clear the client ring buffer so that the app can prime the buffer while paused.
1166     // Otherwise it might not get cleared until playback is resumed and obtainBuffer() is called.
1167     mServerProxy->flushBufferIfNeeded();
1168 
1169     mFlushHwPending = false;
1170 }
1171 
reset()1172 void AudioFlinger::PlaybackThread::Track::reset()
1173 {
1174     // Do not reset twice to avoid discarding data written just after a flush and before
1175     // the audioflinger thread detects the track is stopped.
1176     if (!mResetDone) {
1177         // Force underrun condition to avoid false underrun callback until first data is
1178         // written to buffer
1179         android_atomic_and(~CBLK_FORCEREADY, &mCblk->mFlags);
1180         mFillingUpStatus = FS_FILLING;
1181         mResetDone = true;
1182         if (mState == FLUSHED) {
1183             mState = IDLE;
1184         }
1185     }
1186 }
1187 
setParameters(const String8 & keyValuePairs)1188 status_t AudioFlinger::PlaybackThread::Track::setParameters(const String8& keyValuePairs)
1189 {
1190     sp<ThreadBase> thread = mThread.promote();
1191     if (thread == 0) {
1192         ALOGE("%s(%d): thread is dead", __func__, mId);
1193         return FAILED_TRANSACTION;
1194     } else if ((thread->type() == ThreadBase::DIRECT) ||
1195                     (thread->type() == ThreadBase::OFFLOAD)) {
1196         return thread->setParameters(keyValuePairs);
1197     } else {
1198         return PERMISSION_DENIED;
1199     }
1200 }
1201 
selectPresentation(int presentationId,int programId)1202 status_t AudioFlinger::PlaybackThread::Track::selectPresentation(int presentationId,
1203         int programId) {
1204     sp<ThreadBase> thread = mThread.promote();
1205     if (thread == 0) {
1206         ALOGE("thread is dead");
1207         return FAILED_TRANSACTION;
1208     } else if ((thread->type() == ThreadBase::DIRECT) || (thread->type() == ThreadBase::OFFLOAD)) {
1209         DirectOutputThread *directOutputThread = static_cast<DirectOutputThread*>(thread.get());
1210         return directOutputThread->selectPresentation(presentationId, programId);
1211     }
1212     return INVALID_OPERATION;
1213 }
1214 
applyVolumeShaper(const sp<VolumeShaper::Configuration> & configuration,const sp<VolumeShaper::Operation> & operation)1215 VolumeShaper::Status AudioFlinger::PlaybackThread::Track::applyVolumeShaper(
1216         const sp<VolumeShaper::Configuration>& configuration,
1217         const sp<VolumeShaper::Operation>& operation)
1218 {
1219     sp<VolumeShaper::Configuration> newConfiguration;
1220 
1221     if (isOffloadedOrDirect()) {
1222         const VolumeShaper::Configuration::OptionFlag optionFlag
1223             = configuration->getOptionFlags();
1224         if ((optionFlag & VolumeShaper::Configuration::OPTION_FLAG_CLOCK_TIME) == 0) {
1225             ALOGW("%s(%d): %s tracks do not support frame counted VolumeShaper,"
1226                     " using clock time instead",
1227                     __func__, mId,
1228                     isOffloaded() ? "Offload" : "Direct");
1229             newConfiguration = new VolumeShaper::Configuration(*configuration);
1230             newConfiguration->setOptionFlags(
1231                 VolumeShaper::Configuration::OptionFlag(optionFlag
1232                         | VolumeShaper::Configuration::OPTION_FLAG_CLOCK_TIME));
1233         }
1234     }
1235 
1236     VolumeShaper::Status status = mVolumeHandler->applyVolumeShaper(
1237             (newConfiguration.get() != nullptr ? newConfiguration : configuration), operation);
1238 
1239     if (isOffloadedOrDirect()) {
1240         // Signal thread to fetch new volume.
1241         sp<ThreadBase> thread = mThread.promote();
1242         if (thread != 0) {
1243             Mutex::Autolock _l(thread->mLock);
1244             thread->broadcast_l();
1245         }
1246     }
1247     return status;
1248 }
1249 
getVolumeShaperState(int id)1250 sp<VolumeShaper::State> AudioFlinger::PlaybackThread::Track::getVolumeShaperState(int id)
1251 {
1252     // Note: We don't check if Thread exists.
1253 
1254     // mVolumeHandler is thread safe.
1255     return mVolumeHandler->getVolumeShaperState(id);
1256 }
1257 
setFinalVolume(float volume)1258 void AudioFlinger::PlaybackThread::Track::setFinalVolume(float volume)
1259 {
1260     if (mFinalVolume != volume) { // Compare to an epsilon if too many meaningless updates
1261         mFinalVolume = volume;
1262         setMetadataHasChanged();
1263         mTrackMetrics.logVolume(volume);
1264     }
1265 }
1266 
copyMetadataTo(MetadataInserter & backInserter) const1267 void AudioFlinger::PlaybackThread::Track::copyMetadataTo(MetadataInserter& backInserter) const
1268 {
1269     *backInserter++ = {
1270             .usage = mAttr.usage,
1271             .content_type = mAttr.content_type,
1272             .gain = mFinalVolume,
1273     };
1274 }
1275 
setTeePatches(TeePatches teePatches)1276 void AudioFlinger::PlaybackThread::Track::setTeePatches(TeePatches teePatches) {
1277     forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); });
1278     mTeePatches = std::move(teePatches);
1279 }
1280 
getTimestamp(AudioTimestamp & timestamp)1281 status_t AudioFlinger::PlaybackThread::Track::getTimestamp(AudioTimestamp& timestamp)
1282 {
1283     if (!isOffloaded() && !isDirect()) {
1284         return INVALID_OPERATION; // normal tracks handled through SSQ
1285     }
1286     sp<ThreadBase> thread = mThread.promote();
1287     if (thread == 0) {
1288         return INVALID_OPERATION;
1289     }
1290 
1291     Mutex::Autolock _l(thread->mLock);
1292     PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
1293     return playbackThread->getTimestamp_l(timestamp);
1294 }
1295 
attachAuxEffect(int EffectId)1296 status_t AudioFlinger::PlaybackThread::Track::attachAuxEffect(int EffectId)
1297 {
1298     sp<ThreadBase> thread = mThread.promote();
1299     if (thread == nullptr) {
1300         return DEAD_OBJECT;
1301     }
1302 
1303     sp<PlaybackThread> dstThread = (PlaybackThread *)thread.get();
1304     sp<PlaybackThread> srcThread; // srcThread is initialized by call to moveAuxEffectToIo()
1305     sp<AudioFlinger> af = mClient->audioFlinger();
1306     status_t status = af->moveAuxEffectToIo(EffectId, dstThread, &srcThread);
1307 
1308     if (EffectId != 0 && status == NO_ERROR) {
1309         status = dstThread->attachAuxEffect(this, EffectId);
1310         if (status == NO_ERROR) {
1311             AudioSystem::moveEffectsToIo(std::vector<int>(EffectId), dstThread->id());
1312         }
1313     }
1314 
1315     if (status != NO_ERROR && srcThread != nullptr) {
1316         af->moveAuxEffectToIo(EffectId, srcThread, &dstThread);
1317     }
1318     return status;
1319 }
1320 
setAuxBuffer(int EffectId,int32_t * buffer)1321 void AudioFlinger::PlaybackThread::Track::setAuxBuffer(int EffectId, int32_t *buffer)
1322 {
1323     mAuxEffectId = EffectId;
1324     mAuxBuffer = buffer;
1325 }
1326 
presentationComplete(int64_t framesWritten,size_t audioHalFrames)1327 bool AudioFlinger::PlaybackThread::Track::presentationComplete(
1328         int64_t framesWritten, size_t audioHalFrames)
1329 {
1330     // TODO: improve this based on FrameMap if it exists, to ensure full drain.
1331     // This assists in proper timestamp computation as well as wakelock management.
1332 
1333     // a track is considered presented when the total number of frames written to audio HAL
1334     // corresponds to the number of frames written when presentationComplete() is called for the
1335     // first time (mPresentationCompleteFrames == 0) plus the buffer filling status at that time.
1336     // For an offloaded track the HAL+h/w delay is variable so a HAL drain() is used
1337     // to detect when all frames have been played. In this case framesWritten isn't
1338     // useful because it doesn't always reflect whether there is data in the h/w
1339     // buffers, particularly if a track has been paused and resumed during draining
1340     ALOGV("%s(%d): presentationComplete() mPresentationCompleteFrames %lld framesWritten %lld",
1341             __func__, mId,
1342             (long long)mPresentationCompleteFrames, (long long)framesWritten);
1343     if (mPresentationCompleteFrames == 0) {
1344         mPresentationCompleteFrames = framesWritten + audioHalFrames;
1345         ALOGV("%s(%d): presentationComplete() reset:"
1346                 " mPresentationCompleteFrames %lld audioHalFrames %zu",
1347                 __func__, mId,
1348                 (long long)mPresentationCompleteFrames, audioHalFrames);
1349     }
1350 
1351     bool complete;
1352     if (isOffloaded()) {
1353         complete = true;
1354     } else if (isDirect() || isFastTrack()) { // these do not go through linear map
1355         complete = framesWritten >= (int64_t) mPresentationCompleteFrames;
1356     } else {  // Normal tracks, OutputTracks, and PatchTracks
1357         complete = framesWritten >= (int64_t) mPresentationCompleteFrames
1358                 && mAudioTrackServerProxy->isDrained();
1359     }
1360 
1361     if (complete) {
1362         triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
1363         mAudioTrackServerProxy->setStreamEndDone();
1364         return true;
1365     }
1366     return false;
1367 }
1368 
triggerEvents(AudioSystem::sync_event_t type)1369 void AudioFlinger::PlaybackThread::Track::triggerEvents(AudioSystem::sync_event_t type)
1370 {
1371     for (size_t i = 0; i < mSyncEvents.size();) {
1372         if (mSyncEvents[i]->type() == type) {
1373             mSyncEvents[i]->trigger();
1374             mSyncEvents.removeAt(i);
1375         } else {
1376             ++i;
1377         }
1378     }
1379 }
1380 
1381 // implement VolumeBufferProvider interface
1382 
getVolumeLR()1383 gain_minifloat_packed_t AudioFlinger::PlaybackThread::Track::getVolumeLR()
1384 {
1385     // called by FastMixer, so not allowed to take any locks, block, or do I/O including logs
1386     ALOG_ASSERT(isFastTrack() && (mCblk != NULL));
1387     gain_minifloat_packed_t vlr = mAudioTrackServerProxy->getVolumeLR();
1388     float vl = float_from_gain(gain_minifloat_unpack_left(vlr));
1389     float vr = float_from_gain(gain_minifloat_unpack_right(vlr));
1390     // track volumes come from shared memory, so can't be trusted and must be clamped
1391     if (vl > GAIN_FLOAT_UNITY) {
1392         vl = GAIN_FLOAT_UNITY;
1393     }
1394     if (vr > GAIN_FLOAT_UNITY) {
1395         vr = GAIN_FLOAT_UNITY;
1396     }
1397     // now apply the cached master volume and stream type volume;
1398     // this is trusted but lacks any synchronization or barrier so may be stale
1399     float v = mCachedVolume;
1400     vl *= v;
1401     vr *= v;
1402     // re-combine into packed minifloat
1403     vlr = gain_minifloat_pack(gain_from_float(vl), gain_from_float(vr));
1404     // FIXME look at mute, pause, and stop flags
1405     return vlr;
1406 }
1407 
setSyncEvent(const sp<SyncEvent> & event)1408 status_t AudioFlinger::PlaybackThread::Track::setSyncEvent(const sp<SyncEvent>& event)
1409 {
1410     if (isTerminated() || mState == PAUSED ||
1411             ((framesReady() == 0) && ((mSharedBuffer != 0) ||
1412                                       (mState == STOPPED)))) {
1413         ALOGW("%s(%d): in invalid state %d on session %d %s mode, framesReady %zu",
1414               __func__, mId,
1415               mState, mSessionId, (mSharedBuffer != 0) ? "static" : "stream", framesReady());
1416         event->cancel();
1417         return INVALID_OPERATION;
1418     }
1419     (void) TrackBase::setSyncEvent(event);
1420     return NO_ERROR;
1421 }
1422 
invalidate()1423 void AudioFlinger::PlaybackThread::Track::invalidate()
1424 {
1425     TrackBase::invalidate();
1426     signalClientFlag(CBLK_INVALID);
1427 }
1428 
disable()1429 void AudioFlinger::PlaybackThread::Track::disable()
1430 {
1431     // TODO(b/142394888): the filling status should also be reset to filling
1432     signalClientFlag(CBLK_DISABLED);
1433 }
1434 
signalClientFlag(int32_t flag)1435 void AudioFlinger::PlaybackThread::Track::signalClientFlag(int32_t flag)
1436 {
1437     // FIXME should use proxy, and needs work
1438     audio_track_cblk_t* cblk = mCblk;
1439     android_atomic_or(flag, &cblk->mFlags);
1440     android_atomic_release_store(0x40000000, &cblk->mFutex);
1441     // client is not in server, so FUTEX_WAKE is needed instead of FUTEX_WAKE_PRIVATE
1442     (void) syscall(__NR_futex, &cblk->mFutex, FUTEX_WAKE, INT_MAX);
1443 }
1444 
signal()1445 void AudioFlinger::PlaybackThread::Track::signal()
1446 {
1447     sp<ThreadBase> thread = mThread.promote();
1448     if (thread != 0) {
1449         PlaybackThread *t = (PlaybackThread *)thread.get();
1450         Mutex::Autolock _l(t->mLock);
1451         t->broadcast_l();
1452     }
1453 }
1454 
1455 //To be called with thread lock held
isResumePending()1456 bool AudioFlinger::PlaybackThread::Track::isResumePending() {
1457 
1458     if (mState == RESUMING)
1459         return true;
1460     /* Resume is pending if track was stopping before pause was called */
1461     if (mState == STOPPING_1 &&
1462         mResumeToStopping)
1463         return true;
1464 
1465     return false;
1466 }
1467 
1468 //To be called with thread lock held
resumeAck()1469 void AudioFlinger::PlaybackThread::Track::resumeAck() {
1470 
1471 
1472     if (mState == RESUMING)
1473         mState = ACTIVE;
1474 
1475     // Other possibility of  pending resume is stopping_1 state
1476     // Do not update the state from stopping as this prevents
1477     // drain being called.
1478     if (mState == STOPPING_1) {
1479         mResumeToStopping = false;
1480     }
1481 }
1482 
1483 //To be called with thread lock held
updateTrackFrameInfo(int64_t trackFramesReleased,int64_t sinkFramesWritten,uint32_t halSampleRate,const ExtendedTimestamp & timeStamp)1484 void AudioFlinger::PlaybackThread::Track::updateTrackFrameInfo(
1485         int64_t trackFramesReleased, int64_t sinkFramesWritten,
1486         uint32_t halSampleRate, const ExtendedTimestamp &timeStamp) {
1487    // Make the kernel frametime available.
1488     const FrameTime ft{
1489             timeStamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL],
1490             timeStamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL]};
1491     // ALOGD("FrameTime: %lld %lld", (long long)ft.frames, (long long)ft.timeNs);
1492     mKernelFrameTime.store(ft);
1493     if (!audio_is_linear_pcm(mFormat)) {
1494         return;
1495     }
1496 
1497     //update frame map
1498     mFrameMap.push(trackFramesReleased, sinkFramesWritten);
1499 
1500     // adjust server times and set drained state.
1501     //
1502     // Our timestamps are only updated when the track is on the Thread active list.
1503     // We need to ensure that tracks are not removed before full drain.
1504     ExtendedTimestamp local = timeStamp;
1505     bool drained = true; // default assume drained, if no server info found
1506     bool checked = false;
1507     for (int i = ExtendedTimestamp::LOCATION_MAX - 1;
1508             i >= ExtendedTimestamp::LOCATION_SERVER; --i) {
1509         // Lookup the track frame corresponding to the sink frame position.
1510         if (local.mTimeNs[i] > 0) {
1511             local.mPosition[i] = mFrameMap.findX(local.mPosition[i]);
1512             // check drain state from the latest stage in the pipeline.
1513             if (!checked && i <= ExtendedTimestamp::LOCATION_KERNEL) {
1514                 drained = local.mPosition[i] >= mAudioTrackServerProxy->framesReleased();
1515                 checked = true;
1516             }
1517         }
1518     }
1519 
1520     mAudioTrackServerProxy->setDrained(drained);
1521     // Set correction for flushed frames that are not accounted for in released.
1522     local.mFlushed = mAudioTrackServerProxy->framesFlushed();
1523     mServerProxy->setTimestamp(local);
1524 
1525     // Compute latency info.
1526     const bool useTrackTimestamp = !drained;
1527     const double latencyMs = useTrackTimestamp
1528             ? local.getOutputServerLatencyMs(sampleRate())
1529             : timeStamp.getOutputServerLatencyMs(halSampleRate);
1530 
1531     mServerLatencyFromTrack.store(useTrackTimestamp);
1532     mServerLatencyMs.store(latencyMs);
1533 
1534     if (mLogStartCountdown > 0
1535             && local.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] > 0
1536             && local.mPosition[ExtendedTimestamp::LOCATION_KERNEL] > 0)
1537     {
1538         if (mLogStartCountdown > 1) {
1539             --mLogStartCountdown;
1540         } else if (latencyMs < mLogLatencyMs) { // wait for latency to stabilize (dip)
1541             mLogStartCountdown = 0;
1542             // startup is the difference in times for the current timestamp and our start
1543             double startUpMs =
1544                     (local.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] - mLogStartTimeNs) * 1e-6;
1545             // adjust for frames played.
1546             startUpMs -= (local.mPosition[ExtendedTimestamp::LOCATION_KERNEL] - mLogStartFrames)
1547                     * 1e3 / mSampleRate;
1548             ALOGV("%s: latencyMs:%lf startUpMs:%lf"
1549                     " localTime:%lld startTime:%lld"
1550                     " localPosition:%lld startPosition:%lld",
1551                     __func__, latencyMs, startUpMs,
1552                     (long long)local.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL],
1553                     (long long)mLogStartTimeNs,
1554                     (long long)local.mPosition[ExtendedTimestamp::LOCATION_KERNEL],
1555                     (long long)mLogStartFrames);
1556             mTrackMetrics.logLatencyAndStartup(latencyMs, startUpMs);
1557         }
1558         mLogLatencyMs = latencyMs;
1559     }
1560 }
1561 
mute(bool * ret)1562 binder::Status AudioFlinger::PlaybackThread::Track::AudioVibrationController::mute(
1563         /*out*/ bool *ret) {
1564     *ret = false;
1565     sp<ThreadBase> thread = mTrack->mThread.promote();
1566     if (thread != 0) {
1567         // Lock for updating mHapticPlaybackEnabled.
1568         Mutex::Autolock _l(thread->mLock);
1569         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
1570         if ((mTrack->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE
1571                 && playbackThread->mHapticChannelCount > 0) {
1572             mTrack->setHapticPlaybackEnabled(false);
1573             *ret = true;
1574         }
1575     }
1576     return binder::Status::ok();
1577 }
1578 
unmute(bool * ret)1579 binder::Status AudioFlinger::PlaybackThread::Track::AudioVibrationController::unmute(
1580         /*out*/ bool *ret) {
1581     *ret = false;
1582     sp<ThreadBase> thread = mTrack->mThread.promote();
1583     if (thread != 0) {
1584         // Lock for updating mHapticPlaybackEnabled.
1585         Mutex::Autolock _l(thread->mLock);
1586         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
1587         if ((mTrack->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE
1588                 && playbackThread->mHapticChannelCount > 0) {
1589             mTrack->setHapticPlaybackEnabled(true);
1590             *ret = true;
1591         }
1592     }
1593     return binder::Status::ok();
1594 }
1595 
1596 // ----------------------------------------------------------------------------
1597 #undef LOG_TAG
1598 #define LOG_TAG "AF::OutputTrack"
1599 
OutputTrack(PlaybackThread * playbackThread,DuplicatingThread * sourceThread,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,uid_t uid)1600 AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(
1601             PlaybackThread *playbackThread,
1602             DuplicatingThread *sourceThread,
1603             uint32_t sampleRate,
1604             audio_format_t format,
1605             audio_channel_mask_t channelMask,
1606             size_t frameCount,
1607             uid_t uid)
1608     :   Track(playbackThread, NULL, AUDIO_STREAM_PATCH,
1609               audio_attributes_t{} /* currently unused for output track */,
1610               sampleRate, format, channelMask, frameCount,
1611               nullptr /* buffer */, (size_t)0 /* bufferSize */, nullptr /* sharedBuffer */,
1612               AUDIO_SESSION_NONE, getpid(), uid, AUDIO_OUTPUT_FLAG_NONE,
1613               TYPE_OUTPUT),
1614     mActive(false), mSourceThread(sourceThread)
1615 {
1616 
1617     if (mCblk != NULL) {
1618         mOutBuffer.frameCount = 0;
1619         playbackThread->mTracks.add(this);
1620         ALOGV("%s(): mCblk %p, mBuffer %p, "
1621                 "frameCount %zu, mChannelMask 0x%08x",
1622                 __func__, mCblk, mBuffer,
1623                 frameCount, mChannelMask);
1624         // since client and server are in the same process,
1625         // the buffer has the same virtual address on both sides
1626         mClientProxy = new AudioTrackClientProxy(mCblk, mBuffer, mFrameCount, mFrameSize,
1627                 true /*clientInServer*/);
1628         mClientProxy->setVolumeLR(GAIN_MINIFLOAT_PACKED_UNITY);
1629         mClientProxy->setSendLevel(0.0);
1630         mClientProxy->setSampleRate(sampleRate);
1631     } else {
1632         ALOGW("%s(%d): Error creating output track on thread %d",
1633                 __func__, mId, (int)mThreadIoHandle);
1634     }
1635 }
1636 
~OutputTrack()1637 AudioFlinger::PlaybackThread::OutputTrack::~OutputTrack()
1638 {
1639     clearBufferQueue();
1640     // superclass destructor will now delete the server proxy and shared memory both refer to
1641 }
1642 
start(AudioSystem::sync_event_t event,audio_session_t triggerSession)1643 status_t AudioFlinger::PlaybackThread::OutputTrack::start(AudioSystem::sync_event_t event,
1644                                                           audio_session_t triggerSession)
1645 {
1646     status_t status = Track::start(event, triggerSession);
1647     if (status != NO_ERROR) {
1648         return status;
1649     }
1650 
1651     mActive = true;
1652     mRetryCount = 127;
1653     return status;
1654 }
1655 
stop()1656 void AudioFlinger::PlaybackThread::OutputTrack::stop()
1657 {
1658     Track::stop();
1659     clearBufferQueue();
1660     mOutBuffer.frameCount = 0;
1661     mActive = false;
1662 }
1663 
write(void * data,uint32_t frames)1664 ssize_t AudioFlinger::PlaybackThread::OutputTrack::write(void* data, uint32_t frames)
1665 {
1666     Buffer *pInBuffer;
1667     Buffer inBuffer;
1668     bool outputBufferFull = false;
1669     inBuffer.frameCount = frames;
1670     inBuffer.raw = data;
1671 
1672     uint32_t waitTimeLeftMs = mSourceThread->waitTimeMs();
1673 
1674     if (!mActive && frames != 0) {
1675         (void) start();
1676     }
1677 
1678     while (waitTimeLeftMs) {
1679         // First write pending buffers, then new data
1680         if (mBufferQueue.size()) {
1681             pInBuffer = mBufferQueue.itemAt(0);
1682         } else {
1683             pInBuffer = &inBuffer;
1684         }
1685 
1686         if (pInBuffer->frameCount == 0) {
1687             break;
1688         }
1689 
1690         if (mOutBuffer.frameCount == 0) {
1691             mOutBuffer.frameCount = pInBuffer->frameCount;
1692             nsecs_t startTime = systemTime();
1693             status_t status = obtainBuffer(&mOutBuffer, waitTimeLeftMs);
1694             if (status != NO_ERROR && status != NOT_ENOUGH_DATA) {
1695                 ALOGV("%s(%d): thread %d no more output buffers; status %d",
1696                         __func__, mId,
1697                         (int)mThreadIoHandle, status);
1698                 outputBufferFull = true;
1699                 break;
1700             }
1701             uint32_t waitTimeMs = (uint32_t)ns2ms(systemTime() - startTime);
1702             if (waitTimeLeftMs >= waitTimeMs) {
1703                 waitTimeLeftMs -= waitTimeMs;
1704             } else {
1705                 waitTimeLeftMs = 0;
1706             }
1707             if (status == NOT_ENOUGH_DATA) {
1708                 restartIfDisabled();
1709                 continue;
1710             }
1711         }
1712 
1713         uint32_t outFrames = pInBuffer->frameCount > mOutBuffer.frameCount ? mOutBuffer.frameCount :
1714                 pInBuffer->frameCount;
1715         memcpy(mOutBuffer.raw, pInBuffer->raw, outFrames * mFrameSize);
1716         Proxy::Buffer buf;
1717         buf.mFrameCount = outFrames;
1718         buf.mRaw = NULL;
1719         mClientProxy->releaseBuffer(&buf);
1720         restartIfDisabled();
1721         pInBuffer->frameCount -= outFrames;
1722         pInBuffer->raw = (int8_t *)pInBuffer->raw + outFrames * mFrameSize;
1723         mOutBuffer.frameCount -= outFrames;
1724         mOutBuffer.raw = (int8_t *)mOutBuffer.raw + outFrames * mFrameSize;
1725 
1726         if (pInBuffer->frameCount == 0) {
1727             if (mBufferQueue.size()) {
1728                 mBufferQueue.removeAt(0);
1729                 free(pInBuffer->mBuffer);
1730                 if (pInBuffer != &inBuffer) {
1731                     delete pInBuffer;
1732                 }
1733                 ALOGV("%s(%d): thread %d released overflow buffer %zu",
1734                         __func__, mId,
1735                         (int)mThreadIoHandle, mBufferQueue.size());
1736             } else {
1737                 break;
1738             }
1739         }
1740     }
1741 
1742     // If we could not write all frames, allocate a buffer and queue it for next time.
1743     if (inBuffer.frameCount) {
1744         sp<ThreadBase> thread = mThread.promote();
1745         if (thread != 0 && !thread->standby()) {
1746             if (mBufferQueue.size() < kMaxOverFlowBuffers) {
1747                 pInBuffer = new Buffer;
1748                 pInBuffer->mBuffer = malloc(inBuffer.frameCount * mFrameSize);
1749                 pInBuffer->frameCount = inBuffer.frameCount;
1750                 pInBuffer->raw = pInBuffer->mBuffer;
1751                 memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * mFrameSize);
1752                 mBufferQueue.add(pInBuffer);
1753                 ALOGV("%s(%d): thread %d adding overflow buffer %zu", __func__, mId,
1754                         (int)mThreadIoHandle, mBufferQueue.size());
1755                 // audio data is consumed (stored locally); set frameCount to 0.
1756                 inBuffer.frameCount = 0;
1757             } else {
1758                 ALOGW("%s(%d): thread %d no more overflow buffers",
1759                         __func__, mId, (int)mThreadIoHandle);
1760                 // TODO: return error for this.
1761             }
1762         }
1763     }
1764 
1765     // Calling write() with a 0 length buffer means that no more data will be written:
1766     // We rely on stop() to set the appropriate flags to allow the remaining frames to play out.
1767     if (frames == 0 && mBufferQueue.size() == 0 && mActive) {
1768         stop();
1769     }
1770 
1771     return frames - inBuffer.frameCount;  // number of frames consumed.
1772 }
1773 
copyMetadataTo(MetadataInserter & backInserter) const1774 void AudioFlinger::PlaybackThread::OutputTrack::copyMetadataTo(MetadataInserter& backInserter) const
1775 {
1776     std::lock_guard<std::mutex> lock(mTrackMetadatasMutex);
1777     backInserter = std::copy(mTrackMetadatas.begin(), mTrackMetadatas.end(), backInserter);
1778 }
1779 
setMetadatas(const SourceMetadatas & metadatas)1780 void AudioFlinger::PlaybackThread::OutputTrack::setMetadatas(const SourceMetadatas& metadatas) {
1781     {
1782         std::lock_guard<std::mutex> lock(mTrackMetadatasMutex);
1783         mTrackMetadatas = metadatas;
1784     }
1785     // No need to adjust metadata track volumes as OutputTrack volumes are always 0dBFS.
1786     setMetadataHasChanged();
1787 }
1788 
obtainBuffer(AudioBufferProvider::Buffer * buffer,uint32_t waitTimeMs)1789 status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer(
1790         AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs)
1791 {
1792     ClientProxy::Buffer buf;
1793     buf.mFrameCount = buffer->frameCount;
1794     struct timespec timeout;
1795     timeout.tv_sec = waitTimeMs / 1000;
1796     timeout.tv_nsec = (int) (waitTimeMs % 1000) * 1000000;
1797     status_t status = mClientProxy->obtainBuffer(&buf, &timeout);
1798     buffer->frameCount = buf.mFrameCount;
1799     buffer->raw = buf.mRaw;
1800     return status;
1801 }
1802 
clearBufferQueue()1803 void AudioFlinger::PlaybackThread::OutputTrack::clearBufferQueue()
1804 {
1805     size_t size = mBufferQueue.size();
1806 
1807     for (size_t i = 0; i < size; i++) {
1808         Buffer *pBuffer = mBufferQueue.itemAt(i);
1809         free(pBuffer->mBuffer);
1810         delete pBuffer;
1811     }
1812     mBufferQueue.clear();
1813 }
1814 
restartIfDisabled()1815 void AudioFlinger::PlaybackThread::OutputTrack::restartIfDisabled()
1816 {
1817     int32_t flags = android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags);
1818     if (mActive && (flags & CBLK_DISABLED)) {
1819         start();
1820     }
1821 }
1822 
1823 // ----------------------------------------------------------------------------
1824 #undef LOG_TAG
1825 #define LOG_TAG "AF::PatchTrack"
1826 
PatchTrack(PlaybackThread * playbackThread,audio_stream_type_t streamType,uint32_t sampleRate,audio_channel_mask_t channelMask,audio_format_t format,size_t frameCount,void * buffer,size_t bufferSize,audio_output_flags_t flags,const Timeout & timeout,size_t frameCountToBeReady)1827 AudioFlinger::PlaybackThread::PatchTrack::PatchTrack(PlaybackThread *playbackThread,
1828                                                      audio_stream_type_t streamType,
1829                                                      uint32_t sampleRate,
1830                                                      audio_channel_mask_t channelMask,
1831                                                      audio_format_t format,
1832                                                      size_t frameCount,
1833                                                      void *buffer,
1834                                                      size_t bufferSize,
1835                                                      audio_output_flags_t flags,
1836                                                      const Timeout& timeout,
1837                                                      size_t frameCountToBeReady)
1838     :   Track(playbackThread, NULL, streamType,
1839               audio_attributes_t{} /* currently unused for patch track */,
1840               sampleRate, format, channelMask, frameCount,
1841               buffer, bufferSize, nullptr /* sharedBuffer */,
1842               AUDIO_SESSION_NONE, getpid(), AID_AUDIOSERVER, flags, TYPE_PATCH,
1843               AUDIO_PORT_HANDLE_NONE, frameCountToBeReady),
1844         PatchTrackBase(new ClientProxy(mCblk, mBuffer, frameCount, mFrameSize, true, true),
1845                        *playbackThread, timeout)
1846 {
1847     ALOGV("%s(%d): sampleRate %d mPeerTimeout %d.%03d sec",
1848                                       __func__, mId, sampleRate,
1849                                       (int)mPeerTimeout.tv_sec,
1850                                       (int)(mPeerTimeout.tv_nsec / 1000000));
1851 }
1852 
~PatchTrack()1853 AudioFlinger::PlaybackThread::PatchTrack::~PatchTrack()
1854 {
1855     ALOGV("%s(%d)", __func__, mId);
1856 }
1857 
framesReady() const1858 size_t AudioFlinger::PlaybackThread::PatchTrack::framesReady() const
1859 {
1860     if (mPeerProxy && mPeerProxy->producesBufferOnDemand()) {
1861         return std::numeric_limits<size_t>::max();
1862     } else {
1863         return Track::framesReady();
1864     }
1865 }
1866 
start(AudioSystem::sync_event_t event,audio_session_t triggerSession)1867 status_t AudioFlinger::PlaybackThread::PatchTrack::start(AudioSystem::sync_event_t event,
1868                                                          audio_session_t triggerSession)
1869 {
1870     status_t status = Track::start(event, triggerSession);
1871     if (status != NO_ERROR) {
1872         return status;
1873     }
1874     android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags);
1875     return status;
1876 }
1877 
1878 // AudioBufferProvider interface
getNextBuffer(AudioBufferProvider::Buffer * buffer)1879 status_t AudioFlinger::PlaybackThread::PatchTrack::getNextBuffer(
1880         AudioBufferProvider::Buffer* buffer)
1881 {
1882     ALOG_ASSERT(mPeerProxy != 0, "%s(%d): called without peer proxy", __func__, mId);
1883     Proxy::Buffer buf;
1884     buf.mFrameCount = buffer->frameCount;
1885     if (ATRACE_ENABLED()) {
1886         std::string traceName("PTnReq");
1887         traceName += std::to_string(id());
1888         ATRACE_INT(traceName.c_str(), buf.mFrameCount);
1889     }
1890     status_t status = mPeerProxy->obtainBuffer(&buf, &mPeerTimeout);
1891     ALOGV_IF(status != NO_ERROR, "%s(%d): getNextBuffer status %d", __func__, mId, status);
1892     buffer->frameCount = buf.mFrameCount;
1893     if (ATRACE_ENABLED()) {
1894         std::string traceName("PTnObt");
1895         traceName += std::to_string(id());
1896         ATRACE_INT(traceName.c_str(), buf.mFrameCount);
1897     }
1898     if (buf.mFrameCount == 0) {
1899         return WOULD_BLOCK;
1900     }
1901     status = Track::getNextBuffer(buffer);
1902     return status;
1903 }
1904 
releaseBuffer(AudioBufferProvider::Buffer * buffer)1905 void AudioFlinger::PlaybackThread::PatchTrack::releaseBuffer(AudioBufferProvider::Buffer* buffer)
1906 {
1907     ALOG_ASSERT(mPeerProxy != 0, "%s(%d): called without peer proxy", __func__, mId);
1908     Proxy::Buffer buf;
1909     buf.mFrameCount = buffer->frameCount;
1910     buf.mRaw = buffer->raw;
1911     mPeerProxy->releaseBuffer(&buf);
1912     TrackBase::releaseBuffer(buffer);
1913 }
1914 
obtainBuffer(Proxy::Buffer * buffer,const struct timespec * timeOut)1915 status_t AudioFlinger::PlaybackThread::PatchTrack::obtainBuffer(Proxy::Buffer* buffer,
1916                                                                 const struct timespec *timeOut)
1917 {
1918     status_t status = NO_ERROR;
1919     static const int32_t kMaxTries = 5;
1920     int32_t tryCounter = kMaxTries;
1921     const size_t originalFrameCount = buffer->mFrameCount;
1922     do {
1923         if (status == NOT_ENOUGH_DATA) {
1924             restartIfDisabled();
1925             buffer->mFrameCount = originalFrameCount; // cleared on error, must be restored.
1926         }
1927         status = mProxy->obtainBuffer(buffer, timeOut);
1928     } while ((status == NOT_ENOUGH_DATA) && (tryCounter-- > 0));
1929     return status;
1930 }
1931 
releaseBuffer(Proxy::Buffer * buffer)1932 void AudioFlinger::PlaybackThread::PatchTrack::releaseBuffer(Proxy::Buffer* buffer)
1933 {
1934     mProxy->releaseBuffer(buffer);
1935     restartIfDisabled();
1936 }
1937 
restartIfDisabled()1938 void AudioFlinger::PlaybackThread::PatchTrack::restartIfDisabled()
1939 {
1940     if (android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags) & CBLK_DISABLED) {
1941         ALOGW("%s(%d): disabled due to previous underrun, restarting", __func__, mId);
1942         start();
1943     }
1944 }
1945 
1946 // ----------------------------------------------------------------------------
1947 //      Record
1948 // ----------------------------------------------------------------------------
1949 
1950 
1951 // ----------------------------------------------------------------------------
1952 //      AppOp for audio recording
1953 // -------------------------------
1954 
1955 #undef LOG_TAG
1956 #define LOG_TAG "AF::OpRecordAudioMonitor"
1957 
1958 // static
1959 sp<AudioFlinger::RecordThread::OpRecordAudioMonitor>
createIfNeeded(uid_t uid,const audio_attributes_t & attr,const String16 & opPackageName)1960 AudioFlinger::RecordThread::OpRecordAudioMonitor::createIfNeeded(
1961             uid_t uid, const audio_attributes_t& attr, const String16& opPackageName)
1962 {
1963     if (isServiceUid(uid)) {
1964         ALOGV("not silencing record for service uid:%d pack:%s",
1965                 uid, String8(opPackageName).string());
1966         return nullptr;
1967     }
1968 
1969     // Capturing from FM TUNER output is not controlled by OP_RECORD_AUDIO
1970     // because it does not affect users privacy as does capturing from an actual microphone.
1971     if (attr.source == AUDIO_SOURCE_FM_TUNER) {
1972         ALOGV("not muting FM TUNER capture for uid %d", uid);
1973         return nullptr;
1974     }
1975 
1976     if (opPackageName.size() == 0) {
1977         Vector<String16> packages;
1978         // no package name, happens with SL ES clients
1979         // query package manager to find one
1980         PermissionController permissionController;
1981         permissionController.getPackagesForUid(uid, packages);
1982         if (packages.isEmpty()) {
1983             return nullptr;
1984         } else {
1985             ALOGV("using pack:%s for uid:%d", String8(packages[0]).string(), uid);
1986             return new OpRecordAudioMonitor(uid, packages[0]);
1987         }
1988     }
1989 
1990     return new OpRecordAudioMonitor(uid, opPackageName);
1991 }
1992 
OpRecordAudioMonitor(uid_t uid,const String16 & opPackageName)1993 AudioFlinger::RecordThread::OpRecordAudioMonitor::OpRecordAudioMonitor(
1994         uid_t uid, const String16& opPackageName)
1995         : mHasOpRecordAudio(true), mUid(uid), mPackage(opPackageName)
1996 {
1997 }
1998 
~OpRecordAudioMonitor()1999 AudioFlinger::RecordThread::OpRecordAudioMonitor::~OpRecordAudioMonitor()
2000 {
2001     if (mOpCallback != 0) {
2002         mAppOpsManager.stopWatchingMode(mOpCallback);
2003     }
2004     mOpCallback.clear();
2005 }
2006 
onFirstRef()2007 void AudioFlinger::RecordThread::OpRecordAudioMonitor::onFirstRef()
2008 {
2009     checkRecordAudio();
2010     mOpCallback = new RecordAudioOpCallback(this);
2011     ALOGV("start watching OP_RECORD_AUDIO for pack:%s", String8(mPackage).string());
2012     mAppOpsManager.startWatchingMode(AppOpsManager::OP_RECORD_AUDIO, mPackage, mOpCallback);
2013 }
2014 
hasOpRecordAudio() const2015 bool AudioFlinger::RecordThread::OpRecordAudioMonitor::hasOpRecordAudio() const {
2016     return mHasOpRecordAudio.load();
2017 }
2018 
2019 // Called by RecordAudioOpCallback when OP_RECORD_AUDIO is updated in AppOp callback
2020 // and in onFirstRef()
2021 // Note this method is never called (and never to be) for audio server / root track
2022 // due to the UID in createIfNeeded(). As a result for those record track, it's:
2023 // - not called from constructor,
2024 // - not called from RecordAudioOpCallback because the callback is not installed in this case
checkRecordAudio()2025 void AudioFlinger::RecordThread::OpRecordAudioMonitor::checkRecordAudio()
2026 {
2027     const int32_t mode = mAppOpsManager.checkOp(AppOpsManager::OP_RECORD_AUDIO,
2028             mUid, mPackage);
2029     const bool hasIt =  (mode == AppOpsManager::MODE_ALLOWED);
2030     // verbose logging only log when appOp changed
2031     ALOGI_IF(hasIt != mHasOpRecordAudio.load(),
2032             "OP_RECORD_AUDIO missing, %ssilencing record uid%d pack:%s",
2033             hasIt ? "un" : "", mUid, String8(mPackage).string());
2034     mHasOpRecordAudio.store(hasIt);
2035 }
2036 
RecordAudioOpCallback(const wp<OpRecordAudioMonitor> & monitor)2037 AudioFlinger::RecordThread::OpRecordAudioMonitor::RecordAudioOpCallback::RecordAudioOpCallback(
2038         const wp<OpRecordAudioMonitor>& monitor) : mMonitor(monitor)
2039 { }
2040 
opChanged(int32_t op,const String16 & packageName)2041 void AudioFlinger::RecordThread::OpRecordAudioMonitor::RecordAudioOpCallback::opChanged(int32_t op,
2042             const String16& packageName) {
2043     UNUSED(packageName);
2044     if (op != AppOpsManager::OP_RECORD_AUDIO) {
2045         return;
2046     }
2047     sp<OpRecordAudioMonitor> monitor = mMonitor.promote();
2048     if (monitor != NULL) {
2049         monitor->checkRecordAudio();
2050     }
2051 }
2052 
2053 
2054 
2055 #undef LOG_TAG
2056 #define LOG_TAG "AF::RecordHandle"
2057 
RecordHandle(const sp<AudioFlinger::RecordThread::RecordTrack> & recordTrack)2058 AudioFlinger::RecordHandle::RecordHandle(
2059         const sp<AudioFlinger::RecordThread::RecordTrack>& recordTrack)
2060     : BnAudioRecord(),
2061     mRecordTrack(recordTrack)
2062 {
2063 }
2064 
~RecordHandle()2065 AudioFlinger::RecordHandle::~RecordHandle() {
2066     stop_nonvirtual();
2067     mRecordTrack->destroy();
2068 }
2069 
start(int event,int triggerSession)2070 binder::Status AudioFlinger::RecordHandle::start(int /*AudioSystem::sync_event_t*/ event,
2071         int /*audio_session_t*/ triggerSession) {
2072     ALOGV("%s()", __func__);
2073     return binder::Status::fromStatusT(
2074         mRecordTrack->start((AudioSystem::sync_event_t)event, (audio_session_t) triggerSession));
2075 }
2076 
stop()2077 binder::Status AudioFlinger::RecordHandle::stop() {
2078     stop_nonvirtual();
2079     return binder::Status::ok();
2080 }
2081 
stop_nonvirtual()2082 void AudioFlinger::RecordHandle::stop_nonvirtual() {
2083     ALOGV("%s()", __func__);
2084     mRecordTrack->stop();
2085 }
2086 
getActiveMicrophones(std::vector<media::MicrophoneInfo> * activeMicrophones)2087 binder::Status AudioFlinger::RecordHandle::getActiveMicrophones(
2088         std::vector<media::MicrophoneInfo>* activeMicrophones) {
2089     ALOGV("%s()", __func__);
2090     return binder::Status::fromStatusT(
2091             mRecordTrack->getActiveMicrophones(activeMicrophones));
2092 }
2093 
setPreferredMicrophoneDirection(int direction)2094 binder::Status AudioFlinger::RecordHandle::setPreferredMicrophoneDirection(
2095         int /*audio_microphone_direction_t*/ direction) {
2096     ALOGV("%s()", __func__);
2097     return binder::Status::fromStatusT(mRecordTrack->setPreferredMicrophoneDirection(
2098             static_cast<audio_microphone_direction_t>(direction)));
2099 }
2100 
setPreferredMicrophoneFieldDimension(float zoom)2101 binder::Status AudioFlinger::RecordHandle::setPreferredMicrophoneFieldDimension(float zoom) {
2102     ALOGV("%s()", __func__);
2103     return binder::Status::fromStatusT(mRecordTrack->setPreferredMicrophoneFieldDimension(zoom));
2104 }
2105 
2106 // ----------------------------------------------------------------------------
2107 #undef LOG_TAG
2108 #define LOG_TAG "AF::RecordTrack"
2109 
2110 // RecordTrack constructor must be called with AudioFlinger::mLock and ThreadBase::mLock held
RecordTrack(RecordThread * thread,const sp<Client> & client,const audio_attributes_t & attr,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,void * buffer,size_t bufferSize,audio_session_t sessionId,pid_t creatorPid,uid_t uid,audio_input_flags_t flags,track_type type,const String16 & opPackageName,audio_port_handle_t portId)2111 AudioFlinger::RecordThread::RecordTrack::RecordTrack(
2112             RecordThread *thread,
2113             const sp<Client>& client,
2114             const audio_attributes_t& attr,
2115             uint32_t sampleRate,
2116             audio_format_t format,
2117             audio_channel_mask_t channelMask,
2118             size_t frameCount,
2119             void *buffer,
2120             size_t bufferSize,
2121             audio_session_t sessionId,
2122             pid_t creatorPid,
2123             uid_t uid,
2124             audio_input_flags_t flags,
2125             track_type type,
2126             const String16& opPackageName,
2127             audio_port_handle_t portId)
2128     :   TrackBase(thread, client, attr, sampleRate, format,
2129                   channelMask, frameCount, buffer, bufferSize, sessionId,
2130                   creatorPid, uid, false /*isOut*/,
2131                   (type == TYPE_DEFAULT) ?
2132                           ((flags & AUDIO_INPUT_FLAG_FAST) ? ALLOC_PIPE : ALLOC_CBLK) :
2133                           ((buffer == NULL) ? ALLOC_LOCAL : ALLOC_NONE),
2134                   type, portId,
2135                   std::string(AMEDIAMETRICS_KEY_PREFIX_AUDIO_RECORD) + std::to_string(portId)),
2136         mOverflow(false),
2137         mFramesToDrop(0),
2138         mResamplerBufferProvider(NULL), // initialize in case of early constructor exit
2139         mRecordBufferConverter(NULL),
2140         mFlags(flags),
2141         mSilenced(false),
2142         mOpRecordAudioMonitor(OpRecordAudioMonitor::createIfNeeded(uid, attr, opPackageName))
2143 {
2144     if (mCblk == NULL) {
2145         return;
2146     }
2147 
2148     if (!isDirect()) {
2149         mRecordBufferConverter = new RecordBufferConverter(
2150                 thread->mChannelMask, thread->mFormat, thread->mSampleRate,
2151                 channelMask, format, sampleRate);
2152         // Check if the RecordBufferConverter construction was successful.
2153         // If not, don't continue with construction.
2154         //
2155         // NOTE: It would be extremely rare that the record track cannot be created
2156         // for the current device, but a pending or future device change would make
2157         // the record track configuration valid.
2158         if (mRecordBufferConverter->initCheck() != NO_ERROR) {
2159             ALOGE("%s(%d): RecordTrack unable to create record buffer converter", __func__, mId);
2160             return;
2161         }
2162     }
2163 
2164     mServerProxy = new AudioRecordServerProxy(mCblk, mBuffer, frameCount,
2165             mFrameSize, !isExternalTrack());
2166 
2167     mResamplerBufferProvider = new ResamplerBufferProvider(this);
2168 
2169     if (flags & AUDIO_INPUT_FLAG_FAST) {
2170         ALOG_ASSERT(thread->mFastTrackAvail);
2171         thread->mFastTrackAvail = false;
2172     } else {
2173         // TODO: only Normal Record has timestamps (Fast Record does not).
2174         mServerLatencySupported = checkServerLatencySupported(mFormat, flags);
2175     }
2176 #ifdef TEE_SINK
2177     mTee.setId(std::string("_") + std::to_string(mThreadIoHandle)
2178             + "_" + std::to_string(mId)
2179             + "_R");
2180 #endif
2181 
2182     // Once this item is logged by the server, the client can add properties.
2183     mTrackMetrics.logConstructor(creatorPid, uid);
2184 }
2185 
~RecordTrack()2186 AudioFlinger::RecordThread::RecordTrack::~RecordTrack()
2187 {
2188     ALOGV("%s()", __func__);
2189     delete mRecordBufferConverter;
2190     delete mResamplerBufferProvider;
2191 }
2192 
initCheck() const2193 status_t AudioFlinger::RecordThread::RecordTrack::initCheck() const
2194 {
2195     status_t status = TrackBase::initCheck();
2196     if (status == NO_ERROR && mServerProxy == 0) {
2197         status = BAD_VALUE;
2198     }
2199     return status;
2200 }
2201 
2202 // AudioBufferProvider interface
getNextBuffer(AudioBufferProvider::Buffer * buffer)2203 status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer)
2204 {
2205     ServerProxy::Buffer buf;
2206     buf.mFrameCount = buffer->frameCount;
2207     status_t status = mServerProxy->obtainBuffer(&buf);
2208     buffer->frameCount = buf.mFrameCount;
2209     buffer->raw = buf.mRaw;
2210     if (buf.mFrameCount == 0) {
2211         // FIXME also wake futex so that overrun is noticed more quickly
2212         (void) android_atomic_or(CBLK_OVERRUN, &mCblk->mFlags);
2213     }
2214     return status;
2215 }
2216 
start(AudioSystem::sync_event_t event,audio_session_t triggerSession)2217 status_t AudioFlinger::RecordThread::RecordTrack::start(AudioSystem::sync_event_t event,
2218                                                         audio_session_t triggerSession)
2219 {
2220     sp<ThreadBase> thread = mThread.promote();
2221     if (thread != 0) {
2222         RecordThread *recordThread = (RecordThread *)thread.get();
2223         return recordThread->start(this, event, triggerSession);
2224     } else {
2225         ALOGW("%s track %d: thread was destroyed", __func__, portId());
2226         return DEAD_OBJECT;
2227     }
2228 }
2229 
stop()2230 void AudioFlinger::RecordThread::RecordTrack::stop()
2231 {
2232     sp<ThreadBase> thread = mThread.promote();
2233     if (thread != 0) {
2234         RecordThread *recordThread = (RecordThread *)thread.get();
2235         if (recordThread->stop(this) && isExternalTrack()) {
2236             AudioSystem::stopInput(mPortId);
2237         }
2238     }
2239 }
2240 
destroy()2241 void AudioFlinger::RecordThread::RecordTrack::destroy()
2242 {
2243     // see comments at AudioFlinger::PlaybackThread::Track::destroy()
2244     sp<RecordTrack> keep(this);
2245     {
2246         track_state priorState = mState;
2247         sp<ThreadBase> thread = mThread.promote();
2248         if (thread != 0) {
2249             Mutex::Autolock _l(thread->mLock);
2250             RecordThread *recordThread = (RecordThread *) thread.get();
2251             priorState = mState;
2252             recordThread->destroyTrack_l(this); // move mState to STOPPED, terminate
2253         }
2254         // APM portid/client management done outside of lock.
2255         // NOTE: if thread doesn't exist, the input descriptor probably doesn't either.
2256         if (isExternalTrack()) {
2257             switch (priorState) {
2258             case ACTIVE:     // invalidated while still active
2259             case STARTING_2: // invalidated/start-aborted after startInput successfully called
2260             case PAUSING:    // invalidated while in the middle of stop() pausing (still active)
2261                 AudioSystem::stopInput(mPortId);
2262                 break;
2263 
2264             case STARTING_1: // invalidated/start-aborted and startInput not successful
2265             case PAUSED:     // OK, not active
2266             case IDLE:       // OK, not active
2267                 break;
2268 
2269             case STOPPED:    // unexpected (destroyed)
2270             default:
2271                 LOG_ALWAYS_FATAL("%s(%d): invalid prior state: %d", __func__, mId, priorState);
2272             }
2273             AudioSystem::releaseInput(mPortId);
2274         }
2275     }
2276 }
2277 
invalidate()2278 void AudioFlinger::RecordThread::RecordTrack::invalidate()
2279 {
2280     TrackBase::invalidate();
2281     // FIXME should use proxy, and needs work
2282     audio_track_cblk_t* cblk = mCblk;
2283     android_atomic_or(CBLK_INVALID, &cblk->mFlags);
2284     android_atomic_release_store(0x40000000, &cblk->mFutex);
2285     // client is not in server, so FUTEX_WAKE is needed instead of FUTEX_WAKE_PRIVATE
2286     (void) syscall(__NR_futex, &cblk->mFutex, FUTEX_WAKE, INT_MAX);
2287 }
2288 
2289 
appendDumpHeader(String8 & result)2290 void AudioFlinger::RecordThread::RecordTrack::appendDumpHeader(String8& result)
2291 {
2292     result.appendFormat("Active     Id Client Session Port Id  S  Flags  "
2293                         " Format Chn mask  SRate Source  "
2294                         " Server FrmCnt FrmRdy Sil%s\n",
2295                         isServerLatencySupported() ? "   Latency" : "");
2296 }
2297 
appendDump(String8 & result,bool active)2298 void AudioFlinger::RecordThread::RecordTrack::appendDump(String8& result, bool active)
2299 {
2300     result.appendFormat("%c%5s %6d %6u %7u %7u  %2s 0x%03X "
2301             "%08X %08X %6u %6X "
2302             "%08X %6zu %6zu %3c",
2303             isFastTrack() ? 'F' : ' ',
2304             active ? "yes" : "no",
2305             mId,
2306             (mClient == 0) ? getpid() : mClient->pid(),
2307             mSessionId,
2308             mPortId,
2309             getTrackStateAsCodedString(),
2310             mCblk->mFlags,
2311 
2312             mFormat,
2313             mChannelMask,
2314             mSampleRate,
2315             mAttr.source,
2316 
2317             mCblk->mServer,
2318             mFrameCount,
2319             mServerProxy->framesReadySafe(),
2320             isSilenced() ? 's' : 'n'
2321             );
2322     if (isServerLatencySupported()) {
2323         double latencyMs;
2324         bool fromTrack;
2325         if (getTrackLatencyMs(&latencyMs, &fromTrack) == OK) {
2326             // Show latency in msec, followed by 't' if from track timestamp (the most accurate)
2327             // or 'k' if estimated from kernel (usually for debugging).
2328             result.appendFormat(" %7.2lf %c", latencyMs, fromTrack ? 't' : 'k');
2329         } else {
2330             result.appendFormat("%10s", mCblk->mServer != 0 ? "unavail" : "new");
2331         }
2332     }
2333     result.append("\n");
2334 }
2335 
handleSyncStartEvent(const sp<SyncEvent> & event)2336 void AudioFlinger::RecordThread::RecordTrack::handleSyncStartEvent(const sp<SyncEvent>& event)
2337 {
2338     if (event == mSyncStartEvent) {
2339         ssize_t framesToDrop = 0;
2340         sp<ThreadBase> threadBase = mThread.promote();
2341         if (threadBase != 0) {
2342             // TODO: use actual buffer filling status instead of 2 buffers when info is available
2343             // from audio HAL
2344             framesToDrop = threadBase->mFrameCount * 2;
2345         }
2346         mFramesToDrop = framesToDrop;
2347     }
2348 }
2349 
clearSyncStartEvent()2350 void AudioFlinger::RecordThread::RecordTrack::clearSyncStartEvent()
2351 {
2352     if (mSyncStartEvent != 0) {
2353         mSyncStartEvent->cancel();
2354         mSyncStartEvent.clear();
2355     }
2356     mFramesToDrop = 0;
2357 }
2358 
updateTrackFrameInfo(int64_t trackFramesReleased,int64_t sourceFramesRead,uint32_t halSampleRate,const ExtendedTimestamp & timestamp)2359 void AudioFlinger::RecordThread::RecordTrack::updateTrackFrameInfo(
2360         int64_t trackFramesReleased, int64_t sourceFramesRead,
2361         uint32_t halSampleRate, const ExtendedTimestamp &timestamp)
2362 {
2363    // Make the kernel frametime available.
2364     const FrameTime ft{
2365             timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL],
2366             timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL]};
2367     // ALOGD("FrameTime: %lld %lld", (long long)ft.frames, (long long)ft.timeNs);
2368     mKernelFrameTime.store(ft);
2369     if (!audio_is_linear_pcm(mFormat)) {
2370         return;
2371     }
2372 
2373     ExtendedTimestamp local = timestamp;
2374 
2375     // Convert HAL frames to server-side track frames at track sample rate.
2376     // We use trackFramesReleased and sourceFramesRead as an anchor point.
2377     for (int i = ExtendedTimestamp::LOCATION_SERVER; i < ExtendedTimestamp::LOCATION_MAX; ++i) {
2378         if (local.mTimeNs[i] != 0) {
2379             const int64_t relativeServerFrames = local.mPosition[i] - sourceFramesRead;
2380             const int64_t relativeTrackFrames = relativeServerFrames
2381                     * mSampleRate / halSampleRate; // TODO: potential computation overflow
2382             local.mPosition[i] = relativeTrackFrames + trackFramesReleased;
2383         }
2384     }
2385     mServerProxy->setTimestamp(local);
2386 
2387     // Compute latency info.
2388     const bool useTrackTimestamp = true; // use track unless debugging.
2389     const double latencyMs = - (useTrackTimestamp
2390             ? local.getOutputServerLatencyMs(sampleRate())
2391             : timestamp.getOutputServerLatencyMs(halSampleRate));
2392 
2393     mServerLatencyFromTrack.store(useTrackTimestamp);
2394     mServerLatencyMs.store(latencyMs);
2395 }
2396 
isSilenced() const2397 bool AudioFlinger::RecordThread::RecordTrack::isSilenced() const {
2398     if (mSilenced) {
2399         return true;
2400     }
2401     // The monitor is only created for record tracks that can be silenced.
2402     return mOpRecordAudioMonitor ? !mOpRecordAudioMonitor->hasOpRecordAudio() : false;
2403 }
2404 
getActiveMicrophones(std::vector<media::MicrophoneInfo> * activeMicrophones)2405 status_t AudioFlinger::RecordThread::RecordTrack::getActiveMicrophones(
2406         std::vector<media::MicrophoneInfo>* activeMicrophones)
2407 {
2408     sp<ThreadBase> thread = mThread.promote();
2409     if (thread != 0) {
2410         RecordThread *recordThread = (RecordThread *)thread.get();
2411         return recordThread->getActiveMicrophones(activeMicrophones);
2412     } else {
2413         return BAD_VALUE;
2414     }
2415 }
2416 
setPreferredMicrophoneDirection(audio_microphone_direction_t direction)2417 status_t AudioFlinger::RecordThread::RecordTrack::setPreferredMicrophoneDirection(
2418         audio_microphone_direction_t direction) {
2419     sp<ThreadBase> thread = mThread.promote();
2420     if (thread != 0) {
2421         RecordThread *recordThread = (RecordThread *)thread.get();
2422         return recordThread->setPreferredMicrophoneDirection(direction);
2423     } else {
2424         return BAD_VALUE;
2425     }
2426 }
2427 
setPreferredMicrophoneFieldDimension(float zoom)2428 status_t AudioFlinger::RecordThread::RecordTrack::setPreferredMicrophoneFieldDimension(float zoom) {
2429     sp<ThreadBase> thread = mThread.promote();
2430     if (thread != 0) {
2431         RecordThread *recordThread = (RecordThread *)thread.get();
2432         return recordThread->setPreferredMicrophoneFieldDimension(zoom);
2433     } else {
2434         return BAD_VALUE;
2435     }
2436 }
2437 
2438 // ----------------------------------------------------------------------------
2439 #undef LOG_TAG
2440 #define LOG_TAG "AF::PatchRecord"
2441 
PatchRecord(RecordThread * recordThread,uint32_t sampleRate,audio_channel_mask_t channelMask,audio_format_t format,size_t frameCount,void * buffer,size_t bufferSize,audio_input_flags_t flags,const Timeout & timeout)2442 AudioFlinger::RecordThread::PatchRecord::PatchRecord(RecordThread *recordThread,
2443                                                      uint32_t sampleRate,
2444                                                      audio_channel_mask_t channelMask,
2445                                                      audio_format_t format,
2446                                                      size_t frameCount,
2447                                                      void *buffer,
2448                                                      size_t bufferSize,
2449                                                      audio_input_flags_t flags,
2450                                                      const Timeout& timeout)
2451     :   RecordTrack(recordThread, NULL,
2452                 audio_attributes_t{} /* currently unused for patch track */,
2453                 sampleRate, format, channelMask, frameCount,
2454                 buffer, bufferSize, AUDIO_SESSION_NONE, getpid(), AID_AUDIOSERVER,
2455                 flags, TYPE_PATCH, String16()),
2456         PatchTrackBase(new ClientProxy(mCblk, mBuffer, frameCount, mFrameSize, false, true),
2457                        *recordThread, timeout)
2458 {
2459     ALOGV("%s(%d): sampleRate %d mPeerTimeout %d.%03d sec",
2460                                       __func__, mId, sampleRate,
2461                                       (int)mPeerTimeout.tv_sec,
2462                                       (int)(mPeerTimeout.tv_nsec / 1000000));
2463 }
2464 
~PatchRecord()2465 AudioFlinger::RecordThread::PatchRecord::~PatchRecord()
2466 {
2467     ALOGV("%s(%d)", __func__, mId);
2468 }
2469 
writeFramesHelper(AudioBufferProvider * dest,const void * src,size_t frameCount,size_t frameSize)2470 static size_t writeFramesHelper(
2471         AudioBufferProvider* dest, const void* src, size_t frameCount, size_t frameSize)
2472 {
2473     AudioBufferProvider::Buffer patchBuffer;
2474     patchBuffer.frameCount = frameCount;
2475     auto status = dest->getNextBuffer(&patchBuffer);
2476     if (status != NO_ERROR) {
2477        ALOGW("%s PathRecord getNextBuffer failed with error %d: %s",
2478              __func__, status, strerror(-status));
2479        return 0;
2480     }
2481     ALOG_ASSERT(patchBuffer.frameCount <= frameCount);
2482     memcpy(patchBuffer.raw, src, patchBuffer.frameCount * frameSize);
2483     size_t framesWritten = patchBuffer.frameCount;
2484     dest->releaseBuffer(&patchBuffer);
2485     return framesWritten;
2486 }
2487 
2488 // static
writeFrames(AudioBufferProvider * dest,const void * src,size_t frameCount,size_t frameSize)2489 size_t AudioFlinger::RecordThread::PatchRecord::writeFrames(
2490         AudioBufferProvider* dest, const void* src, size_t frameCount, size_t frameSize)
2491 {
2492     size_t framesWritten = writeFramesHelper(dest, src, frameCount, frameSize);
2493     // On buffer wrap, the buffer frame count will be less than requested,
2494     // when this happens a second buffer needs to be used to write the leftover audio
2495     const size_t framesLeft = frameCount - framesWritten;
2496     if (framesWritten != 0 && framesLeft != 0) {
2497         framesWritten += writeFramesHelper(dest, (const char*)src + framesWritten * frameSize,
2498                         framesLeft, frameSize);
2499     }
2500     return framesWritten;
2501 }
2502 
2503 // AudioBufferProvider interface
getNextBuffer(AudioBufferProvider::Buffer * buffer)2504 status_t AudioFlinger::RecordThread::PatchRecord::getNextBuffer(
2505                                                   AudioBufferProvider::Buffer* buffer)
2506 {
2507     ALOG_ASSERT(mPeerProxy != 0, "%s(%d): called without peer proxy", __func__, mId);
2508     Proxy::Buffer buf;
2509     buf.mFrameCount = buffer->frameCount;
2510     status_t status = mPeerProxy->obtainBuffer(&buf, &mPeerTimeout);
2511     ALOGV_IF(status != NO_ERROR,
2512              "%s(%d): mPeerProxy->obtainBuffer status %d", __func__, mId, status);
2513     buffer->frameCount = buf.mFrameCount;
2514     if (ATRACE_ENABLED()) {
2515         std::string traceName("PRnObt");
2516         traceName += std::to_string(id());
2517         ATRACE_INT(traceName.c_str(), buf.mFrameCount);
2518     }
2519     if (buf.mFrameCount == 0) {
2520         return WOULD_BLOCK;
2521     }
2522     status = RecordTrack::getNextBuffer(buffer);
2523     return status;
2524 }
2525 
releaseBuffer(AudioBufferProvider::Buffer * buffer)2526 void AudioFlinger::RecordThread::PatchRecord::releaseBuffer(AudioBufferProvider::Buffer* buffer)
2527 {
2528     ALOG_ASSERT(mPeerProxy != 0, "%s(%d): called without peer proxy", __func__, mId);
2529     Proxy::Buffer buf;
2530     buf.mFrameCount = buffer->frameCount;
2531     buf.mRaw = buffer->raw;
2532     mPeerProxy->releaseBuffer(&buf);
2533     TrackBase::releaseBuffer(buffer);
2534 }
2535 
obtainBuffer(Proxy::Buffer * buffer,const struct timespec * timeOut)2536 status_t AudioFlinger::RecordThread::PatchRecord::obtainBuffer(Proxy::Buffer* buffer,
2537                                                                const struct timespec *timeOut)
2538 {
2539     return mProxy->obtainBuffer(buffer, timeOut);
2540 }
2541 
releaseBuffer(Proxy::Buffer * buffer)2542 void AudioFlinger::RecordThread::PatchRecord::releaseBuffer(Proxy::Buffer* buffer)
2543 {
2544     mProxy->releaseBuffer(buffer);
2545 }
2546 
2547 #undef LOG_TAG
2548 #define LOG_TAG "AF::PthrPatchRecord"
2549 
allocAligned(size_t alignment,size_t size)2550 static std::unique_ptr<void, decltype(free)*> allocAligned(size_t alignment, size_t size)
2551 {
2552     void *ptr = nullptr;
2553     (void)posix_memalign(&ptr, alignment, size);
2554     return std::unique_ptr<void, decltype(free)*>(ptr, free);
2555 }
2556 
PassthruPatchRecord(RecordThread * recordThread,uint32_t sampleRate,audio_channel_mask_t channelMask,audio_format_t format,size_t frameCount,audio_input_flags_t flags)2557 AudioFlinger::RecordThread::PassthruPatchRecord::PassthruPatchRecord(
2558         RecordThread *recordThread,
2559         uint32_t sampleRate,
2560         audio_channel_mask_t channelMask,
2561         audio_format_t format,
2562         size_t frameCount,
2563         audio_input_flags_t flags)
2564         : PatchRecord(recordThread, sampleRate, channelMask, format, frameCount,
2565                 nullptr /*buffer*/, 0 /*bufferSize*/, flags),
2566           mPatchRecordAudioBufferProvider(*this),
2567           mSinkBuffer(allocAligned(32, mFrameCount * mFrameSize)),
2568           mStubBuffer(allocAligned(32, mFrameCount * mFrameSize))
2569 {
2570     memset(mStubBuffer.get(), 0, mFrameCount * mFrameSize);
2571 }
2572 
obtainStream(sp<ThreadBase> * thread)2573 sp<StreamInHalInterface> AudioFlinger::RecordThread::PassthruPatchRecord::obtainStream(
2574         sp<ThreadBase>* thread)
2575 {
2576     *thread = mThread.promote();
2577     if (!*thread) return nullptr;
2578     RecordThread *recordThread = static_cast<RecordThread*>((*thread).get());
2579     Mutex::Autolock _l(recordThread->mLock);
2580     return recordThread->mInput ? recordThread->mInput->stream : nullptr;
2581 }
2582 
2583 // PatchProxyBufferProvider methods are called on DirectOutputThread
obtainBuffer(Proxy::Buffer * buffer,const struct timespec * timeOut)2584 status_t AudioFlinger::RecordThread::PassthruPatchRecord::obtainBuffer(
2585         Proxy::Buffer* buffer, const struct timespec* timeOut)
2586 {
2587     if (mUnconsumedFrames) {
2588         buffer->mFrameCount = std::min(buffer->mFrameCount, mUnconsumedFrames);
2589         // mUnconsumedFrames is decreased in releaseBuffer to use actual frame consumption figure.
2590         return PatchRecord::obtainBuffer(buffer, timeOut);
2591     }
2592 
2593     // Otherwise, execute a read from HAL and write into the buffer.
2594     nsecs_t startTimeNs = 0;
2595     if (timeOut && (timeOut->tv_sec != 0 || timeOut->tv_nsec != 0) && timeOut->tv_sec != INT_MAX) {
2596         // Will need to correct timeOut by elapsed time.
2597         startTimeNs = systemTime();
2598     }
2599     const size_t framesToRead = std::min(buffer->mFrameCount, mFrameCount);
2600     buffer->mFrameCount = 0;
2601     buffer->mRaw = nullptr;
2602     sp<ThreadBase> thread;
2603     sp<StreamInHalInterface> stream = obtainStream(&thread);
2604     if (!stream) return NO_INIT;  // If there is no stream, RecordThread is not reading.
2605 
2606     status_t result = NO_ERROR;
2607     size_t bytesRead = 0;
2608     {
2609         ATRACE_NAME("read");
2610         result = stream->read(mSinkBuffer.get(), framesToRead * mFrameSize, &bytesRead);
2611         if (result != NO_ERROR) goto stream_error;
2612         if (bytesRead == 0) return NO_ERROR;
2613     }
2614 
2615     {
2616         std::lock_guard<std::mutex> lock(mReadLock);
2617         mReadBytes += bytesRead;
2618         mReadError = NO_ERROR;
2619     }
2620     mReadCV.notify_one();
2621     // writeFrames handles wraparound and should write all the provided frames.
2622     // If it couldn't, there is something wrong with the client/server buffer of the software patch.
2623     buffer->mFrameCount = writeFrames(
2624             &mPatchRecordAudioBufferProvider,
2625             mSinkBuffer.get(), bytesRead / mFrameSize, mFrameSize);
2626     ALOGW_IF(buffer->mFrameCount < bytesRead / mFrameSize,
2627             "Lost %zu frames obtained from HAL", bytesRead / mFrameSize - buffer->mFrameCount);
2628     mUnconsumedFrames = buffer->mFrameCount;
2629     struct timespec newTimeOut;
2630     if (startTimeNs) {
2631         // Correct the timeout by elapsed time.
2632         nsecs_t newTimeOutNs = audio_utils_ns_from_timespec(timeOut) - (systemTime() - startTimeNs);
2633         if (newTimeOutNs < 0) newTimeOutNs = 0;
2634         newTimeOut.tv_sec = newTimeOutNs / NANOS_PER_SECOND;
2635         newTimeOut.tv_nsec = newTimeOutNs - newTimeOut.tv_sec * NANOS_PER_SECOND;
2636         timeOut = &newTimeOut;
2637     }
2638     return PatchRecord::obtainBuffer(buffer, timeOut);
2639 
2640 stream_error:
2641     stream->standby();
2642     {
2643         std::lock_guard<std::mutex> lock(mReadLock);
2644         mReadError = result;
2645     }
2646     mReadCV.notify_one();
2647     return result;
2648 }
2649 
releaseBuffer(Proxy::Buffer * buffer)2650 void AudioFlinger::RecordThread::PassthruPatchRecord::releaseBuffer(Proxy::Buffer* buffer)
2651 {
2652     if (buffer->mFrameCount <= mUnconsumedFrames) {
2653         mUnconsumedFrames -= buffer->mFrameCount;
2654     } else {
2655         ALOGW("Write side has consumed more frames than we had: %zu > %zu",
2656                 buffer->mFrameCount, mUnconsumedFrames);
2657         mUnconsumedFrames = 0;
2658     }
2659     PatchRecord::releaseBuffer(buffer);
2660 }
2661 
2662 // AudioBufferProvider and Source methods are called on RecordThread
2663 // 'read' emulates actual audio data with 0's. This is OK as 'getNextBuffer'
2664 // and 'releaseBuffer' are stubbed out and ignore their input.
2665 // It's not possible to retrieve actual data here w/o blocking 'obtainBuffer'
2666 // until we copy it.
read(void * buffer,size_t bytes,size_t * read)2667 status_t AudioFlinger::RecordThread::PassthruPatchRecord::read(
2668         void* buffer, size_t bytes, size_t* read)
2669 {
2670     bytes = std::min(bytes, mFrameCount * mFrameSize);
2671     {
2672         std::unique_lock<std::mutex> lock(mReadLock);
2673         mReadCV.wait(lock, [&]{ return mReadError != NO_ERROR || mReadBytes != 0; });
2674         if (mReadError != NO_ERROR) {
2675             mLastReadFrames = 0;
2676             return mReadError;
2677         }
2678         *read = std::min(bytes, mReadBytes);
2679         mReadBytes -= *read;
2680     }
2681     mLastReadFrames = *read / mFrameSize;
2682     memset(buffer, 0, *read);
2683     return 0;
2684 }
2685 
getCapturePosition(int64_t * frames,int64_t * time)2686 status_t AudioFlinger::RecordThread::PassthruPatchRecord::getCapturePosition(
2687         int64_t* frames, int64_t* time)
2688 {
2689     sp<ThreadBase> thread;
2690     sp<StreamInHalInterface> stream = obtainStream(&thread);
2691     return stream ? stream->getCapturePosition(frames, time) : NO_INIT;
2692 }
2693 
standby()2694 status_t AudioFlinger::RecordThread::PassthruPatchRecord::standby()
2695 {
2696     // RecordThread issues 'standby' command in two major cases:
2697     // 1. Error on read--this case is handled in 'obtainBuffer'.
2698     // 2. Track is stopping--as PassthruPatchRecord assumes continuous
2699     //    output, this can only happen when the software patch
2700     //    is being torn down. In this case, the RecordThread
2701     //    will terminate and close the HAL stream.
2702     return 0;
2703 }
2704 
2705 // As the buffer gets filled in obtainBuffer, here we only simulate data consumption.
getNextBuffer(AudioBufferProvider::Buffer * buffer)2706 status_t AudioFlinger::RecordThread::PassthruPatchRecord::getNextBuffer(
2707         AudioBufferProvider::Buffer* buffer)
2708 {
2709     buffer->frameCount = mLastReadFrames;
2710     buffer->raw = buffer->frameCount != 0 ? mStubBuffer.get() : nullptr;
2711     return NO_ERROR;
2712 }
2713 
releaseBuffer(AudioBufferProvider::Buffer * buffer)2714 void AudioFlinger::RecordThread::PassthruPatchRecord::releaseBuffer(
2715         AudioBufferProvider::Buffer* buffer)
2716 {
2717     buffer->frameCount = 0;
2718     buffer->raw = nullptr;
2719 }
2720 
2721 // ----------------------------------------------------------------------------
2722 #undef LOG_TAG
2723 #define LOG_TAG "AF::MmapTrack"
2724 
MmapTrack(ThreadBase * thread,const audio_attributes_t & attr,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,audio_session_t sessionId,bool isOut,uid_t uid,pid_t pid,pid_t creatorPid,audio_port_handle_t portId)2725 AudioFlinger::MmapThread::MmapTrack::MmapTrack(ThreadBase *thread,
2726         const audio_attributes_t& attr,
2727         uint32_t sampleRate,
2728         audio_format_t format,
2729         audio_channel_mask_t channelMask,
2730         audio_session_t sessionId,
2731         bool isOut,
2732         uid_t uid,
2733         pid_t pid,
2734         pid_t creatorPid,
2735         audio_port_handle_t portId)
2736     :   TrackBase(thread, NULL, attr, sampleRate, format,
2737                   channelMask, (size_t)0 /* frameCount */,
2738                   nullptr /* buffer */, (size_t)0 /* bufferSize */,
2739                   sessionId, creatorPid, uid, isOut,
2740                   ALLOC_NONE,
2741                   TYPE_DEFAULT, portId,
2742                   std::string(AMEDIAMETRICS_KEY_PREFIX_AUDIO_MMAP) + std::to_string(portId)),
2743         mPid(pid), mSilenced(false), mSilencedNotified(false)
2744 {
2745     // Once this item is logged by the server, the client can add properties.
2746     mTrackMetrics.logConstructor(creatorPid, uid);
2747 }
2748 
~MmapTrack()2749 AudioFlinger::MmapThread::MmapTrack::~MmapTrack()
2750 {
2751 }
2752 
initCheck() const2753 status_t AudioFlinger::MmapThread::MmapTrack::initCheck() const
2754 {
2755     return NO_ERROR;
2756 }
2757 
start(AudioSystem::sync_event_t event __unused,audio_session_t triggerSession __unused)2758 status_t AudioFlinger::MmapThread::MmapTrack::start(AudioSystem::sync_event_t event __unused,
2759                                                     audio_session_t triggerSession __unused)
2760 {
2761     return NO_ERROR;
2762 }
2763 
stop()2764 void AudioFlinger::MmapThread::MmapTrack::stop()
2765 {
2766 }
2767 
2768 // AudioBufferProvider interface
getNextBuffer(AudioBufferProvider::Buffer * buffer)2769 status_t AudioFlinger::MmapThread::MmapTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer)
2770 {
2771     buffer->frameCount = 0;
2772     buffer->raw = nullptr;
2773     return INVALID_OPERATION;
2774 }
2775 
2776 // ExtendedAudioBufferProvider interface
framesReady() const2777 size_t AudioFlinger::MmapThread::MmapTrack::framesReady() const {
2778     return 0;
2779 }
2780 
framesReleased() const2781 int64_t AudioFlinger::MmapThread::MmapTrack::framesReleased() const
2782 {
2783     return 0;
2784 }
2785 
onTimestamp(const ExtendedTimestamp & timestamp __unused)2786 void AudioFlinger::MmapThread::MmapTrack::onTimestamp(const ExtendedTimestamp &timestamp __unused)
2787 {
2788 }
2789 
appendDumpHeader(String8 & result)2790 void AudioFlinger::MmapThread::MmapTrack::appendDumpHeader(String8& result)
2791 {
2792     result.appendFormat("Client Session Port Id  Format Chn mask  SRate Flags %s\n",
2793                         isOut() ? "Usg CT": "Source");
2794 }
2795 
appendDump(String8 & result,bool active __unused)2796 void AudioFlinger::MmapThread::MmapTrack::appendDump(String8& result, bool active __unused)
2797 {
2798     result.appendFormat("%6u %7u %7u %08X %08X %6u 0x%03X ",
2799             mPid,
2800             mSessionId,
2801             mPortId,
2802             mFormat,
2803             mChannelMask,
2804             mSampleRate,
2805             mAttr.flags);
2806     if (isOut()) {
2807         result.appendFormat("%3x %2x", mAttr.usage, mAttr.content_type);
2808     } else {
2809         result.appendFormat("%6x", mAttr.source);
2810     }
2811     result.append("\n");
2812 }
2813 
2814 } // namespace android
2815