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 <math.h>
25 #include <fcntl.h>
26 #include <sys/stat.h>
27 #include <cutils/properties.h>
28 #include <media/AudioParameter.h>
29 #include <media/AudioResamplerPublic.h>
30 #include <utils/Log.h>
31 #include <utils/Trace.h>
32 
33 #include <private/media/AudioTrackShared.h>
34 #include <hardware/audio.h>
35 #include <audio_effects/effect_ns.h>
36 #include <audio_effects/effect_aec.h>
37 #include <audio_utils/primitives.h>
38 #include <audio_utils/format.h>
39 #include <audio_utils/minifloat.h>
40 
41 // NBAIO implementations
42 #include <media/nbaio/AudioStreamInSource.h>
43 #include <media/nbaio/AudioStreamOutSink.h>
44 #include <media/nbaio/MonoPipe.h>
45 #include <media/nbaio/MonoPipeReader.h>
46 #include <media/nbaio/Pipe.h>
47 #include <media/nbaio/PipeReader.h>
48 #include <media/nbaio/SourceAudioBufferProvider.h>
49 
50 #include <powermanager/PowerManager.h>
51 
52 #include <common_time/cc_helper.h>
53 #include <common_time/local_clock.h>
54 
55 #include "AudioFlinger.h"
56 #include "AudioMixer.h"
57 #include "FastMixer.h"
58 #include "FastCapture.h"
59 #include "ServiceUtilities.h"
60 #include "SchedulingPolicyService.h"
61 
62 #ifdef ADD_BATTERY_DATA
63 #include <media/IMediaPlayerService.h>
64 #include <media/IMediaDeathNotifier.h>
65 #endif
66 
67 #ifdef DEBUG_CPU_USAGE
68 #include <cpustats/CentralTendencyStatistics.h>
69 #include <cpustats/ThreadCpuUsage.h>
70 #endif
71 
72 // ----------------------------------------------------------------------------
73 
74 // Note: the following macro is used for extremely verbose logging message.  In
75 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
76 // 0; but one side effect of this is to turn all LOGV's as well.  Some messages
77 // are so verbose that we want to suppress them even when we have ALOG_ASSERT
78 // turned on.  Do not uncomment the #def below unless you really know what you
79 // are doing and want to see all of the extremely verbose messages.
80 //#define VERY_VERY_VERBOSE_LOGGING
81 #ifdef VERY_VERY_VERBOSE_LOGGING
82 #define ALOGVV ALOGV
83 #else
84 #define ALOGVV(a...) do { } while(0)
85 #endif
86 
87 #define max(a, b) ((a) > (b) ? (a) : (b))
88 
89 namespace android {
90 
91 // retry counts for buffer fill timeout
92 // 50 * ~20msecs = 1 second
93 static const int8_t kMaxTrackRetries = 50;
94 static const int8_t kMaxTrackStartupRetries = 50;
95 // allow less retry attempts on direct output thread.
96 // direct outputs can be a scarce resource in audio hardware and should
97 // be released as quickly as possible.
98 static const int8_t kMaxTrackRetriesDirect = 2;
99 
100 // don't warn about blocked writes or record buffer overflows more often than this
101 static const nsecs_t kWarningThrottleNs = seconds(5);
102 
103 // RecordThread loop sleep time upon application overrun or audio HAL read error
104 static const int kRecordThreadSleepUs = 5000;
105 
106 // maximum time to wait in sendConfigEvent_l() for a status to be received
107 static const nsecs_t kConfigEventTimeoutNs = seconds(2);
108 
109 // minimum sleep time for the mixer thread loop when tracks are active but in underrun
110 static const uint32_t kMinThreadSleepTimeUs = 5000;
111 // maximum divider applied to the active sleep time in the mixer thread loop
112 static const uint32_t kMaxThreadSleepTimeShift = 2;
113 
114 // minimum normal sink buffer size, expressed in milliseconds rather than frames
115 static const uint32_t kMinNormalSinkBufferSizeMs = 20;
116 // maximum normal sink buffer size
117 static const uint32_t kMaxNormalSinkBufferSizeMs = 24;
118 
119 // Offloaded output thread standby delay: allows track transition without going to standby
120 static const nsecs_t kOffloadStandbyDelayNs = seconds(1);
121 
122 // Whether to use fast mixer
123 static const enum {
124     FastMixer_Never,    // never initialize or use: for debugging only
125     FastMixer_Always,   // always initialize and use, even if not needed: for debugging only
126                         // normal mixer multiplier is 1
127     FastMixer_Static,   // initialize if needed, then use all the time if initialized,
128                         // multiplier is calculated based on min & max normal mixer buffer size
129     FastMixer_Dynamic,  // initialize if needed, then use dynamically depending on track load,
130                         // multiplier is calculated based on min & max normal mixer buffer size
131     // FIXME for FastMixer_Dynamic:
132     //  Supporting this option will require fixing HALs that can't handle large writes.
133     //  For example, one HAL implementation returns an error from a large write,
134     //  and another HAL implementation corrupts memory, possibly in the sample rate converter.
135     //  We could either fix the HAL implementations, or provide a wrapper that breaks
136     //  up large writes into smaller ones, and the wrapper would need to deal with scheduler.
137 } kUseFastMixer = FastMixer_Static;
138 
139 // Whether to use fast capture
140 static const enum {
141     FastCapture_Never,  // never initialize or use: for debugging only
142     FastCapture_Always, // always initialize and use, even if not needed: for debugging only
143     FastCapture_Static, // initialize if needed, then use all the time if initialized
144 } kUseFastCapture = FastCapture_Static;
145 
146 // Priorities for requestPriority
147 static const int kPriorityAudioApp = 2;
148 static const int kPriorityFastMixer = 3;
149 static const int kPriorityFastCapture = 3;
150 
151 // IAudioFlinger::createTrack() reports back to client the total size of shared memory area
152 // for the track.  The client then sub-divides this into smaller buffers for its use.
153 // Currently the client uses N-buffering by default, but doesn't tell us about the value of N.
154 // So for now we just assume that client is double-buffered for fast tracks.
155 // FIXME It would be better for client to tell AudioFlinger the value of N,
156 // so AudioFlinger could allocate the right amount of memory.
157 // See the client's minBufCount and mNotificationFramesAct calculations for details.
158 
159 // This is the default value, if not specified by property.
160 static const int kFastTrackMultiplier = 2;
161 
162 // The minimum and maximum allowed values
163 static const int kFastTrackMultiplierMin = 1;
164 static const int kFastTrackMultiplierMax = 2;
165 
166 // The actual value to use, which can be specified per-device via property af.fast_track_multiplier.
167 static int sFastTrackMultiplier = kFastTrackMultiplier;
168 
169 // See Thread::readOnlyHeap().
170 // Initially this heap is used to allocate client buffers for "fast" AudioRecord.
171 // Eventually it will be the single buffer that FastCapture writes into via HAL read(),
172 // and that all "fast" AudioRecord clients read from.  In either case, the size can be small.
173 static const size_t kRecordThreadReadOnlyHeapSize = 0x2000;
174 
175 // ----------------------------------------------------------------------------
176 
177 static pthread_once_t sFastTrackMultiplierOnce = PTHREAD_ONCE_INIT;
178 
sFastTrackMultiplierInit()179 static void sFastTrackMultiplierInit()
180 {
181     char value[PROPERTY_VALUE_MAX];
182     if (property_get("af.fast_track_multiplier", value, NULL) > 0) {
183         char *endptr;
184         unsigned long ul = strtoul(value, &endptr, 0);
185         if (*endptr == '\0' && kFastTrackMultiplierMin <= ul && ul <= kFastTrackMultiplierMax) {
186             sFastTrackMultiplier = (int) ul;
187         }
188     }
189 }
190 
191 // ----------------------------------------------------------------------------
192 
193 #ifdef ADD_BATTERY_DATA
194 // To collect the amplifier usage
addBatteryData(uint32_t params)195 static void addBatteryData(uint32_t params) {
196     sp<IMediaPlayerService> service = IMediaDeathNotifier::getMediaPlayerService();
197     if (service == NULL) {
198         // it already logged
199         return;
200     }
201 
202     service->addBatteryData(params);
203 }
204 #endif
205 
206 
207 // ----------------------------------------------------------------------------
208 //      CPU Stats
209 // ----------------------------------------------------------------------------
210 
211 class CpuStats {
212 public:
213     CpuStats();
214     void sample(const String8 &title);
215 #ifdef DEBUG_CPU_USAGE
216 private:
217     ThreadCpuUsage mCpuUsage;           // instantaneous thread CPU usage in wall clock ns
218     CentralTendencyStatistics mWcStats; // statistics on thread CPU usage in wall clock ns
219 
220     CentralTendencyStatistics mHzStats; // statistics on thread CPU usage in cycles
221 
222     int mCpuNum;                        // thread's current CPU number
223     int mCpukHz;                        // frequency of thread's current CPU in kHz
224 #endif
225 };
226 
CpuStats()227 CpuStats::CpuStats()
228 #ifdef DEBUG_CPU_USAGE
229     : mCpuNum(-1), mCpukHz(-1)
230 #endif
231 {
232 }
233 
sample(const String8 & title __unused)234 void CpuStats::sample(const String8 &title
235 #ifndef DEBUG_CPU_USAGE
236                 __unused
237 #endif
238         ) {
239 #ifdef DEBUG_CPU_USAGE
240     // get current thread's delta CPU time in wall clock ns
241     double wcNs;
242     bool valid = mCpuUsage.sampleAndEnable(wcNs);
243 
244     // record sample for wall clock statistics
245     if (valid) {
246         mWcStats.sample(wcNs);
247     }
248 
249     // get the current CPU number
250     int cpuNum = sched_getcpu();
251 
252     // get the current CPU frequency in kHz
253     int cpukHz = mCpuUsage.getCpukHz(cpuNum);
254 
255     // check if either CPU number or frequency changed
256     if (cpuNum != mCpuNum || cpukHz != mCpukHz) {
257         mCpuNum = cpuNum;
258         mCpukHz = cpukHz;
259         // ignore sample for purposes of cycles
260         valid = false;
261     }
262 
263     // if no change in CPU number or frequency, then record sample for cycle statistics
264     if (valid && mCpukHz > 0) {
265         double cycles = wcNs * cpukHz * 0.000001;
266         mHzStats.sample(cycles);
267     }
268 
269     unsigned n = mWcStats.n();
270     // mCpuUsage.elapsed() is expensive, so don't call it every loop
271     if ((n & 127) == 1) {
272         long long elapsed = mCpuUsage.elapsed();
273         if (elapsed >= DEBUG_CPU_USAGE * 1000000000LL) {
274             double perLoop = elapsed / (double) n;
275             double perLoop100 = perLoop * 0.01;
276             double perLoop1k = perLoop * 0.001;
277             double mean = mWcStats.mean();
278             double stddev = mWcStats.stddev();
279             double minimum = mWcStats.minimum();
280             double maximum = mWcStats.maximum();
281             double meanCycles = mHzStats.mean();
282             double stddevCycles = mHzStats.stddev();
283             double minCycles = mHzStats.minimum();
284             double maxCycles = mHzStats.maximum();
285             mCpuUsage.resetElapsed();
286             mWcStats.reset();
287             mHzStats.reset();
288             ALOGD("CPU usage for %s over past %.1f secs\n"
289                 "  (%u mixer loops at %.1f mean ms per loop):\n"
290                 "  us per mix loop: mean=%.0f stddev=%.0f min=%.0f max=%.0f\n"
291                 "  %% of wall: mean=%.1f stddev=%.1f min=%.1f max=%.1f\n"
292                 "  MHz: mean=%.1f, stddev=%.1f, min=%.1f max=%.1f",
293                     title.string(),
294                     elapsed * .000000001, n, perLoop * .000001,
295                     mean * .001,
296                     stddev * .001,
297                     minimum * .001,
298                     maximum * .001,
299                     mean / perLoop100,
300                     stddev / perLoop100,
301                     minimum / perLoop100,
302                     maximum / perLoop100,
303                     meanCycles / perLoop1k,
304                     stddevCycles / perLoop1k,
305                     minCycles / perLoop1k,
306                     maxCycles / perLoop1k);
307 
308         }
309     }
310 #endif
311 };
312 
313 // ----------------------------------------------------------------------------
314 //      ThreadBase
315 // ----------------------------------------------------------------------------
316 
ThreadBase(const sp<AudioFlinger> & audioFlinger,audio_io_handle_t id,audio_devices_t outDevice,audio_devices_t inDevice,type_t type)317 AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
318         audio_devices_t outDevice, audio_devices_t inDevice, type_t type)
319     :   Thread(false /*canCallJava*/),
320         mType(type),
321         mAudioFlinger(audioFlinger),
322         // mSampleRate, mFrameCount, mChannelMask, mChannelCount, mFrameSize, mFormat, mBufferSize
323         // are set by PlaybackThread::readOutputParameters_l() or
324         // RecordThread::readInputParameters_l()
325         //FIXME: mStandby should be true here. Is this some kind of hack?
326         mStandby(false), mOutDevice(outDevice), mInDevice(inDevice),
327         mAudioSource(AUDIO_SOURCE_DEFAULT), mId(id),
328         // mName will be set by concrete (non-virtual) subclass
329         mDeathRecipient(new PMDeathRecipient(this))
330 {
331 }
332 
~ThreadBase()333 AudioFlinger::ThreadBase::~ThreadBase()
334 {
335     // mConfigEvents should be empty, but just in case it isn't, free the memory it owns
336     mConfigEvents.clear();
337 
338     // do not lock the mutex in destructor
339     releaseWakeLock_l();
340     if (mPowerManager != 0) {
341         sp<IBinder> binder = mPowerManager->asBinder();
342         binder->unlinkToDeath(mDeathRecipient);
343     }
344 }
345 
readyToRun()346 status_t AudioFlinger::ThreadBase::readyToRun()
347 {
348     status_t status = initCheck();
349     if (status == NO_ERROR) {
350         ALOGI("AudioFlinger's thread %p ready to run", this);
351     } else {
352         ALOGE("No working audio driver found.");
353     }
354     return status;
355 }
356 
exit()357 void AudioFlinger::ThreadBase::exit()
358 {
359     ALOGV("ThreadBase::exit");
360     // do any cleanup required for exit to succeed
361     preExit();
362     {
363         // This lock prevents the following race in thread (uniprocessor for illustration):
364         //  if (!exitPending()) {
365         //      // context switch from here to exit()
366         //      // exit() calls requestExit(), what exitPending() observes
367         //      // exit() calls signal(), which is dropped since no waiters
368         //      // context switch back from exit() to here
369         //      mWaitWorkCV.wait(...);
370         //      // now thread is hung
371         //  }
372         AutoMutex lock(mLock);
373         requestExit();
374         mWaitWorkCV.broadcast();
375     }
376     // When Thread::requestExitAndWait is made virtual and this method is renamed to
377     // "virtual status_t requestExitAndWait()", replace by "return Thread::requestExitAndWait();"
378     requestExitAndWait();
379 }
380 
setParameters(const String8 & keyValuePairs)381 status_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs)
382 {
383     status_t status;
384 
385     ALOGV("ThreadBase::setParameters() %s", keyValuePairs.string());
386     Mutex::Autolock _l(mLock);
387 
388     return sendSetParameterConfigEvent_l(keyValuePairs);
389 }
390 
391 // sendConfigEvent_l() must be called with ThreadBase::mLock held
392 // Can temporarily release the lock if waiting for a reply from processConfigEvents_l().
sendConfigEvent_l(sp<ConfigEvent> & event)393 status_t AudioFlinger::ThreadBase::sendConfigEvent_l(sp<ConfigEvent>& event)
394 {
395     status_t status = NO_ERROR;
396 
397     mConfigEvents.add(event);
398     ALOGV("sendConfigEvent_l() num events %d event %d", mConfigEvents.size(), event->mType);
399     mWaitWorkCV.signal();
400     mLock.unlock();
401     {
402         Mutex::Autolock _l(event->mLock);
403         while (event->mWaitStatus) {
404             if (event->mCond.waitRelative(event->mLock, kConfigEventTimeoutNs) != NO_ERROR) {
405                 event->mStatus = TIMED_OUT;
406                 event->mWaitStatus = false;
407             }
408         }
409         status = event->mStatus;
410     }
411     mLock.lock();
412     return status;
413 }
414 
sendIoConfigEvent(int event,int param)415 void AudioFlinger::ThreadBase::sendIoConfigEvent(int event, int param)
416 {
417     Mutex::Autolock _l(mLock);
418     sendIoConfigEvent_l(event, param);
419 }
420 
421 // sendIoConfigEvent_l() must be called with ThreadBase::mLock held
sendIoConfigEvent_l(int event,int param)422 void AudioFlinger::ThreadBase::sendIoConfigEvent_l(int event, int param)
423 {
424     sp<ConfigEvent> configEvent = (ConfigEvent *)new IoConfigEvent(event, param);
425     sendConfigEvent_l(configEvent);
426 }
427 
428 // sendPrioConfigEvent_l() must be called with ThreadBase::mLock held
sendPrioConfigEvent_l(pid_t pid,pid_t tid,int32_t prio)429 void AudioFlinger::ThreadBase::sendPrioConfigEvent_l(pid_t pid, pid_t tid, int32_t prio)
430 {
431     sp<ConfigEvent> configEvent = (ConfigEvent *)new PrioConfigEvent(pid, tid, prio);
432     sendConfigEvent_l(configEvent);
433 }
434 
435 // sendSetParameterConfigEvent_l() must be called with ThreadBase::mLock held
sendSetParameterConfigEvent_l(const String8 & keyValuePair)436 status_t AudioFlinger::ThreadBase::sendSetParameterConfigEvent_l(const String8& keyValuePair)
437 {
438     sp<ConfigEvent> configEvent = (ConfigEvent *)new SetParameterConfigEvent(keyValuePair);
439     return sendConfigEvent_l(configEvent);
440 }
441 
sendCreateAudioPatchConfigEvent(const struct audio_patch * patch,audio_patch_handle_t * handle)442 status_t AudioFlinger::ThreadBase::sendCreateAudioPatchConfigEvent(
443                                                         const struct audio_patch *patch,
444                                                         audio_patch_handle_t *handle)
445 {
446     Mutex::Autolock _l(mLock);
447     sp<ConfigEvent> configEvent = (ConfigEvent *)new CreateAudioPatchConfigEvent(*patch, *handle);
448     status_t status = sendConfigEvent_l(configEvent);
449     if (status == NO_ERROR) {
450         CreateAudioPatchConfigEventData *data =
451                                         (CreateAudioPatchConfigEventData *)configEvent->mData.get();
452         *handle = data->mHandle;
453     }
454     return status;
455 }
456 
sendReleaseAudioPatchConfigEvent(const audio_patch_handle_t handle)457 status_t AudioFlinger::ThreadBase::sendReleaseAudioPatchConfigEvent(
458                                                                 const audio_patch_handle_t handle)
459 {
460     Mutex::Autolock _l(mLock);
461     sp<ConfigEvent> configEvent = (ConfigEvent *)new ReleaseAudioPatchConfigEvent(handle);
462     return sendConfigEvent_l(configEvent);
463 }
464 
465 
466 // post condition: mConfigEvents.isEmpty()
processConfigEvents_l()467 void AudioFlinger::ThreadBase::processConfigEvents_l()
468 {
469     bool configChanged = false;
470 
471     while (!mConfigEvents.isEmpty()) {
472         ALOGV("processConfigEvents_l() remaining events %d", mConfigEvents.size());
473         sp<ConfigEvent> event = mConfigEvents[0];
474         mConfigEvents.removeAt(0);
475         switch (event->mType) {
476         case CFG_EVENT_PRIO: {
477             PrioConfigEventData *data = (PrioConfigEventData *)event->mData.get();
478             // FIXME Need to understand why this has to be done asynchronously
479             int err = requestPriority(data->mPid, data->mTid, data->mPrio,
480                     true /*asynchronous*/);
481             if (err != 0) {
482                 ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
483                       data->mPrio, data->mPid, data->mTid, err);
484             }
485         } break;
486         case CFG_EVENT_IO: {
487             IoConfigEventData *data = (IoConfigEventData *)event->mData.get();
488             audioConfigChanged(data->mEvent, data->mParam);
489         } break;
490         case CFG_EVENT_SET_PARAMETER: {
491             SetParameterConfigEventData *data = (SetParameterConfigEventData *)event->mData.get();
492             if (checkForNewParameter_l(data->mKeyValuePairs, event->mStatus)) {
493                 configChanged = true;
494             }
495         } break;
496         case CFG_EVENT_CREATE_AUDIO_PATCH: {
497             CreateAudioPatchConfigEventData *data =
498                                             (CreateAudioPatchConfigEventData *)event->mData.get();
499             event->mStatus = createAudioPatch_l(&data->mPatch, &data->mHandle);
500         } break;
501         case CFG_EVENT_RELEASE_AUDIO_PATCH: {
502             ReleaseAudioPatchConfigEventData *data =
503                                             (ReleaseAudioPatchConfigEventData *)event->mData.get();
504             event->mStatus = releaseAudioPatch_l(data->mHandle);
505         } break;
506         default:
507             ALOG_ASSERT(false, "processConfigEvents_l() unknown event type %d", event->mType);
508             break;
509         }
510         {
511             Mutex::Autolock _l(event->mLock);
512             if (event->mWaitStatus) {
513                 event->mWaitStatus = false;
514                 event->mCond.signal();
515             }
516         }
517         ALOGV_IF(mConfigEvents.isEmpty(), "processConfigEvents_l() DONE thread %p", this);
518     }
519 
520     if (configChanged) {
521         cacheParameters_l();
522     }
523 }
524 
channelMaskToString(audio_channel_mask_t mask,bool output)525 String8 channelMaskToString(audio_channel_mask_t mask, bool output) {
526     String8 s;
527     if (output) {
528         if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT) s.append("front-left, ");
529         if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT) s.append("front-right, ");
530         if (mask & AUDIO_CHANNEL_OUT_FRONT_CENTER) s.append("front-center, ");
531         if (mask & AUDIO_CHANNEL_OUT_LOW_FREQUENCY) s.append("low freq, ");
532         if (mask & AUDIO_CHANNEL_OUT_BACK_LEFT) s.append("back-left, ");
533         if (mask & AUDIO_CHANNEL_OUT_BACK_RIGHT) s.append("back-right, ");
534         if (mask & AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER) s.append("front-left-of-center, ");
535         if (mask & AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER) s.append("front-right-of-center, ");
536         if (mask & AUDIO_CHANNEL_OUT_BACK_CENTER) s.append("back-center, ");
537         if (mask & AUDIO_CHANNEL_OUT_SIDE_LEFT) s.append("side-left, ");
538         if (mask & AUDIO_CHANNEL_OUT_SIDE_RIGHT) s.append("side-right, ");
539         if (mask & AUDIO_CHANNEL_OUT_TOP_CENTER) s.append("top-center ,");
540         if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT) s.append("top-front-left, ");
541         if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER) s.append("top-front-center, ");
542         if (mask & AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT) s.append("top-front-right, ");
543         if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_LEFT) s.append("top-back-left, ");
544         if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_CENTER) s.append("top-back-center, " );
545         if (mask & AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT) s.append("top-back-right, " );
546         if (mask & ~AUDIO_CHANNEL_OUT_ALL) s.append("unknown,  ");
547     } else {
548         if (mask & AUDIO_CHANNEL_IN_LEFT) s.append("left, ");
549         if (mask & AUDIO_CHANNEL_IN_RIGHT) s.append("right, ");
550         if (mask & AUDIO_CHANNEL_IN_FRONT) s.append("front, ");
551         if (mask & AUDIO_CHANNEL_IN_BACK) s.append("back, ");
552         if (mask & AUDIO_CHANNEL_IN_LEFT_PROCESSED) s.append("left-processed, ");
553         if (mask & AUDIO_CHANNEL_IN_RIGHT_PROCESSED) s.append("right-processed, ");
554         if (mask & AUDIO_CHANNEL_IN_FRONT_PROCESSED) s.append("front-processed, ");
555         if (mask & AUDIO_CHANNEL_IN_BACK_PROCESSED) s.append("back-processed, ");
556         if (mask & AUDIO_CHANNEL_IN_PRESSURE) s.append("pressure, ");
557         if (mask & AUDIO_CHANNEL_IN_X_AXIS) s.append("X, ");
558         if (mask & AUDIO_CHANNEL_IN_Y_AXIS) s.append("Y, ");
559         if (mask & AUDIO_CHANNEL_IN_Z_AXIS) s.append("Z, ");
560         if (mask & AUDIO_CHANNEL_IN_VOICE_UPLINK) s.append("voice-uplink, ");
561         if (mask & AUDIO_CHANNEL_IN_VOICE_DNLINK) s.append("voice-dnlink, ");
562         if (mask & ~AUDIO_CHANNEL_IN_ALL) s.append("unknown,  ");
563     }
564     int len = s.length();
565     if (s.length() > 2) {
566         char *str = s.lockBuffer(len);
567         s.unlockBuffer(len - 2);
568     }
569     return s;
570 }
571 
dumpBase(int fd,const Vector<String16> & args __unused)572 void AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args __unused)
573 {
574     const size_t SIZE = 256;
575     char buffer[SIZE];
576     String8 result;
577 
578     bool locked = AudioFlinger::dumpTryLock(mLock);
579     if (!locked) {
580         dprintf(fd, "thread %p maybe dead locked\n", this);
581     }
582 
583     dprintf(fd, "  I/O handle: %d\n", mId);
584     dprintf(fd, "  TID: %d\n", getTid());
585     dprintf(fd, "  Standby: %s\n", mStandby ? "yes" : "no");
586     dprintf(fd, "  Sample rate: %u\n", mSampleRate);
587     dprintf(fd, "  HAL frame count: %zu\n", mFrameCount);
588     dprintf(fd, "  HAL buffer size: %u bytes\n", mBufferSize);
589     dprintf(fd, "  Channel Count: %u\n", mChannelCount);
590     dprintf(fd, "  Channel Mask: 0x%08x (%s)\n", mChannelMask,
591             channelMaskToString(mChannelMask, mType != RECORD).string());
592     dprintf(fd, "  Format: 0x%x (%s)\n", mHALFormat, formatToString(mHALFormat));
593     dprintf(fd, "  Frame size: %zu\n", mFrameSize);
594     dprintf(fd, "  Pending config events:");
595     size_t numConfig = mConfigEvents.size();
596     if (numConfig) {
597         for (size_t i = 0; i < numConfig; i++) {
598             mConfigEvents[i]->dump(buffer, SIZE);
599             dprintf(fd, "\n    %s", buffer);
600         }
601         dprintf(fd, "\n");
602     } else {
603         dprintf(fd, " none\n");
604     }
605 
606     if (locked) {
607         mLock.unlock();
608     }
609 }
610 
dumpEffectChains(int fd,const Vector<String16> & args)611 void AudioFlinger::ThreadBase::dumpEffectChains(int fd, const Vector<String16>& args)
612 {
613     const size_t SIZE = 256;
614     char buffer[SIZE];
615     String8 result;
616 
617     size_t numEffectChains = mEffectChains.size();
618     snprintf(buffer, SIZE, "  %zu Effect Chains\n", numEffectChains);
619     write(fd, buffer, strlen(buffer));
620 
621     for (size_t i = 0; i < numEffectChains; ++i) {
622         sp<EffectChain> chain = mEffectChains[i];
623         if (chain != 0) {
624             chain->dump(fd, args);
625         }
626     }
627 }
628 
acquireWakeLock(int uid)629 void AudioFlinger::ThreadBase::acquireWakeLock(int uid)
630 {
631     Mutex::Autolock _l(mLock);
632     acquireWakeLock_l(uid);
633 }
634 
getWakeLockTag()635 String16 AudioFlinger::ThreadBase::getWakeLockTag()
636 {
637     switch (mType) {
638         case MIXER:
639             return String16("AudioMix");
640         case DIRECT:
641             return String16("AudioDirectOut");
642         case DUPLICATING:
643             return String16("AudioDup");
644         case RECORD:
645             return String16("AudioIn");
646         case OFFLOAD:
647             return String16("AudioOffload");
648         default:
649             ALOG_ASSERT(false);
650             return String16("AudioUnknown");
651     }
652 }
653 
acquireWakeLock_l(int uid)654 void AudioFlinger::ThreadBase::acquireWakeLock_l(int uid)
655 {
656     getPowerManager_l();
657     if (mPowerManager != 0) {
658         sp<IBinder> binder = new BBinder();
659         status_t status;
660         if (uid >= 0) {
661             status = mPowerManager->acquireWakeLockWithUid(POWERMANAGER_PARTIAL_WAKE_LOCK,
662                     binder,
663                     getWakeLockTag(),
664                     String16("media"),
665                     uid,
666                     true /* FIXME force oneway contrary to .aidl */);
667         } else {
668             status = mPowerManager->acquireWakeLock(POWERMANAGER_PARTIAL_WAKE_LOCK,
669                     binder,
670                     getWakeLockTag(),
671                     String16("media"),
672                     true /* FIXME force oneway contrary to .aidl */);
673         }
674         if (status == NO_ERROR) {
675             mWakeLockToken = binder;
676         }
677         ALOGV("acquireWakeLock_l() %s status %d", mName, status);
678     }
679 }
680 
releaseWakeLock()681 void AudioFlinger::ThreadBase::releaseWakeLock()
682 {
683     Mutex::Autolock _l(mLock);
684     releaseWakeLock_l();
685 }
686 
releaseWakeLock_l()687 void AudioFlinger::ThreadBase::releaseWakeLock_l()
688 {
689     if (mWakeLockToken != 0) {
690         ALOGV("releaseWakeLock_l() %s", mName);
691         if (mPowerManager != 0) {
692             mPowerManager->releaseWakeLock(mWakeLockToken, 0,
693                     true /* FIXME force oneway contrary to .aidl */);
694         }
695         mWakeLockToken.clear();
696     }
697 }
698 
updateWakeLockUids(const SortedVector<int> & uids)699 void AudioFlinger::ThreadBase::updateWakeLockUids(const SortedVector<int> &uids) {
700     Mutex::Autolock _l(mLock);
701     updateWakeLockUids_l(uids);
702 }
703 
getPowerManager_l()704 void AudioFlinger::ThreadBase::getPowerManager_l() {
705 
706     if (mPowerManager == 0) {
707         // use checkService() to avoid blocking if power service is not up yet
708         sp<IBinder> binder =
709             defaultServiceManager()->checkService(String16("power"));
710         if (binder == 0) {
711             ALOGW("Thread %s cannot connect to the power manager service", mName);
712         } else {
713             mPowerManager = interface_cast<IPowerManager>(binder);
714             binder->linkToDeath(mDeathRecipient);
715         }
716     }
717 }
718 
updateWakeLockUids_l(const SortedVector<int> & uids)719 void AudioFlinger::ThreadBase::updateWakeLockUids_l(const SortedVector<int> &uids) {
720 
721     getPowerManager_l();
722     if (mWakeLockToken == NULL) {
723         ALOGE("no wake lock to update!");
724         return;
725     }
726     if (mPowerManager != 0) {
727         sp<IBinder> binder = new BBinder();
728         status_t status;
729         status = mPowerManager->updateWakeLockUids(mWakeLockToken, uids.size(), uids.array(),
730                     true /* FIXME force oneway contrary to .aidl */);
731         ALOGV("acquireWakeLock_l() %s status %d", mName, status);
732     }
733 }
734 
clearPowerManager()735 void AudioFlinger::ThreadBase::clearPowerManager()
736 {
737     Mutex::Autolock _l(mLock);
738     releaseWakeLock_l();
739     mPowerManager.clear();
740 }
741 
binderDied(const wp<IBinder> & who __unused)742 void AudioFlinger::ThreadBase::PMDeathRecipient::binderDied(const wp<IBinder>& who __unused)
743 {
744     sp<ThreadBase> thread = mThread.promote();
745     if (thread != 0) {
746         thread->clearPowerManager();
747     }
748     ALOGW("power manager service died !!!");
749 }
750 
setEffectSuspended(const effect_uuid_t * type,bool suspend,int sessionId)751 void AudioFlinger::ThreadBase::setEffectSuspended(
752         const effect_uuid_t *type, bool suspend, int sessionId)
753 {
754     Mutex::Autolock _l(mLock);
755     setEffectSuspended_l(type, suspend, sessionId);
756 }
757 
setEffectSuspended_l(const effect_uuid_t * type,bool suspend,int sessionId)758 void AudioFlinger::ThreadBase::setEffectSuspended_l(
759         const effect_uuid_t *type, bool suspend, int sessionId)
760 {
761     sp<EffectChain> chain = getEffectChain_l(sessionId);
762     if (chain != 0) {
763         if (type != NULL) {
764             chain->setEffectSuspended_l(type, suspend);
765         } else {
766             chain->setEffectSuspendedAll_l(suspend);
767         }
768     }
769 
770     updateSuspendedSessions_l(type, suspend, sessionId);
771 }
772 
checkSuspendOnAddEffectChain_l(const sp<EffectChain> & chain)773 void AudioFlinger::ThreadBase::checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain)
774 {
775     ssize_t index = mSuspendedSessions.indexOfKey(chain->sessionId());
776     if (index < 0) {
777         return;
778     }
779 
780     const KeyedVector <int, sp<SuspendedSessionDesc> >& sessionEffects =
781             mSuspendedSessions.valueAt(index);
782 
783     for (size_t i = 0; i < sessionEffects.size(); i++) {
784         sp<SuspendedSessionDesc> desc = sessionEffects.valueAt(i);
785         for (int j = 0; j < desc->mRefCount; j++) {
786             if (sessionEffects.keyAt(i) == EffectChain::kKeyForSuspendAll) {
787                 chain->setEffectSuspendedAll_l(true);
788             } else {
789                 ALOGV("checkSuspendOnAddEffectChain_l() suspending effects %08x",
790                     desc->mType.timeLow);
791                 chain->setEffectSuspended_l(&desc->mType, true);
792             }
793         }
794     }
795 }
796 
updateSuspendedSessions_l(const effect_uuid_t * type,bool suspend,int sessionId)797 void AudioFlinger::ThreadBase::updateSuspendedSessions_l(const effect_uuid_t *type,
798                                                          bool suspend,
799                                                          int sessionId)
800 {
801     ssize_t index = mSuspendedSessions.indexOfKey(sessionId);
802 
803     KeyedVector <int, sp<SuspendedSessionDesc> > sessionEffects;
804 
805     if (suspend) {
806         if (index >= 0) {
807             sessionEffects = mSuspendedSessions.valueAt(index);
808         } else {
809             mSuspendedSessions.add(sessionId, sessionEffects);
810         }
811     } else {
812         if (index < 0) {
813             return;
814         }
815         sessionEffects = mSuspendedSessions.valueAt(index);
816     }
817 
818 
819     int key = EffectChain::kKeyForSuspendAll;
820     if (type != NULL) {
821         key = type->timeLow;
822     }
823     index = sessionEffects.indexOfKey(key);
824 
825     sp<SuspendedSessionDesc> desc;
826     if (suspend) {
827         if (index >= 0) {
828             desc = sessionEffects.valueAt(index);
829         } else {
830             desc = new SuspendedSessionDesc();
831             if (type != NULL) {
832                 desc->mType = *type;
833             }
834             sessionEffects.add(key, desc);
835             ALOGV("updateSuspendedSessions_l() suspend adding effect %08x", key);
836         }
837         desc->mRefCount++;
838     } else {
839         if (index < 0) {
840             return;
841         }
842         desc = sessionEffects.valueAt(index);
843         if (--desc->mRefCount == 0) {
844             ALOGV("updateSuspendedSessions_l() restore removing effect %08x", key);
845             sessionEffects.removeItemsAt(index);
846             if (sessionEffects.isEmpty()) {
847                 ALOGV("updateSuspendedSessions_l() restore removing session %d",
848                                  sessionId);
849                 mSuspendedSessions.removeItem(sessionId);
850             }
851         }
852     }
853     if (!sessionEffects.isEmpty()) {
854         mSuspendedSessions.replaceValueFor(sessionId, sessionEffects);
855     }
856 }
857 
checkSuspendOnEffectEnabled(const sp<EffectModule> & effect,bool enabled,int sessionId)858 void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
859                                                             bool enabled,
860                                                             int sessionId)
861 {
862     Mutex::Autolock _l(mLock);
863     checkSuspendOnEffectEnabled_l(effect, enabled, sessionId);
864 }
865 
checkSuspendOnEffectEnabled_l(const sp<EffectModule> & effect,bool enabled,int sessionId)866 void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
867                                                             bool enabled,
868                                                             int sessionId)
869 {
870     if (mType != RECORD) {
871         // suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on
872         // another session. This gives the priority to well behaved effect control panels
873         // and applications not using global effects.
874         // Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect
875         // global effects
876         if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) && (sessionId != AUDIO_SESSION_OUTPUT_STAGE)) {
877             setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX);
878         }
879     }
880 
881     sp<EffectChain> chain = getEffectChain_l(sessionId);
882     if (chain != 0) {
883         chain->checkSuspendOnEffectEnabled(effect, enabled);
884     }
885 }
886 
887 // ThreadBase::createEffect_l() must be called with AudioFlinger::mLock held
createEffect_l(const sp<AudioFlinger::Client> & client,const sp<IEffectClient> & effectClient,int32_t priority,int sessionId,effect_descriptor_t * desc,int * enabled,status_t * status)888 sp<AudioFlinger::EffectHandle> AudioFlinger::ThreadBase::createEffect_l(
889         const sp<AudioFlinger::Client>& client,
890         const sp<IEffectClient>& effectClient,
891         int32_t priority,
892         int sessionId,
893         effect_descriptor_t *desc,
894         int *enabled,
895         status_t *status)
896 {
897     sp<EffectModule> effect;
898     sp<EffectHandle> handle;
899     status_t lStatus;
900     sp<EffectChain> chain;
901     bool chainCreated = false;
902     bool effectCreated = false;
903     bool effectRegistered = false;
904 
905     lStatus = initCheck();
906     if (lStatus != NO_ERROR) {
907         ALOGW("createEffect_l() Audio driver not initialized.");
908         goto Exit;
909     }
910 
911     // Reject any effect on Direct output threads for now, since the format of
912     // mSinkBuffer is not guaranteed to be compatible with effect processing (PCM 16 stereo).
913     if (mType == DIRECT) {
914         ALOGW("createEffect_l() Cannot add effect %s on Direct output type thread %s",
915                 desc->name, mName);
916         lStatus = BAD_VALUE;
917         goto Exit;
918     }
919 
920     // Reject any effect on mixer or duplicating multichannel sinks.
921     // TODO: fix both format and multichannel issues with effects.
922     if ((mType == MIXER || mType == DUPLICATING) && mChannelCount != FCC_2) {
923         ALOGW("createEffect_l() Cannot add effect %s for multichannel(%d) %s threads",
924                 desc->name, mChannelCount, mType == MIXER ? "MIXER" : "DUPLICATING");
925         lStatus = BAD_VALUE;
926         goto Exit;
927     }
928 
929     // Allow global effects only on offloaded and mixer threads
930     if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
931         switch (mType) {
932         case MIXER:
933         case OFFLOAD:
934             break;
935         case DIRECT:
936         case DUPLICATING:
937         case RECORD:
938         default:
939             ALOGW("createEffect_l() Cannot add global effect %s on thread %s", desc->name, mName);
940             lStatus = BAD_VALUE;
941             goto Exit;
942         }
943     }
944 
945     // Only Pre processor effects are allowed on input threads and only on input threads
946     if ((mType == RECORD) != ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC)) {
947         ALOGW("createEffect_l() effect %s (flags %08x) created on wrong thread type %d",
948                 desc->name, desc->flags, mType);
949         lStatus = BAD_VALUE;
950         goto Exit;
951     }
952 
953     ALOGV("createEffect_l() thread %p effect %s on session %d", this, desc->name, sessionId);
954 
955     { // scope for mLock
956         Mutex::Autolock _l(mLock);
957 
958         // check for existing effect chain with the requested audio session
959         chain = getEffectChain_l(sessionId);
960         if (chain == 0) {
961             // create a new chain for this session
962             ALOGV("createEffect_l() new effect chain for session %d", sessionId);
963             chain = new EffectChain(this, sessionId);
964             addEffectChain_l(chain);
965             chain->setStrategy(getStrategyForSession_l(sessionId));
966             chainCreated = true;
967         } else {
968             effect = chain->getEffectFromDesc_l(desc);
969         }
970 
971         ALOGV("createEffect_l() got effect %p on chain %p", effect.get(), chain.get());
972 
973         if (effect == 0) {
974             int id = mAudioFlinger->nextUniqueId();
975             // Check CPU and memory usage
976             lStatus = AudioSystem::registerEffect(desc, mId, chain->strategy(), sessionId, id);
977             if (lStatus != NO_ERROR) {
978                 goto Exit;
979             }
980             effectRegistered = true;
981             // create a new effect module if none present in the chain
982             effect = new EffectModule(this, chain, desc, id, sessionId);
983             lStatus = effect->status();
984             if (lStatus != NO_ERROR) {
985                 goto Exit;
986             }
987             effect->setOffloaded(mType == OFFLOAD, mId);
988 
989             lStatus = chain->addEffect_l(effect);
990             if (lStatus != NO_ERROR) {
991                 goto Exit;
992             }
993             effectCreated = true;
994 
995             effect->setDevice(mOutDevice);
996             effect->setDevice(mInDevice);
997             effect->setMode(mAudioFlinger->getMode());
998             effect->setAudioSource(mAudioSource);
999         }
1000         // create effect handle and connect it to effect module
1001         handle = new EffectHandle(effect, client, effectClient, priority);
1002         lStatus = handle->initCheck();
1003         if (lStatus == OK) {
1004             lStatus = effect->addHandle(handle.get());
1005         }
1006         if (enabled != NULL) {
1007             *enabled = (int)effect->isEnabled();
1008         }
1009     }
1010 
1011 Exit:
1012     if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
1013         Mutex::Autolock _l(mLock);
1014         if (effectCreated) {
1015             chain->removeEffect_l(effect);
1016         }
1017         if (effectRegistered) {
1018             AudioSystem::unregisterEffect(effect->id());
1019         }
1020         if (chainCreated) {
1021             removeEffectChain_l(chain);
1022         }
1023         handle.clear();
1024     }
1025 
1026     *status = lStatus;
1027     return handle;
1028 }
1029 
getEffect(int sessionId,int effectId)1030 sp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect(int sessionId, int effectId)
1031 {
1032     Mutex::Autolock _l(mLock);
1033     return getEffect_l(sessionId, effectId);
1034 }
1035 
getEffect_l(int sessionId,int effectId)1036 sp<AudioFlinger::EffectModule> AudioFlinger::ThreadBase::getEffect_l(int sessionId, int effectId)
1037 {
1038     sp<EffectChain> chain = getEffectChain_l(sessionId);
1039     return chain != 0 ? chain->getEffectFromId_l(effectId) : 0;
1040 }
1041 
1042 // PlaybackThread::addEffect_l() must be called with AudioFlinger::mLock and
1043 // PlaybackThread::mLock held
addEffect_l(const sp<EffectModule> & effect)1044 status_t AudioFlinger::ThreadBase::addEffect_l(const sp<EffectModule>& effect)
1045 {
1046     // check for existing effect chain with the requested audio session
1047     int sessionId = effect->sessionId();
1048     sp<EffectChain> chain = getEffectChain_l(sessionId);
1049     bool chainCreated = false;
1050 
1051     ALOGD_IF((mType == OFFLOAD) && !effect->isOffloadable(),
1052              "addEffect_l() on offloaded thread %p: effect %s does not support offload flags %x",
1053                     this, effect->desc().name, effect->desc().flags);
1054 
1055     if (chain == 0) {
1056         // create a new chain for this session
1057         ALOGV("addEffect_l() new effect chain for session %d", sessionId);
1058         chain = new EffectChain(this, sessionId);
1059         addEffectChain_l(chain);
1060         chain->setStrategy(getStrategyForSession_l(sessionId));
1061         chainCreated = true;
1062     }
1063     ALOGV("addEffect_l() %p chain %p effect %p", this, chain.get(), effect.get());
1064 
1065     if (chain->getEffectFromId_l(effect->id()) != 0) {
1066         ALOGW("addEffect_l() %p effect %s already present in chain %p",
1067                 this, effect->desc().name, chain.get());
1068         return BAD_VALUE;
1069     }
1070 
1071     effect->setOffloaded(mType == OFFLOAD, mId);
1072 
1073     status_t status = chain->addEffect_l(effect);
1074     if (status != NO_ERROR) {
1075         if (chainCreated) {
1076             removeEffectChain_l(chain);
1077         }
1078         return status;
1079     }
1080 
1081     effect->setDevice(mOutDevice);
1082     effect->setDevice(mInDevice);
1083     effect->setMode(mAudioFlinger->getMode());
1084     effect->setAudioSource(mAudioSource);
1085     return NO_ERROR;
1086 }
1087 
removeEffect_l(const sp<EffectModule> & effect)1088 void AudioFlinger::ThreadBase::removeEffect_l(const sp<EffectModule>& effect) {
1089 
1090     ALOGV("removeEffect_l() %p effect %p", this, effect.get());
1091     effect_descriptor_t desc = effect->desc();
1092     if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
1093         detachAuxEffect_l(effect->id());
1094     }
1095 
1096     sp<EffectChain> chain = effect->chain().promote();
1097     if (chain != 0) {
1098         // remove effect chain if removing last effect
1099         if (chain->removeEffect_l(effect) == 0) {
1100             removeEffectChain_l(chain);
1101         }
1102     } else {
1103         ALOGW("removeEffect_l() %p cannot promote chain for effect %p", this, effect.get());
1104     }
1105 }
1106 
lockEffectChains_l(Vector<sp<AudioFlinger::EffectChain>> & effectChains)1107 void AudioFlinger::ThreadBase::lockEffectChains_l(
1108         Vector< sp<AudioFlinger::EffectChain> >& effectChains)
1109 {
1110     effectChains = mEffectChains;
1111     for (size_t i = 0; i < mEffectChains.size(); i++) {
1112         mEffectChains[i]->lock();
1113     }
1114 }
1115 
unlockEffectChains(const Vector<sp<AudioFlinger::EffectChain>> & effectChains)1116 void AudioFlinger::ThreadBase::unlockEffectChains(
1117         const Vector< sp<AudioFlinger::EffectChain> >& effectChains)
1118 {
1119     for (size_t i = 0; i < effectChains.size(); i++) {
1120         effectChains[i]->unlock();
1121     }
1122 }
1123 
getEffectChain(int sessionId)1124 sp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain(int sessionId)
1125 {
1126     Mutex::Autolock _l(mLock);
1127     return getEffectChain_l(sessionId);
1128 }
1129 
getEffectChain_l(int sessionId) const1130 sp<AudioFlinger::EffectChain> AudioFlinger::ThreadBase::getEffectChain_l(int sessionId) const
1131 {
1132     size_t size = mEffectChains.size();
1133     for (size_t i = 0; i < size; i++) {
1134         if (mEffectChains[i]->sessionId() == sessionId) {
1135             return mEffectChains[i];
1136         }
1137     }
1138     return 0;
1139 }
1140 
setMode(audio_mode_t mode)1141 void AudioFlinger::ThreadBase::setMode(audio_mode_t mode)
1142 {
1143     Mutex::Autolock _l(mLock);
1144     size_t size = mEffectChains.size();
1145     for (size_t i = 0; i < size; i++) {
1146         mEffectChains[i]->setMode_l(mode);
1147     }
1148 }
1149 
getAudioPortConfig(struct audio_port_config * config)1150 void AudioFlinger::ThreadBase::getAudioPortConfig(struct audio_port_config *config)
1151 {
1152     config->type = AUDIO_PORT_TYPE_MIX;
1153     config->ext.mix.handle = mId;
1154     config->sample_rate = mSampleRate;
1155     config->format = mFormat;
1156     config->channel_mask = mChannelMask;
1157     config->config_mask = AUDIO_PORT_CONFIG_SAMPLE_RATE|AUDIO_PORT_CONFIG_CHANNEL_MASK|
1158                             AUDIO_PORT_CONFIG_FORMAT;
1159 }
1160 
1161 
1162 // ----------------------------------------------------------------------------
1163 //      Playback
1164 // ----------------------------------------------------------------------------
1165 
PlaybackThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,audio_devices_t device,type_t type)1166 AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinger,
1167                                              AudioStreamOut* output,
1168                                              audio_io_handle_t id,
1169                                              audio_devices_t device,
1170                                              type_t type)
1171     :   ThreadBase(audioFlinger, id, device, AUDIO_DEVICE_NONE, type),
1172         mNormalFrameCount(0), mSinkBuffer(NULL),
1173         mMixerBufferEnabled(AudioFlinger::kEnableExtendedPrecision),
1174         mMixerBuffer(NULL),
1175         mMixerBufferSize(0),
1176         mMixerBufferFormat(AUDIO_FORMAT_INVALID),
1177         mMixerBufferValid(false),
1178         mEffectBufferEnabled(AudioFlinger::kEnableExtendedPrecision),
1179         mEffectBuffer(NULL),
1180         mEffectBufferSize(0),
1181         mEffectBufferFormat(AUDIO_FORMAT_INVALID),
1182         mEffectBufferValid(false),
1183         mSuspended(0), mBytesWritten(0),
1184         mActiveTracksGeneration(0),
1185         // mStreamTypes[] initialized in constructor body
1186         mOutput(output),
1187         mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mInWrite(false),
1188         mMixerStatus(MIXER_IDLE),
1189         mMixerStatusIgnoringFastTracks(MIXER_IDLE),
1190         standbyDelay(AudioFlinger::mStandbyTimeInNsecs),
1191         mBytesRemaining(0),
1192         mCurrentWriteLength(0),
1193         mUseAsyncWrite(false),
1194         mWriteAckSequence(0),
1195         mDrainSequence(0),
1196         mSignalPending(false),
1197         mScreenState(AudioFlinger::mScreenState),
1198         // index 0 is reserved for normal mixer's submix
1199         mFastTrackAvailMask(((1 << FastMixerState::kMaxFastTracks) - 1) & ~1),
1200         mHwSupportsPause(false), mHwPaused(false), mFlushPending(false),
1201         // mLatchD, mLatchQ,
1202         mLatchDValid(false), mLatchQValid(false)
1203 {
1204     snprintf(mName, kNameLength, "AudioOut_%X", id);
1205     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
1206 
1207     // Assumes constructor is called by AudioFlinger with it's mLock held, but
1208     // it would be safer to explicitly pass initial masterVolume/masterMute as
1209     // parameter.
1210     //
1211     // If the HAL we are using has support for master volume or master mute,
1212     // then do not attenuate or mute during mixing (just leave the volume at 1.0
1213     // and the mute set to false).
1214     mMasterVolume = audioFlinger->masterVolume_l();
1215     mMasterMute = audioFlinger->masterMute_l();
1216     if (mOutput && mOutput->audioHwDev) {
1217         if (mOutput->audioHwDev->canSetMasterVolume()) {
1218             mMasterVolume = 1.0;
1219         }
1220 
1221         if (mOutput->audioHwDev->canSetMasterMute()) {
1222             mMasterMute = false;
1223         }
1224     }
1225 
1226     readOutputParameters_l();
1227 
1228     // ++ operator does not compile
1229     for (audio_stream_type_t stream = AUDIO_STREAM_MIN; stream < AUDIO_STREAM_CNT;
1230             stream = (audio_stream_type_t) (stream + 1)) {
1231         mStreamTypes[stream].volume = mAudioFlinger->streamVolume_l(stream);
1232         mStreamTypes[stream].mute = mAudioFlinger->streamMute_l(stream);
1233     }
1234 }
1235 
~PlaybackThread()1236 AudioFlinger::PlaybackThread::~PlaybackThread()
1237 {
1238     mAudioFlinger->unregisterWriter(mNBLogWriter);
1239     free(mSinkBuffer);
1240     free(mMixerBuffer);
1241     free(mEffectBuffer);
1242 }
1243 
dump(int fd,const Vector<String16> & args)1244 void AudioFlinger::PlaybackThread::dump(int fd, const Vector<String16>& args)
1245 {
1246     dumpInternals(fd, args);
1247     dumpTracks(fd, args);
1248     dumpEffectChains(fd, args);
1249 }
1250 
dumpTracks(int fd,const Vector<String16> & args __unused)1251 void AudioFlinger::PlaybackThread::dumpTracks(int fd, const Vector<String16>& args __unused)
1252 {
1253     const size_t SIZE = 256;
1254     char buffer[SIZE];
1255     String8 result;
1256 
1257     result.appendFormat("  Stream volumes in dB: ");
1258     for (int i = 0; i < AUDIO_STREAM_CNT; ++i) {
1259         const stream_type_t *st = &mStreamTypes[i];
1260         if (i > 0) {
1261             result.appendFormat(", ");
1262         }
1263         result.appendFormat("%d:%.2g", i, 20.0 * log10(st->volume));
1264         if (st->mute) {
1265             result.append("M");
1266         }
1267     }
1268     result.append("\n");
1269     write(fd, result.string(), result.length());
1270     result.clear();
1271 
1272     // These values are "raw"; they will wrap around.  See prepareTracks_l() for a better way.
1273     FastTrackUnderruns underruns = getFastTrackUnderruns(0);
1274     dprintf(fd, "  Normal mixer raw underrun counters: partial=%u empty=%u\n",
1275             underruns.mBitFields.mPartial, underruns.mBitFields.mEmpty);
1276 
1277     size_t numtracks = mTracks.size();
1278     size_t numactive = mActiveTracks.size();
1279     dprintf(fd, "  %d Tracks", numtracks);
1280     size_t numactiveseen = 0;
1281     if (numtracks) {
1282         dprintf(fd, " of which %d are active\n", numactive);
1283         Track::appendDumpHeader(result);
1284         for (size_t i = 0; i < numtracks; ++i) {
1285             sp<Track> track = mTracks[i];
1286             if (track != 0) {
1287                 bool active = mActiveTracks.indexOf(track) >= 0;
1288                 if (active) {
1289                     numactiveseen++;
1290                 }
1291                 track->dump(buffer, SIZE, active);
1292                 result.append(buffer);
1293             }
1294         }
1295     } else {
1296         result.append("\n");
1297     }
1298     if (numactiveseen != numactive) {
1299         // some tracks in the active list were not in the tracks list
1300         snprintf(buffer, SIZE, "  The following tracks are in the active list but"
1301                 " not in the track list\n");
1302         result.append(buffer);
1303         Track::appendDumpHeader(result);
1304         for (size_t i = 0; i < numactive; ++i) {
1305             sp<Track> track = mActiveTracks[i].promote();
1306             if (track != 0 && mTracks.indexOf(track) < 0) {
1307                 track->dump(buffer, SIZE, true);
1308                 result.append(buffer);
1309             }
1310         }
1311     }
1312 
1313     write(fd, result.string(), result.size());
1314 }
1315 
dumpInternals(int fd,const Vector<String16> & args)1316 void AudioFlinger::PlaybackThread::dumpInternals(int fd, const Vector<String16>& args)
1317 {
1318     dprintf(fd, "\nOutput thread %p:\n", this);
1319     dprintf(fd, "  Normal frame count: %zu\n", mNormalFrameCount);
1320     dprintf(fd, "  Last write occurred (msecs): %llu\n", ns2ms(systemTime() - mLastWriteTime));
1321     dprintf(fd, "  Total writes: %d\n", mNumWrites);
1322     dprintf(fd, "  Delayed writes: %d\n", mNumDelayedWrites);
1323     dprintf(fd, "  Blocked in write: %s\n", mInWrite ? "yes" : "no");
1324     dprintf(fd, "  Suspend count: %d\n", mSuspended);
1325     dprintf(fd, "  Sink buffer : %p\n", mSinkBuffer);
1326     dprintf(fd, "  Mixer buffer: %p\n", mMixerBuffer);
1327     dprintf(fd, "  Effect buffer: %p\n", mEffectBuffer);
1328     dprintf(fd, "  Fast track availMask=%#x\n", mFastTrackAvailMask);
1329 
1330     dumpBase(fd, args);
1331 }
1332 
1333 // Thread virtuals
1334 
onFirstRef()1335 void AudioFlinger::PlaybackThread::onFirstRef()
1336 {
1337     run(mName, ANDROID_PRIORITY_URGENT_AUDIO);
1338 }
1339 
1340 // ThreadBase virtuals
preExit()1341 void AudioFlinger::PlaybackThread::preExit()
1342 {
1343     ALOGV("  preExit()");
1344     // FIXME this is using hard-coded strings but in the future, this functionality will be
1345     //       converted to use audio HAL extensions required to support tunneling
1346     mOutput->stream->common.set_parameters(&mOutput->stream->common, "exiting=1");
1347 }
1348 
1349 // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
createTrack_l(const sp<AudioFlinger::Client> & client,audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * pFrameCount,const sp<IMemory> & sharedBuffer,int sessionId,IAudioFlinger::track_flags_t * flags,pid_t tid,int uid,status_t * status)1350 sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
1351         const sp<AudioFlinger::Client>& client,
1352         audio_stream_type_t streamType,
1353         uint32_t sampleRate,
1354         audio_format_t format,
1355         audio_channel_mask_t channelMask,
1356         size_t *pFrameCount,
1357         const sp<IMemory>& sharedBuffer,
1358         int sessionId,
1359         IAudioFlinger::track_flags_t *flags,
1360         pid_t tid,
1361         int uid,
1362         status_t *status)
1363 {
1364     size_t frameCount = *pFrameCount;
1365     sp<Track> track;
1366     status_t lStatus;
1367 
1368     bool isTimed = (*flags & IAudioFlinger::TRACK_TIMED) != 0;
1369 
1370     // client expresses a preference for FAST, but we get the final say
1371     if (*flags & IAudioFlinger::TRACK_FAST) {
1372       if (
1373             // not timed
1374             (!isTimed) &&
1375             // either of these use cases:
1376             (
1377               // use case 1: shared buffer with any frame count
1378               (
1379                 (sharedBuffer != 0)
1380               ) ||
1381               // use case 2: callback handler and frame count is default or at least as large as HAL
1382               (
1383                 (tid != -1) &&
1384                 ((frameCount == 0) ||
1385                 (frameCount >= mFrameCount))
1386               )
1387             ) &&
1388             // PCM data
1389             audio_is_linear_pcm(format) &&
1390             // identical channel mask to sink, or mono in and stereo sink
1391             (channelMask == mChannelMask ||
1392                     (channelMask == AUDIO_CHANNEL_OUT_MONO &&
1393                             mChannelMask == AUDIO_CHANNEL_OUT_STEREO)) &&
1394             // hardware sample rate
1395             (sampleRate == mSampleRate) &&
1396             // normal mixer has an associated fast mixer
1397             hasFastMixer() &&
1398             // there are sufficient fast track slots available
1399             (mFastTrackAvailMask != 0)
1400             // FIXME test that MixerThread for this fast track has a capable output HAL
1401             // FIXME add a permission test also?
1402         ) {
1403         // if frameCount not specified, then it defaults to fast mixer (HAL) frame count
1404         if (frameCount == 0) {
1405             // read the fast track multiplier property the first time it is needed
1406             int ok = pthread_once(&sFastTrackMultiplierOnce, sFastTrackMultiplierInit);
1407             if (ok != 0) {
1408                 ALOGE("%s pthread_once failed: %d", __func__, ok);
1409             }
1410             frameCount = mFrameCount * sFastTrackMultiplier;
1411         }
1412         ALOGV("AUDIO_OUTPUT_FLAG_FAST accepted: frameCount=%d mFrameCount=%d",
1413                 frameCount, mFrameCount);
1414       } else {
1415         ALOGV("AUDIO_OUTPUT_FLAG_FAST denied: isTimed=%d sharedBuffer=%p frameCount=%d "
1416                 "mFrameCount=%d format=%#x mFormat=%#x isLinear=%d channelMask=%#x "
1417                 "sampleRate=%u mSampleRate=%u "
1418                 "hasFastMixer=%d tid=%d fastTrackAvailMask=%#x",
1419                 isTimed, sharedBuffer.get(), frameCount, mFrameCount, format, mFormat,
1420                 audio_is_linear_pcm(format),
1421                 channelMask, sampleRate, mSampleRate, hasFastMixer(), tid, mFastTrackAvailMask);
1422         *flags &= ~IAudioFlinger::TRACK_FAST;
1423         // For compatibility with AudioTrack calculation, buffer depth is forced
1424         // to be at least 2 x the normal mixer frame count and cover audio hardware latency.
1425         // This is probably too conservative, but legacy application code may depend on it.
1426         // If you change this calculation, also review the start threshold which is related.
1427         uint32_t latencyMs = mOutput->stream->get_latency(mOutput->stream);
1428         uint32_t minBufCount = latencyMs / ((1000 * mNormalFrameCount) / mSampleRate);
1429         if (minBufCount < 2) {
1430             minBufCount = 2;
1431         }
1432         size_t minFrameCount = mNormalFrameCount * minBufCount;
1433         if (frameCount < minFrameCount) {
1434             frameCount = minFrameCount;
1435         }
1436       }
1437     }
1438     *pFrameCount = frameCount;
1439 
1440     switch (mType) {
1441 
1442     case DIRECT:
1443         if (audio_is_linear_pcm(format)) {
1444             if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
1445                 ALOGE("createTrack_l() Bad parameter: sampleRate %u format %#x, channelMask 0x%08x "
1446                         "for output %p with format %#x",
1447                         sampleRate, format, channelMask, mOutput, mFormat);
1448                 lStatus = BAD_VALUE;
1449                 goto Exit;
1450             }
1451         }
1452         break;
1453 
1454     case OFFLOAD:
1455         if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
1456             ALOGE("createTrack_l() Bad parameter: sampleRate %d format %#x, channelMask 0x%08x \""
1457                     "for output %p with format %#x",
1458                     sampleRate, format, channelMask, mOutput, mFormat);
1459             lStatus = BAD_VALUE;
1460             goto Exit;
1461         }
1462         break;
1463 
1464     default:
1465         if (!audio_is_linear_pcm(format)) {
1466                 ALOGE("createTrack_l() Bad parameter: format %#x \""
1467                         "for output %p with format %#x",
1468                         format, mOutput, mFormat);
1469                 lStatus = BAD_VALUE;
1470                 goto Exit;
1471         }
1472         if (sampleRate > mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
1473             ALOGE("Sample rate out of range: %u mSampleRate %u", sampleRate, mSampleRate);
1474             lStatus = BAD_VALUE;
1475             goto Exit;
1476         }
1477         break;
1478 
1479     }
1480 
1481     lStatus = initCheck();
1482     if (lStatus != NO_ERROR) {
1483         ALOGE("createTrack_l() audio driver not initialized");
1484         goto Exit;
1485     }
1486 
1487     { // scope for mLock
1488         Mutex::Autolock _l(mLock);
1489 
1490         // all tracks in same audio session must share the same routing strategy otherwise
1491         // conflicts will happen when tracks are moved from one output to another by audio policy
1492         // manager
1493         uint32_t strategy = AudioSystem::getStrategyForStream(streamType);
1494         for (size_t i = 0; i < mTracks.size(); ++i) {
1495             sp<Track> t = mTracks[i];
1496             if (t != 0 && t->isExternalTrack()) {
1497                 uint32_t actual = AudioSystem::getStrategyForStream(t->streamType());
1498                 if (sessionId == t->sessionId() && strategy != actual) {
1499                     ALOGE("createTrack_l() mismatched strategy; expected %u but found %u",
1500                             strategy, actual);
1501                     lStatus = BAD_VALUE;
1502                     goto Exit;
1503                 }
1504             }
1505         }
1506 
1507         if (!isTimed) {
1508             track = new Track(this, client, streamType, sampleRate, format,
1509                               channelMask, frameCount, NULL, sharedBuffer,
1510                               sessionId, uid, *flags, TrackBase::TYPE_DEFAULT);
1511         } else {
1512             track = TimedTrack::create(this, client, streamType, sampleRate, format,
1513                     channelMask, frameCount, sharedBuffer, sessionId, uid);
1514         }
1515 
1516         // new Track always returns non-NULL,
1517         // but TimedTrack::create() is a factory that could fail by returning NULL
1518         lStatus = track != 0 ? track->initCheck() : (status_t) NO_MEMORY;
1519         if (lStatus != NO_ERROR) {
1520             ALOGE("createTrack_l() initCheck failed %d; no control block?", lStatus);
1521             // track must be cleared from the caller as the caller has the AF lock
1522             goto Exit;
1523         }
1524         mTracks.add(track);
1525 
1526         sp<EffectChain> chain = getEffectChain_l(sessionId);
1527         if (chain != 0) {
1528             ALOGV("createTrack_l() setting main buffer %p", chain->inBuffer());
1529             track->setMainBuffer(chain->inBuffer());
1530             chain->setStrategy(AudioSystem::getStrategyForStream(track->streamType()));
1531             chain->incTrackCnt();
1532         }
1533 
1534         if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
1535             pid_t callingPid = IPCThreadState::self()->getCallingPid();
1536             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
1537             // so ask activity manager to do this on our behalf
1538             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
1539         }
1540     }
1541 
1542     lStatus = NO_ERROR;
1543 
1544 Exit:
1545     *status = lStatus;
1546     return track;
1547 }
1548 
correctLatency_l(uint32_t latency) const1549 uint32_t AudioFlinger::PlaybackThread::correctLatency_l(uint32_t latency) const
1550 {
1551     return latency;
1552 }
1553 
latency() const1554 uint32_t AudioFlinger::PlaybackThread::latency() const
1555 {
1556     Mutex::Autolock _l(mLock);
1557     return latency_l();
1558 }
latency_l() const1559 uint32_t AudioFlinger::PlaybackThread::latency_l() const
1560 {
1561     if (initCheck() == NO_ERROR) {
1562         return correctLatency_l(mOutput->stream->get_latency(mOutput->stream));
1563     } else {
1564         return 0;
1565     }
1566 }
1567 
setMasterVolume(float value)1568 void AudioFlinger::PlaybackThread::setMasterVolume(float value)
1569 {
1570     Mutex::Autolock _l(mLock);
1571     // Don't apply master volume in SW if our HAL can do it for us.
1572     if (mOutput && mOutput->audioHwDev &&
1573         mOutput->audioHwDev->canSetMasterVolume()) {
1574         mMasterVolume = 1.0;
1575     } else {
1576         mMasterVolume = value;
1577     }
1578 }
1579 
setMasterMute(bool muted)1580 void AudioFlinger::PlaybackThread::setMasterMute(bool muted)
1581 {
1582     Mutex::Autolock _l(mLock);
1583     // Don't apply master mute in SW if our HAL can do it for us.
1584     if (mOutput && mOutput->audioHwDev &&
1585         mOutput->audioHwDev->canSetMasterMute()) {
1586         mMasterMute = false;
1587     } else {
1588         mMasterMute = muted;
1589     }
1590 }
1591 
setStreamVolume(audio_stream_type_t stream,float value)1592 void AudioFlinger::PlaybackThread::setStreamVolume(audio_stream_type_t stream, float value)
1593 {
1594     Mutex::Autolock _l(mLock);
1595     mStreamTypes[stream].volume = value;
1596     broadcast_l();
1597 }
1598 
setStreamMute(audio_stream_type_t stream,bool muted)1599 void AudioFlinger::PlaybackThread::setStreamMute(audio_stream_type_t stream, bool muted)
1600 {
1601     Mutex::Autolock _l(mLock);
1602     mStreamTypes[stream].mute = muted;
1603     broadcast_l();
1604 }
1605 
streamVolume(audio_stream_type_t stream) const1606 float AudioFlinger::PlaybackThread::streamVolume(audio_stream_type_t stream) const
1607 {
1608     Mutex::Autolock _l(mLock);
1609     return mStreamTypes[stream].volume;
1610 }
1611 
1612 // addTrack_l() must be called with ThreadBase::mLock held
addTrack_l(const sp<Track> & track)1613 status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
1614 {
1615     status_t status = ALREADY_EXISTS;
1616 
1617     // set retry count for buffer fill
1618     track->mRetryCount = kMaxTrackStartupRetries;
1619     if (mActiveTracks.indexOf(track) < 0) {
1620         // the track is newly added, make sure it fills up all its
1621         // buffers before playing. This is to ensure the client will
1622         // effectively get the latency it requested.
1623         if (track->isExternalTrack()) {
1624             TrackBase::track_state state = track->mState;
1625             mLock.unlock();
1626             status = AudioSystem::startOutput(mId, track->streamType(),
1627                                               (audio_session_t)track->sessionId());
1628             mLock.lock();
1629             // abort track was stopped/paused while we released the lock
1630             if (state != track->mState) {
1631                 if (status == NO_ERROR) {
1632                     mLock.unlock();
1633                     AudioSystem::stopOutput(mId, track->streamType(),
1634                                             (audio_session_t)track->sessionId());
1635                     mLock.lock();
1636                 }
1637                 return INVALID_OPERATION;
1638             }
1639             // abort if start is rejected by audio policy manager
1640             if (status != NO_ERROR) {
1641                 return PERMISSION_DENIED;
1642             }
1643 #ifdef ADD_BATTERY_DATA
1644             // to track the speaker usage
1645             addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStart);
1646 #endif
1647         }
1648 
1649         track->mFillingUpStatus = track->sharedBuffer() != 0 ? Track::FS_FILLED : Track::FS_FILLING;
1650         track->mResetDone = false;
1651         track->mPresentationCompleteFrames = 0;
1652         mActiveTracks.add(track);
1653         mWakeLockUids.add(track->uid());
1654         mActiveTracksGeneration++;
1655         mLatestActiveTrack = track;
1656         sp<EffectChain> chain = getEffectChain_l(track->sessionId());
1657         if (chain != 0) {
1658             ALOGV("addTrack_l() starting track on chain %p for session %d", chain.get(),
1659                     track->sessionId());
1660             chain->incActiveTrackCnt();
1661         }
1662 
1663         status = NO_ERROR;
1664     }
1665 
1666     onAddNewTrack_l();
1667     return status;
1668 }
1669 
destroyTrack_l(const sp<Track> & track)1670 bool AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track)
1671 {
1672     track->terminate();
1673     // active tracks are removed by threadLoop()
1674     bool trackActive = (mActiveTracks.indexOf(track) >= 0);
1675     track->mState = TrackBase::STOPPED;
1676     if (!trackActive) {
1677         removeTrack_l(track);
1678     } else if (track->isFastTrack() || track->isOffloaded() || track->isDirect()) {
1679         track->mState = TrackBase::STOPPING_1;
1680     }
1681 
1682     return trackActive;
1683 }
1684 
removeTrack_l(const sp<Track> & track)1685 void AudioFlinger::PlaybackThread::removeTrack_l(const sp<Track>& track)
1686 {
1687     track->triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
1688     mTracks.remove(track);
1689     deleteTrackName_l(track->name());
1690     // redundant as track is about to be destroyed, for dumpsys only
1691     track->mName = -1;
1692     if (track->isFastTrack()) {
1693         int index = track->mFastIndex;
1694         ALOG_ASSERT(0 < index && index < (int)FastMixerState::kMaxFastTracks);
1695         ALOG_ASSERT(!(mFastTrackAvailMask & (1 << index)));
1696         mFastTrackAvailMask |= 1 << index;
1697         // redundant as track is about to be destroyed, for dumpsys only
1698         track->mFastIndex = -1;
1699     }
1700     sp<EffectChain> chain = getEffectChain_l(track->sessionId());
1701     if (chain != 0) {
1702         chain->decTrackCnt();
1703     }
1704 }
1705 
broadcast_l()1706 void AudioFlinger::PlaybackThread::broadcast_l()
1707 {
1708     // Thread could be blocked waiting for async
1709     // so signal it to handle state changes immediately
1710     // If threadLoop is currently unlocked a signal of mWaitWorkCV will
1711     // be lost so we also flag to prevent it blocking on mWaitWorkCV
1712     mSignalPending = true;
1713     mWaitWorkCV.broadcast();
1714 }
1715 
getParameters(const String8 & keys)1716 String8 AudioFlinger::PlaybackThread::getParameters(const String8& keys)
1717 {
1718     Mutex::Autolock _l(mLock);
1719     if (initCheck() != NO_ERROR) {
1720         return String8();
1721     }
1722 
1723     char *s = mOutput->stream->common.get_parameters(&mOutput->stream->common, keys.string());
1724     const String8 out_s8(s);
1725     free(s);
1726     return out_s8;
1727 }
1728 
audioConfigChanged(int event,int param)1729 void AudioFlinger::PlaybackThread::audioConfigChanged(int event, int param) {
1730     AudioSystem::OutputDescriptor desc;
1731     void *param2 = NULL;
1732 
1733     ALOGV("PlaybackThread::audioConfigChanged, thread %p, event %d, param %d", this, event,
1734             param);
1735 
1736     switch (event) {
1737     case AudioSystem::OUTPUT_OPENED:
1738     case AudioSystem::OUTPUT_CONFIG_CHANGED:
1739         desc.channelMask = mChannelMask;
1740         desc.samplingRate = mSampleRate;
1741         desc.format = mFormat;
1742         desc.frameCount = mNormalFrameCount; // FIXME see
1743                                              // AudioFlinger::frameCount(audio_io_handle_t)
1744         desc.latency = latency_l();
1745         param2 = &desc;
1746         break;
1747 
1748     case AudioSystem::STREAM_CONFIG_CHANGED:
1749         param2 = &param;
1750     case AudioSystem::OUTPUT_CLOSED:
1751     default:
1752         break;
1753     }
1754     mAudioFlinger->audioConfigChanged(event, mId, param2);
1755 }
1756 
writeCallback()1757 void AudioFlinger::PlaybackThread::writeCallback()
1758 {
1759     ALOG_ASSERT(mCallbackThread != 0);
1760     mCallbackThread->resetWriteBlocked();
1761 }
1762 
drainCallback()1763 void AudioFlinger::PlaybackThread::drainCallback()
1764 {
1765     ALOG_ASSERT(mCallbackThread != 0);
1766     mCallbackThread->resetDraining();
1767 }
1768 
resetWriteBlocked(uint32_t sequence)1769 void AudioFlinger::PlaybackThread::resetWriteBlocked(uint32_t sequence)
1770 {
1771     Mutex::Autolock _l(mLock);
1772     // reject out of sequence requests
1773     if ((mWriteAckSequence & 1) && (sequence == mWriteAckSequence)) {
1774         mWriteAckSequence &= ~1;
1775         mWaitWorkCV.signal();
1776     }
1777 }
1778 
resetDraining(uint32_t sequence)1779 void AudioFlinger::PlaybackThread::resetDraining(uint32_t sequence)
1780 {
1781     Mutex::Autolock _l(mLock);
1782     // reject out of sequence requests
1783     if ((mDrainSequence & 1) && (sequence == mDrainSequence)) {
1784         mDrainSequence &= ~1;
1785         mWaitWorkCV.signal();
1786     }
1787 }
1788 
1789 // static
asyncCallback(stream_callback_event_t event,void * param __unused,void * cookie)1790 int AudioFlinger::PlaybackThread::asyncCallback(stream_callback_event_t event,
1791                                                 void *param __unused,
1792                                                 void *cookie)
1793 {
1794     AudioFlinger::PlaybackThread *me = (AudioFlinger::PlaybackThread *)cookie;
1795     ALOGV("asyncCallback() event %d", event);
1796     switch (event) {
1797     case STREAM_CBK_EVENT_WRITE_READY:
1798         me->writeCallback();
1799         break;
1800     case STREAM_CBK_EVENT_DRAIN_READY:
1801         me->drainCallback();
1802         break;
1803     default:
1804         ALOGW("asyncCallback() unknown event %d", event);
1805         break;
1806     }
1807     return 0;
1808 }
1809 
readOutputParameters_l()1810 void AudioFlinger::PlaybackThread::readOutputParameters_l()
1811 {
1812     // unfortunately we have no way of recovering from errors here, hence the LOG_ALWAYS_FATAL
1813     mSampleRate = mOutput->stream->common.get_sample_rate(&mOutput->stream->common);
1814     mChannelMask = mOutput->stream->common.get_channels(&mOutput->stream->common);
1815     if (!audio_is_output_channel(mChannelMask)) {
1816         LOG_ALWAYS_FATAL("HAL channel mask %#x not valid for output", mChannelMask);
1817     }
1818     if ((mType == MIXER || mType == DUPLICATING)
1819             && !isValidPcmSinkChannelMask(mChannelMask)) {
1820         LOG_ALWAYS_FATAL("HAL channel mask %#x not supported for mixed output",
1821                 mChannelMask);
1822     }
1823     mChannelCount = audio_channel_count_from_out_mask(mChannelMask);
1824     mHALFormat = mOutput->stream->common.get_format(&mOutput->stream->common);
1825     mFormat = mHALFormat;
1826     if (!audio_is_valid_format(mFormat)) {
1827         LOG_ALWAYS_FATAL("HAL format %#x not valid for output", mFormat);
1828     }
1829     if ((mType == MIXER || mType == DUPLICATING)
1830             && !isValidPcmSinkFormat(mFormat)) {
1831         LOG_FATAL("HAL format %#x not supported for mixed output",
1832                 mFormat);
1833     }
1834     mFrameSize = audio_stream_out_frame_size(mOutput->stream);
1835     mBufferSize = mOutput->stream->common.get_buffer_size(&mOutput->stream->common);
1836     mFrameCount = mBufferSize / mFrameSize;
1837     if (mFrameCount & 15) {
1838         ALOGW("HAL output buffer size is %u frames but AudioMixer requires multiples of 16 frames",
1839                 mFrameCount);
1840     }
1841 
1842     if ((mOutput->flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING) &&
1843             (mOutput->stream->set_callback != NULL)) {
1844         if (mOutput->stream->set_callback(mOutput->stream,
1845                                       AudioFlinger::PlaybackThread::asyncCallback, this) == 0) {
1846             mUseAsyncWrite = true;
1847             mCallbackThread = new AudioFlinger::AsyncCallbackThread(this);
1848         }
1849     }
1850 
1851     mHwSupportsPause = false;
1852     if (mOutput->flags & AUDIO_OUTPUT_FLAG_DIRECT) {
1853         if (mOutput->stream->pause != NULL) {
1854             if (mOutput->stream->resume != NULL) {
1855                 mHwSupportsPause = true;
1856             } else {
1857                 ALOGW("direct output implements pause but not resume");
1858             }
1859         } else if (mOutput->stream->resume != NULL) {
1860             ALOGW("direct output implements resume but not pause");
1861         }
1862     }
1863 
1864     // Calculate size of normal sink buffer relative to the HAL output buffer size
1865     double multiplier = 1.0;
1866     if (mType == MIXER && (kUseFastMixer == FastMixer_Static ||
1867             kUseFastMixer == FastMixer_Dynamic)) {
1868         size_t minNormalFrameCount = (kMinNormalSinkBufferSizeMs * mSampleRate) / 1000;
1869         size_t maxNormalFrameCount = (kMaxNormalSinkBufferSizeMs * mSampleRate) / 1000;
1870         // round up minimum and round down maximum to nearest 16 frames to satisfy AudioMixer
1871         minNormalFrameCount = (minNormalFrameCount + 15) & ~15;
1872         maxNormalFrameCount = maxNormalFrameCount & ~15;
1873         if (maxNormalFrameCount < minNormalFrameCount) {
1874             maxNormalFrameCount = minNormalFrameCount;
1875         }
1876         multiplier = (double) minNormalFrameCount / (double) mFrameCount;
1877         if (multiplier <= 1.0) {
1878             multiplier = 1.0;
1879         } else if (multiplier <= 2.0) {
1880             if (2 * mFrameCount <= maxNormalFrameCount) {
1881                 multiplier = 2.0;
1882             } else {
1883                 multiplier = (double) maxNormalFrameCount / (double) mFrameCount;
1884             }
1885         } else {
1886             // prefer an even multiplier, for compatibility with doubling of fast tracks due to HAL
1887             // SRC (it would be unusual for the normal sink buffer size to not be a multiple of fast
1888             // track, but we sometimes have to do this to satisfy the maximum frame count
1889             // constraint)
1890             // FIXME this rounding up should not be done if no HAL SRC
1891             uint32_t truncMult = (uint32_t) multiplier;
1892             if ((truncMult & 1)) {
1893                 if ((truncMult + 1) * mFrameCount <= maxNormalFrameCount) {
1894                     ++truncMult;
1895                 }
1896             }
1897             multiplier = (double) truncMult;
1898         }
1899     }
1900     mNormalFrameCount = multiplier * mFrameCount;
1901     // round up to nearest 16 frames to satisfy AudioMixer
1902     if (mType == MIXER || mType == DUPLICATING) {
1903         mNormalFrameCount = (mNormalFrameCount + 15) & ~15;
1904     }
1905     ALOGI("HAL output buffer size %u frames, normal sink buffer size %u frames", mFrameCount,
1906             mNormalFrameCount);
1907 
1908     // mSinkBuffer is the sink buffer.  Size is always multiple-of-16 frames.
1909     // Originally this was int16_t[] array, need to remove legacy implications.
1910     free(mSinkBuffer);
1911     mSinkBuffer = NULL;
1912     // For sink buffer size, we use the frame size from the downstream sink to avoid problems
1913     // with non PCM formats for compressed music, e.g. AAC, and Offload threads.
1914     const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
1915     (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
1916 
1917     // We resize the mMixerBuffer according to the requirements of the sink buffer which
1918     // drives the output.
1919     free(mMixerBuffer);
1920     mMixerBuffer = NULL;
1921     if (mMixerBufferEnabled) {
1922         mMixerBufferFormat = AUDIO_FORMAT_PCM_FLOAT; // also valid: AUDIO_FORMAT_PCM_16_BIT.
1923         mMixerBufferSize = mNormalFrameCount * mChannelCount
1924                 * audio_bytes_per_sample(mMixerBufferFormat);
1925         (void)posix_memalign(&mMixerBuffer, 32, mMixerBufferSize);
1926     }
1927     free(mEffectBuffer);
1928     mEffectBuffer = NULL;
1929     if (mEffectBufferEnabled) {
1930         mEffectBufferFormat = AUDIO_FORMAT_PCM_16_BIT; // Note: Effects support 16b only
1931         mEffectBufferSize = mNormalFrameCount * mChannelCount
1932                 * audio_bytes_per_sample(mEffectBufferFormat);
1933         (void)posix_memalign(&mEffectBuffer, 32, mEffectBufferSize);
1934     }
1935 
1936     // force reconfiguration of effect chains and engines to take new buffer size and audio
1937     // parameters into account
1938     // Note that mLock is not held when readOutputParameters_l() is called from the constructor
1939     // but in this case nothing is done below as no audio sessions have effect yet so it doesn't
1940     // matter.
1941     // create a copy of mEffectChains as calling moveEffectChain_l() can reorder some effect chains
1942     Vector< sp<EffectChain> > effectChains = mEffectChains;
1943     for (size_t i = 0; i < effectChains.size(); i ++) {
1944         mAudioFlinger->moveEffectChain_l(effectChains[i]->sessionId(), this, this, false);
1945     }
1946 }
1947 
1948 
getRenderPosition(uint32_t * halFrames,uint32_t * dspFrames)1949 status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames)
1950 {
1951     if (halFrames == NULL || dspFrames == NULL) {
1952         return BAD_VALUE;
1953     }
1954     Mutex::Autolock _l(mLock);
1955     if (initCheck() != NO_ERROR) {
1956         return INVALID_OPERATION;
1957     }
1958     size_t framesWritten = mBytesWritten / mFrameSize;
1959     *halFrames = framesWritten;
1960 
1961     if (isSuspended()) {
1962         // return an estimation of rendered frames when the output is suspended
1963         size_t latencyFrames = (latency_l() * mSampleRate) / 1000;
1964         *dspFrames = framesWritten >= latencyFrames ? framesWritten - latencyFrames : 0;
1965         return NO_ERROR;
1966     } else {
1967         status_t status;
1968         uint32_t frames;
1969         status = mOutput->stream->get_render_position(mOutput->stream, &frames);
1970         *dspFrames = (size_t)frames;
1971         return status;
1972     }
1973 }
1974 
hasAudioSession(int sessionId) const1975 uint32_t AudioFlinger::PlaybackThread::hasAudioSession(int sessionId) const
1976 {
1977     Mutex::Autolock _l(mLock);
1978     uint32_t result = 0;
1979     if (getEffectChain_l(sessionId) != 0) {
1980         result = EFFECT_SESSION;
1981     }
1982 
1983     for (size_t i = 0; i < mTracks.size(); ++i) {
1984         sp<Track> track = mTracks[i];
1985         if (sessionId == track->sessionId() && !track->isInvalid()) {
1986             result |= TRACK_SESSION;
1987             break;
1988         }
1989     }
1990 
1991     return result;
1992 }
1993 
getStrategyForSession_l(int sessionId)1994 uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(int sessionId)
1995 {
1996     // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
1997     // it is moved to correct output by audio policy manager when A2DP is connected or disconnected
1998     if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
1999         return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
2000     }
2001     for (size_t i = 0; i < mTracks.size(); i++) {
2002         sp<Track> track = mTracks[i];
2003         if (sessionId == track->sessionId() && !track->isInvalid()) {
2004             return AudioSystem::getStrategyForStream(track->streamType());
2005         }
2006     }
2007     return AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC);
2008 }
2009 
2010 
getOutput() const2011 AudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::getOutput() const
2012 {
2013     Mutex::Autolock _l(mLock);
2014     return mOutput;
2015 }
2016 
clearOutput()2017 AudioFlinger::AudioStreamOut* AudioFlinger::PlaybackThread::clearOutput()
2018 {
2019     Mutex::Autolock _l(mLock);
2020     AudioStreamOut *output = mOutput;
2021     mOutput = NULL;
2022     // FIXME FastMixer might also have a raw ptr to mOutputSink;
2023     //       must push a NULL and wait for ack
2024     mOutputSink.clear();
2025     mPipeSink.clear();
2026     mNormalSink.clear();
2027     return output;
2028 }
2029 
2030 // this method must always be called either with ThreadBase mLock held or inside the thread loop
stream() const2031 audio_stream_t* AudioFlinger::PlaybackThread::stream() const
2032 {
2033     if (mOutput == NULL) {
2034         return NULL;
2035     }
2036     return &mOutput->stream->common;
2037 }
2038 
activeSleepTimeUs() const2039 uint32_t AudioFlinger::PlaybackThread::activeSleepTimeUs() const
2040 {
2041     return (uint32_t)((uint32_t)((mNormalFrameCount * 1000) / mSampleRate) * 1000);
2042 }
2043 
setSyncEvent(const sp<SyncEvent> & event)2044 status_t AudioFlinger::PlaybackThread::setSyncEvent(const sp<SyncEvent>& event)
2045 {
2046     if (!isValidSyncEvent(event)) {
2047         return BAD_VALUE;
2048     }
2049 
2050     Mutex::Autolock _l(mLock);
2051 
2052     for (size_t i = 0; i < mTracks.size(); ++i) {
2053         sp<Track> track = mTracks[i];
2054         if (event->triggerSession() == track->sessionId()) {
2055             (void) track->setSyncEvent(event);
2056             return NO_ERROR;
2057         }
2058     }
2059 
2060     return NAME_NOT_FOUND;
2061 }
2062 
isValidSyncEvent(const sp<SyncEvent> & event) const2063 bool AudioFlinger::PlaybackThread::isValidSyncEvent(const sp<SyncEvent>& event) const
2064 {
2065     return event->type() == AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE;
2066 }
2067 
threadLoop_removeTracks(const Vector<sp<Track>> & tracksToRemove)2068 void AudioFlinger::PlaybackThread::threadLoop_removeTracks(
2069         const Vector< sp<Track> >& tracksToRemove)
2070 {
2071     size_t count = tracksToRemove.size();
2072     if (count > 0) {
2073         for (size_t i = 0 ; i < count ; i++) {
2074             const sp<Track>& track = tracksToRemove.itemAt(i);
2075             if (track->isExternalTrack()) {
2076                 AudioSystem::stopOutput(mId, track->streamType(),
2077                                         (audio_session_t)track->sessionId());
2078 #ifdef ADD_BATTERY_DATA
2079                 // to track the speaker usage
2080                 addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop);
2081 #endif
2082                 if (track->isTerminated()) {
2083                     AudioSystem::releaseOutput(mId, track->streamType(),
2084                                                (audio_session_t)track->sessionId());
2085                 }
2086             }
2087         }
2088     }
2089 }
2090 
checkSilentMode_l()2091 void AudioFlinger::PlaybackThread::checkSilentMode_l()
2092 {
2093     if (!mMasterMute) {
2094         char value[PROPERTY_VALUE_MAX];
2095         if (property_get("ro.audio.silent", value, "0") > 0) {
2096             char *endptr;
2097             unsigned long ul = strtoul(value, &endptr, 0);
2098             if (*endptr == '\0' && ul != 0) {
2099                 ALOGD("Silence is golden");
2100                 // The setprop command will not allow a property to be changed after
2101                 // the first time it is set, so we don't have to worry about un-muting.
2102                 setMasterMute_l(true);
2103             }
2104         }
2105     }
2106 }
2107 
2108 // shared by MIXER and DIRECT, overridden by DUPLICATING
threadLoop_write()2109 ssize_t AudioFlinger::PlaybackThread::threadLoop_write()
2110 {
2111     // FIXME rewrite to reduce number of system calls
2112     mLastWriteTime = systemTime();
2113     mInWrite = true;
2114     ssize_t bytesWritten;
2115     const size_t offset = mCurrentWriteLength - mBytesRemaining;
2116 
2117     // If an NBAIO sink is present, use it to write the normal mixer's submix
2118     if (mNormalSink != 0) {
2119 
2120         const size_t count = mBytesRemaining / mFrameSize;
2121 
2122         ATRACE_BEGIN("write");
2123         // update the setpoint when AudioFlinger::mScreenState changes
2124         uint32_t screenState = AudioFlinger::mScreenState;
2125         if (screenState != mScreenState) {
2126             mScreenState = screenState;
2127             MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
2128             if (pipe != NULL) {
2129                 pipe->setAvgFrames((mScreenState & 1) ?
2130                         (pipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
2131             }
2132         }
2133         ssize_t framesWritten = mNormalSink->write((char *)mSinkBuffer + offset, count);
2134         ATRACE_END();
2135         if (framesWritten > 0) {
2136             bytesWritten = framesWritten * mFrameSize;
2137         } else {
2138             bytesWritten = framesWritten;
2139         }
2140         status_t status = mNormalSink->getTimestamp(mLatchD.mTimestamp);
2141         if (status == NO_ERROR) {
2142             size_t totalFramesWritten = mNormalSink->framesWritten();
2143             if (totalFramesWritten >= mLatchD.mTimestamp.mPosition) {
2144                 mLatchD.mUnpresentedFrames = totalFramesWritten - mLatchD.mTimestamp.mPosition;
2145                 // mLatchD.mFramesReleased is set immediately before D is clocked into Q
2146                 mLatchDValid = true;
2147             }
2148         }
2149     // otherwise use the HAL / AudioStreamOut directly
2150     } else {
2151         // Direct output and offload threads
2152 
2153         if (mUseAsyncWrite) {
2154             ALOGW_IF(mWriteAckSequence & 1, "threadLoop_write(): out of sequence write request");
2155             mWriteAckSequence += 2;
2156             mWriteAckSequence |= 1;
2157             ALOG_ASSERT(mCallbackThread != 0);
2158             mCallbackThread->setWriteBlocked(mWriteAckSequence);
2159         }
2160         // FIXME We should have an implementation of timestamps for direct output threads.
2161         // They are used e.g for multichannel PCM playback over HDMI.
2162         bytesWritten = mOutput->stream->write(mOutput->stream,
2163                                                    (char *)mSinkBuffer + offset, mBytesRemaining);
2164         if (mUseAsyncWrite &&
2165                 ((bytesWritten < 0) || (bytesWritten == (ssize_t)mBytesRemaining))) {
2166             // do not wait for async callback in case of error of full write
2167             mWriteAckSequence &= ~1;
2168             ALOG_ASSERT(mCallbackThread != 0);
2169             mCallbackThread->setWriteBlocked(mWriteAckSequence);
2170         }
2171     }
2172 
2173     mNumWrites++;
2174     mInWrite = false;
2175     mStandby = false;
2176     return bytesWritten;
2177 }
2178 
threadLoop_drain()2179 void AudioFlinger::PlaybackThread::threadLoop_drain()
2180 {
2181     if (mOutput->stream->drain) {
2182         ALOGV("draining %s", (mMixerStatus == MIXER_DRAIN_TRACK) ? "early" : "full");
2183         if (mUseAsyncWrite) {
2184             ALOGW_IF(mDrainSequence & 1, "threadLoop_drain(): out of sequence drain request");
2185             mDrainSequence |= 1;
2186             ALOG_ASSERT(mCallbackThread != 0);
2187             mCallbackThread->setDraining(mDrainSequence);
2188         }
2189         mOutput->stream->drain(mOutput->stream,
2190             (mMixerStatus == MIXER_DRAIN_TRACK) ? AUDIO_DRAIN_EARLY_NOTIFY
2191                                                 : AUDIO_DRAIN_ALL);
2192     }
2193 }
2194 
threadLoop_exit()2195 void AudioFlinger::PlaybackThread::threadLoop_exit()
2196 {
2197     {
2198         Mutex::Autolock _l(mLock);
2199         for (size_t i = 0; i < mTracks.size(); i++) {
2200             sp<Track> track = mTracks[i];
2201             track->invalidate();
2202         }
2203     }
2204 }
2205 
2206 /*
2207 The derived values that are cached:
2208  - mSinkBufferSize from frame count * frame size
2209  - activeSleepTime from activeSleepTimeUs()
2210  - idleSleepTime from idleSleepTimeUs()
2211  - standbyDelay from mActiveSleepTimeUs (DIRECT only)
2212  - maxPeriod from frame count and sample rate (MIXER only)
2213 
2214 The parameters that affect these derived values are:
2215  - frame count
2216  - frame size
2217  - sample rate
2218  - device type: A2DP or not
2219  - device latency
2220  - format: PCM or not
2221  - active sleep time
2222  - idle sleep time
2223 */
2224 
cacheParameters_l()2225 void AudioFlinger::PlaybackThread::cacheParameters_l()
2226 {
2227     mSinkBufferSize = mNormalFrameCount * mFrameSize;
2228     activeSleepTime = activeSleepTimeUs();
2229     idleSleepTime = idleSleepTimeUs();
2230 }
2231 
invalidateTracks(audio_stream_type_t streamType)2232 void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamType)
2233 {
2234     ALOGV("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d",
2235             this,  streamType, mTracks.size());
2236     Mutex::Autolock _l(mLock);
2237 
2238     size_t size = mTracks.size();
2239     for (size_t i = 0; i < size; i++) {
2240         sp<Track> t = mTracks[i];
2241         if (t->streamType() == streamType) {
2242             t->invalidate();
2243         }
2244     }
2245 }
2246 
addEffectChain_l(const sp<EffectChain> & chain)2247 status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& chain)
2248 {
2249     int session = chain->sessionId();
2250     int16_t* buffer = reinterpret_cast<int16_t*>(mEffectBufferEnabled
2251             ? mEffectBuffer : mSinkBuffer);
2252     bool ownsBuffer = false;
2253 
2254     ALOGV("addEffectChain_l() %p on thread %p for session %d", chain.get(), this, session);
2255     if (session > 0) {
2256         // Only one effect chain can be present in direct output thread and it uses
2257         // the sink buffer as input
2258         if (mType != DIRECT) {
2259             size_t numSamples = mNormalFrameCount * mChannelCount;
2260             buffer = new int16_t[numSamples];
2261             memset(buffer, 0, numSamples * sizeof(int16_t));
2262             ALOGV("addEffectChain_l() creating new input buffer %p session %d", buffer, session);
2263             ownsBuffer = true;
2264         }
2265 
2266         // Attach all tracks with same session ID to this chain.
2267         for (size_t i = 0; i < mTracks.size(); ++i) {
2268             sp<Track> track = mTracks[i];
2269             if (session == track->sessionId()) {
2270                 ALOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(),
2271                         buffer);
2272                 track->setMainBuffer(buffer);
2273                 chain->incTrackCnt();
2274             }
2275         }
2276 
2277         // indicate all active tracks in the chain
2278         for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
2279             sp<Track> track = mActiveTracks[i].promote();
2280             if (track == 0) {
2281                 continue;
2282             }
2283             if (session == track->sessionId()) {
2284                 ALOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
2285                 chain->incActiveTrackCnt();
2286             }
2287         }
2288     }
2289     chain->setThread(this);
2290     chain->setInBuffer(buffer, ownsBuffer);
2291     chain->setOutBuffer(reinterpret_cast<int16_t*>(mEffectBufferEnabled
2292             ? mEffectBuffer : mSinkBuffer));
2293     // Effect chain for session AUDIO_SESSION_OUTPUT_STAGE is inserted at end of effect
2294     // chains list in order to be processed last as it contains output stage effects
2295     // Effect chain for session AUDIO_SESSION_OUTPUT_MIX is inserted before
2296     // session AUDIO_SESSION_OUTPUT_STAGE to be processed
2297     // after track specific effects and before output stage
2298     // It is therefore mandatory that AUDIO_SESSION_OUTPUT_MIX == 0 and
2299     // that AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX
2300     // Effect chain for other sessions are inserted at beginning of effect
2301     // chains list to be processed before output mix effects. Relative order between other
2302     // sessions is not important
2303     size_t size = mEffectChains.size();
2304     size_t i = 0;
2305     for (i = 0; i < size; i++) {
2306         if (mEffectChains[i]->sessionId() < session) {
2307             break;
2308         }
2309     }
2310     mEffectChains.insertAt(chain, i);
2311     checkSuspendOnAddEffectChain_l(chain);
2312 
2313     return NO_ERROR;
2314 }
2315 
removeEffectChain_l(const sp<EffectChain> & chain)2316 size_t AudioFlinger::PlaybackThread::removeEffectChain_l(const sp<EffectChain>& chain)
2317 {
2318     int session = chain->sessionId();
2319 
2320     ALOGV("removeEffectChain_l() %p from thread %p for session %d", chain.get(), this, session);
2321 
2322     for (size_t i = 0; i < mEffectChains.size(); i++) {
2323         if (chain == mEffectChains[i]) {
2324             mEffectChains.removeAt(i);
2325             // detach all active tracks from the chain
2326             for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
2327                 sp<Track> track = mActiveTracks[i].promote();
2328                 if (track == 0) {
2329                     continue;
2330                 }
2331                 if (session == track->sessionId()) {
2332                     ALOGV("removeEffectChain_l(): stopping track on chain %p for session Id: %d",
2333                             chain.get(), session);
2334                     chain->decActiveTrackCnt();
2335                 }
2336             }
2337 
2338             // detach all tracks with same session ID from this chain
2339             for (size_t i = 0; i < mTracks.size(); ++i) {
2340                 sp<Track> track = mTracks[i];
2341                 if (session == track->sessionId()) {
2342                     track->setMainBuffer(reinterpret_cast<int16_t*>(mSinkBuffer));
2343                     chain->decTrackCnt();
2344                 }
2345             }
2346             break;
2347         }
2348     }
2349     return mEffectChains.size();
2350 }
2351 
attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> track,int EffectId)2352 status_t AudioFlinger::PlaybackThread::attachAuxEffect(
2353         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
2354 {
2355     Mutex::Autolock _l(mLock);
2356     return attachAuxEffect_l(track, EffectId);
2357 }
2358 
attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> track,int EffectId)2359 status_t AudioFlinger::PlaybackThread::attachAuxEffect_l(
2360         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
2361 {
2362     status_t status = NO_ERROR;
2363 
2364     if (EffectId == 0) {
2365         track->setAuxBuffer(0, NULL);
2366     } else {
2367         // Auxiliary effects are always in audio session AUDIO_SESSION_OUTPUT_MIX
2368         sp<EffectModule> effect = getEffect_l(AUDIO_SESSION_OUTPUT_MIX, EffectId);
2369         if (effect != 0) {
2370             if ((effect->desc().flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
2371                 track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
2372             } else {
2373                 status = INVALID_OPERATION;
2374             }
2375         } else {
2376             status = BAD_VALUE;
2377         }
2378     }
2379     return status;
2380 }
2381 
detachAuxEffect_l(int effectId)2382 void AudioFlinger::PlaybackThread::detachAuxEffect_l(int effectId)
2383 {
2384     for (size_t i = 0; i < mTracks.size(); ++i) {
2385         sp<Track> track = mTracks[i];
2386         if (track->auxEffectId() == effectId) {
2387             attachAuxEffect_l(track, 0);
2388         }
2389     }
2390 }
2391 
threadLoop()2392 bool AudioFlinger::PlaybackThread::threadLoop()
2393 {
2394     Vector< sp<Track> > tracksToRemove;
2395 
2396     standbyTime = systemTime();
2397 
2398     // MIXER
2399     nsecs_t lastWarning = 0;
2400 
2401     // DUPLICATING
2402     // FIXME could this be made local to while loop?
2403     writeFrames = 0;
2404 
2405     int lastGeneration = 0;
2406 
2407     cacheParameters_l();
2408     sleepTime = idleSleepTime;
2409 
2410     if (mType == MIXER) {
2411         sleepTimeShift = 0;
2412     }
2413 
2414     CpuStats cpuStats;
2415     const String8 myName(String8::format("thread %p type %d TID %d", this, mType, gettid()));
2416 
2417     acquireWakeLock();
2418 
2419     // mNBLogWriter->log can only be called while thread mutex mLock is held.
2420     // So if you need to log when mutex is unlocked, set logString to a non-NULL string,
2421     // and then that string will be logged at the next convenient opportunity.
2422     const char *logString = NULL;
2423 
2424     checkSilentMode_l();
2425 
2426     while (!exitPending())
2427     {
2428         cpuStats.sample(myName);
2429 
2430         Vector< sp<EffectChain> > effectChains;
2431 
2432         { // scope for mLock
2433 
2434             Mutex::Autolock _l(mLock);
2435 
2436             processConfigEvents_l();
2437 
2438             if (logString != NULL) {
2439                 mNBLogWriter->logTimestamp();
2440                 mNBLogWriter->log(logString);
2441                 logString = NULL;
2442             }
2443 
2444             // Gather the framesReleased counters for all active tracks,
2445             // and latch them atomically with the timestamp.
2446             // FIXME We're using raw pointers as indices. A unique track ID would be a better index.
2447             mLatchD.mFramesReleased.clear();
2448             size_t size = mActiveTracks.size();
2449             for (size_t i = 0; i < size; i++) {
2450                 sp<Track> t = mActiveTracks[i].promote();
2451                 if (t != 0) {
2452                     mLatchD.mFramesReleased.add(t.get(),
2453                             t->mAudioTrackServerProxy->framesReleased());
2454                 }
2455             }
2456             if (mLatchDValid) {
2457                 mLatchQ = mLatchD;
2458                 mLatchDValid = false;
2459                 mLatchQValid = true;
2460             }
2461 
2462             saveOutputTracks();
2463             if (mSignalPending) {
2464                 // A signal was raised while we were unlocked
2465                 mSignalPending = false;
2466             } else if (waitingAsyncCallback_l()) {
2467                 if (exitPending()) {
2468                     break;
2469                 }
2470                 releaseWakeLock_l();
2471                 mWakeLockUids.clear();
2472                 mActiveTracksGeneration++;
2473                 ALOGV("wait async completion");
2474                 mWaitWorkCV.wait(mLock);
2475                 ALOGV("async completion/wake");
2476                 acquireWakeLock_l();
2477                 standbyTime = systemTime() + standbyDelay;
2478                 sleepTime = 0;
2479 
2480                 continue;
2481             }
2482             if ((!mActiveTracks.size() && systemTime() > standbyTime) ||
2483                                    isSuspended()) {
2484                 // put audio hardware into standby after short delay
2485                 if (shouldStandby_l()) {
2486 
2487                     threadLoop_standby();
2488 
2489                     mStandby = true;
2490                 }
2491 
2492                 if (!mActiveTracks.size() && mConfigEvents.isEmpty()) {
2493                     // we're about to wait, flush the binder command buffer
2494                     IPCThreadState::self()->flushCommands();
2495 
2496                     clearOutputTracks();
2497 
2498                     if (exitPending()) {
2499                         break;
2500                     }
2501 
2502                     releaseWakeLock_l();
2503                     mWakeLockUids.clear();
2504                     mActiveTracksGeneration++;
2505                     // wait until we have something to do...
2506                     ALOGV("%s going to sleep", myName.string());
2507                     mWaitWorkCV.wait(mLock);
2508                     ALOGV("%s waking up", myName.string());
2509                     acquireWakeLock_l();
2510 
2511                     mMixerStatus = MIXER_IDLE;
2512                     mMixerStatusIgnoringFastTracks = MIXER_IDLE;
2513                     mBytesWritten = 0;
2514                     mBytesRemaining = 0;
2515                     checkSilentMode_l();
2516 
2517                     standbyTime = systemTime() + standbyDelay;
2518                     sleepTime = idleSleepTime;
2519                     if (mType == MIXER) {
2520                         sleepTimeShift = 0;
2521                     }
2522 
2523                     continue;
2524                 }
2525             }
2526             // mMixerStatusIgnoringFastTracks is also updated internally
2527             mMixerStatus = prepareTracks_l(&tracksToRemove);
2528 
2529             // compare with previously applied list
2530             if (lastGeneration != mActiveTracksGeneration) {
2531                 // update wakelock
2532                 updateWakeLockUids_l(mWakeLockUids);
2533                 lastGeneration = mActiveTracksGeneration;
2534             }
2535 
2536             // prevent any changes in effect chain list and in each effect chain
2537             // during mixing and effect process as the audio buffers could be deleted
2538             // or modified if an effect is created or deleted
2539             lockEffectChains_l(effectChains);
2540         } // mLock scope ends
2541 
2542         if (mBytesRemaining == 0) {
2543             mCurrentWriteLength = 0;
2544             if (mMixerStatus == MIXER_TRACKS_READY) {
2545                 // threadLoop_mix() sets mCurrentWriteLength
2546                 threadLoop_mix();
2547             } else if ((mMixerStatus != MIXER_DRAIN_TRACK)
2548                         && (mMixerStatus != MIXER_DRAIN_ALL)) {
2549                 // threadLoop_sleepTime sets sleepTime to 0 if data
2550                 // must be written to HAL
2551                 threadLoop_sleepTime();
2552                 if (sleepTime == 0) {
2553                     mCurrentWriteLength = mSinkBufferSize;
2554                 }
2555             }
2556             // Either threadLoop_mix() or threadLoop_sleepTime() should have set
2557             // mMixerBuffer with data if mMixerBufferValid is true and sleepTime == 0.
2558             // Merge mMixerBuffer data into mEffectBuffer (if any effects are valid)
2559             // or mSinkBuffer (if there are no effects).
2560             //
2561             // This is done pre-effects computation; if effects change to
2562             // support higher precision, this needs to move.
2563             //
2564             // mMixerBufferValid is only set true by MixerThread::prepareTracks_l().
2565             // TODO use sleepTime == 0 as an additional condition.
2566             if (mMixerBufferValid) {
2567                 void *buffer = mEffectBufferValid ? mEffectBuffer : mSinkBuffer;
2568                 audio_format_t format = mEffectBufferValid ? mEffectBufferFormat : mFormat;
2569 
2570                 memcpy_by_audio_format(buffer, format, mMixerBuffer, mMixerBufferFormat,
2571                         mNormalFrameCount * mChannelCount);
2572             }
2573 
2574             mBytesRemaining = mCurrentWriteLength;
2575             if (isSuspended()) {
2576                 sleepTime = suspendSleepTimeUs();
2577                 // simulate write to HAL when suspended
2578                 mBytesWritten += mSinkBufferSize;
2579                 mBytesRemaining = 0;
2580             }
2581 
2582             // only process effects if we're going to write
2583             if (sleepTime == 0 && mType != OFFLOAD) {
2584                 for (size_t i = 0; i < effectChains.size(); i ++) {
2585                     effectChains[i]->process_l();
2586                 }
2587             }
2588         }
2589         // Process effect chains for offloaded thread even if no audio
2590         // was read from audio track: process only updates effect state
2591         // and thus does have to be synchronized with audio writes but may have
2592         // to be called while waiting for async write callback
2593         if (mType == OFFLOAD) {
2594             for (size_t i = 0; i < effectChains.size(); i ++) {
2595                 effectChains[i]->process_l();
2596             }
2597         }
2598 
2599         // Only if the Effects buffer is enabled and there is data in the
2600         // Effects buffer (buffer valid), we need to
2601         // copy into the sink buffer.
2602         // TODO use sleepTime == 0 as an additional condition.
2603         if (mEffectBufferValid) {
2604             //ALOGV("writing effect buffer to sink buffer format %#x", mFormat);
2605             memcpy_by_audio_format(mSinkBuffer, mFormat, mEffectBuffer, mEffectBufferFormat,
2606                     mNormalFrameCount * mChannelCount);
2607         }
2608 
2609         // enable changes in effect chain
2610         unlockEffectChains(effectChains);
2611 
2612         if (!waitingAsyncCallback()) {
2613             // sleepTime == 0 means we must write to audio hardware
2614             if (sleepTime == 0) {
2615                 if (mBytesRemaining) {
2616                     ssize_t ret = threadLoop_write();
2617                     if (ret < 0) {
2618                         mBytesRemaining = 0;
2619                     } else {
2620                         mBytesWritten += ret;
2621                         mBytesRemaining -= ret;
2622                     }
2623                 } else if ((mMixerStatus == MIXER_DRAIN_TRACK) ||
2624                         (mMixerStatus == MIXER_DRAIN_ALL)) {
2625                     threadLoop_drain();
2626                 }
2627                 if (mType == MIXER) {
2628                     // write blocked detection
2629                     nsecs_t now = systemTime();
2630                     nsecs_t delta = now - mLastWriteTime;
2631                     if (!mStandby && delta > maxPeriod) {
2632                         mNumDelayedWrites++;
2633                         if ((now - lastWarning) > kWarningThrottleNs) {
2634                             ATRACE_NAME("underrun");
2635                             ALOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
2636                                     ns2ms(delta), mNumDelayedWrites, this);
2637                             lastWarning = now;
2638                         }
2639                     }
2640                 }
2641 
2642             } else {
2643                 usleep(sleepTime);
2644             }
2645         }
2646 
2647         // Finally let go of removed track(s), without the lock held
2648         // since we can't guarantee the destructors won't acquire that
2649         // same lock.  This will also mutate and push a new fast mixer state.
2650         threadLoop_removeTracks(tracksToRemove);
2651         tracksToRemove.clear();
2652 
2653         // FIXME I don't understand the need for this here;
2654         //       it was in the original code but maybe the
2655         //       assignment in saveOutputTracks() makes this unnecessary?
2656         clearOutputTracks();
2657 
2658         // Effect chains will be actually deleted here if they were removed from
2659         // mEffectChains list during mixing or effects processing
2660         effectChains.clear();
2661 
2662         // FIXME Note that the above .clear() is no longer necessary since effectChains
2663         // is now local to this block, but will keep it for now (at least until merge done).
2664     }
2665 
2666     threadLoop_exit();
2667 
2668     if (!mStandby) {
2669         threadLoop_standby();
2670         mStandby = true;
2671     }
2672 
2673     releaseWakeLock();
2674     mWakeLockUids.clear();
2675     mActiveTracksGeneration++;
2676 
2677     ALOGV("Thread %p type %d exiting", this, mType);
2678     return false;
2679 }
2680 
2681 // removeTracks_l() must be called with ThreadBase::mLock held
removeTracks_l(const Vector<sp<Track>> & tracksToRemove)2682 void AudioFlinger::PlaybackThread::removeTracks_l(const Vector< sp<Track> >& tracksToRemove)
2683 {
2684     size_t count = tracksToRemove.size();
2685     if (count > 0) {
2686         for (size_t i=0 ; i<count ; i++) {
2687             const sp<Track>& track = tracksToRemove.itemAt(i);
2688             mActiveTracks.remove(track);
2689             mWakeLockUids.remove(track->uid());
2690             mActiveTracksGeneration++;
2691             ALOGV("removeTracks_l removing track on session %d", track->sessionId());
2692             sp<EffectChain> chain = getEffectChain_l(track->sessionId());
2693             if (chain != 0) {
2694                 ALOGV("stopping track on chain %p for session Id: %d", chain.get(),
2695                         track->sessionId());
2696                 chain->decActiveTrackCnt();
2697             }
2698             if (track->isTerminated()) {
2699                 removeTrack_l(track);
2700             }
2701         }
2702     }
2703 
2704 }
2705 
getTimestamp_l(AudioTimestamp & timestamp)2706 status_t AudioFlinger::PlaybackThread::getTimestamp_l(AudioTimestamp& timestamp)
2707 {
2708     if (mNormalSink != 0) {
2709         return mNormalSink->getTimestamp(timestamp);
2710     }
2711     if ((mType == OFFLOAD || mType == DIRECT)
2712             && mOutput != NULL && mOutput->stream->get_presentation_position) {
2713         uint64_t position64;
2714         int ret = mOutput->stream->get_presentation_position(
2715                                                 mOutput->stream, &position64, &timestamp.mTime);
2716         if (ret == 0) {
2717             timestamp.mPosition = (uint32_t)position64;
2718             return NO_ERROR;
2719         }
2720     }
2721     return INVALID_OPERATION;
2722 }
2723 
createAudioPatch_l(const struct audio_patch * patch,audio_patch_handle_t * handle)2724 status_t AudioFlinger::PlaybackThread::createAudioPatch_l(const struct audio_patch *patch,
2725                                                           audio_patch_handle_t *handle)
2726 {
2727     status_t status = NO_ERROR;
2728     if (mOutput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
2729         // store new device and send to effects
2730         audio_devices_t type = AUDIO_DEVICE_NONE;
2731         for (unsigned int i = 0; i < patch->num_sinks; i++) {
2732             type |= patch->sinks[i].ext.device.type;
2733         }
2734         mOutDevice = type;
2735         for (size_t i = 0; i < mEffectChains.size(); i++) {
2736             mEffectChains[i]->setDevice_l(mOutDevice);
2737         }
2738 
2739         audio_hw_device_t *hwDevice = mOutput->audioHwDev->hwDevice();
2740         status = hwDevice->create_audio_patch(hwDevice,
2741                                                patch->num_sources,
2742                                                patch->sources,
2743                                                patch->num_sinks,
2744                                                patch->sinks,
2745                                                handle);
2746     } else {
2747         ALOG_ASSERT(false, "createAudioPatch_l() called on a pre 3.0 HAL");
2748     }
2749     return status;
2750 }
2751 
releaseAudioPatch_l(const audio_patch_handle_t handle)2752 status_t AudioFlinger::PlaybackThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
2753 {
2754     status_t status = NO_ERROR;
2755     if (mOutput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
2756         audio_hw_device_t *hwDevice = mOutput->audioHwDev->hwDevice();
2757         status = hwDevice->release_audio_patch(hwDevice, handle);
2758     } else {
2759         ALOG_ASSERT(false, "releaseAudioPatch_l() called on a pre 3.0 HAL");
2760     }
2761     return status;
2762 }
2763 
addPatchTrack(const sp<PatchTrack> & track)2764 void AudioFlinger::PlaybackThread::addPatchTrack(const sp<PatchTrack>& track)
2765 {
2766     Mutex::Autolock _l(mLock);
2767     mTracks.add(track);
2768 }
2769 
deletePatchTrack(const sp<PatchTrack> & track)2770 void AudioFlinger::PlaybackThread::deletePatchTrack(const sp<PatchTrack>& track)
2771 {
2772     Mutex::Autolock _l(mLock);
2773     destroyTrack_l(track);
2774 }
2775 
getAudioPortConfig(struct audio_port_config * config)2776 void AudioFlinger::PlaybackThread::getAudioPortConfig(struct audio_port_config *config)
2777 {
2778     ThreadBase::getAudioPortConfig(config);
2779     config->role = AUDIO_PORT_ROLE_SOURCE;
2780     config->ext.mix.hw_module = mOutput->audioHwDev->handle();
2781     config->ext.mix.usecase.stream = AUDIO_STREAM_DEFAULT;
2782 }
2783 
2784 // ----------------------------------------------------------------------------
2785 
MixerThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,audio_devices_t device,type_t type)2786 AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
2787         audio_io_handle_t id, audio_devices_t device, type_t type)
2788     :   PlaybackThread(audioFlinger, output, id, device, type),
2789         // mAudioMixer below
2790         // mFastMixer below
2791         mFastMixerFutex(0)
2792         // mOutputSink below
2793         // mPipeSink below
2794         // mNormalSink below
2795 {
2796     ALOGV("MixerThread() id=%d device=%#x type=%d", id, device, type);
2797     ALOGV("mSampleRate=%u, mChannelMask=%#x, mChannelCount=%u, mFormat=%d, mFrameSize=%u, "
2798             "mFrameCount=%d, mNormalFrameCount=%d",
2799             mSampleRate, mChannelMask, mChannelCount, mFormat, mFrameSize, mFrameCount,
2800             mNormalFrameCount);
2801     mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
2802 
2803     // create an NBAIO sink for the HAL output stream, and negotiate
2804     mOutputSink = new AudioStreamOutSink(output->stream);
2805     size_t numCounterOffers = 0;
2806     const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
2807     ssize_t index = mOutputSink->negotiate(offers, 1, NULL, numCounterOffers);
2808     ALOG_ASSERT(index == 0);
2809 
2810     // initialize fast mixer depending on configuration
2811     bool initFastMixer;
2812     switch (kUseFastMixer) {
2813     case FastMixer_Never:
2814         initFastMixer = false;
2815         break;
2816     case FastMixer_Always:
2817         initFastMixer = true;
2818         break;
2819     case FastMixer_Static:
2820     case FastMixer_Dynamic:
2821         initFastMixer = mFrameCount < mNormalFrameCount;
2822         break;
2823     }
2824     if (initFastMixer) {
2825         audio_format_t fastMixerFormat;
2826         if (mMixerBufferEnabled && mEffectBufferEnabled) {
2827             fastMixerFormat = AUDIO_FORMAT_PCM_FLOAT;
2828         } else {
2829             fastMixerFormat = AUDIO_FORMAT_PCM_16_BIT;
2830         }
2831         if (mFormat != fastMixerFormat) {
2832             // change our Sink format to accept our intermediate precision
2833             mFormat = fastMixerFormat;
2834             free(mSinkBuffer);
2835             mFrameSize = mChannelCount * audio_bytes_per_sample(mFormat);
2836             const size_t sinkBufferSize = mNormalFrameCount * mFrameSize;
2837             (void)posix_memalign(&mSinkBuffer, 32, sinkBufferSize);
2838         }
2839 
2840         // create a MonoPipe to connect our submix to FastMixer
2841         NBAIO_Format format = mOutputSink->format();
2842         NBAIO_Format origformat = format;
2843         // adjust format to match that of the Fast Mixer
2844         format.mFormat = fastMixerFormat;
2845         format.mFrameSize = audio_bytes_per_sample(format.mFormat) * format.mChannelCount;
2846 
2847         // This pipe depth compensates for scheduling latency of the normal mixer thread.
2848         // When it wakes up after a maximum latency, it runs a few cycles quickly before
2849         // finally blocking.  Note the pipe implementation rounds up the request to a power of 2.
2850         MonoPipe *monoPipe = new MonoPipe(mNormalFrameCount * 4, format, true /*writeCanBlock*/);
2851         const NBAIO_Format offers[1] = {format};
2852         size_t numCounterOffers = 0;
2853         ssize_t index = monoPipe->negotiate(offers, 1, NULL, numCounterOffers);
2854         ALOG_ASSERT(index == 0);
2855         monoPipe->setAvgFrames((mScreenState & 1) ?
2856                 (monoPipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
2857         mPipeSink = monoPipe;
2858 
2859 #ifdef TEE_SINK
2860         if (mTeeSinkOutputEnabled) {
2861             // create a Pipe to archive a copy of FastMixer's output for dumpsys
2862             Pipe *teeSink = new Pipe(mTeeSinkOutputFrames, origformat);
2863             const NBAIO_Format offers2[1] = {origformat};
2864             numCounterOffers = 0;
2865             index = teeSink->negotiate(offers2, 1, NULL, numCounterOffers);
2866             ALOG_ASSERT(index == 0);
2867             mTeeSink = teeSink;
2868             PipeReader *teeSource = new PipeReader(*teeSink);
2869             numCounterOffers = 0;
2870             index = teeSource->negotiate(offers2, 1, NULL, numCounterOffers);
2871             ALOG_ASSERT(index == 0);
2872             mTeeSource = teeSource;
2873         }
2874 #endif
2875 
2876         // create fast mixer and configure it initially with just one fast track for our submix
2877         mFastMixer = new FastMixer();
2878         FastMixerStateQueue *sq = mFastMixer->sq();
2879 #ifdef STATE_QUEUE_DUMP
2880         sq->setObserverDump(&mStateQueueObserverDump);
2881         sq->setMutatorDump(&mStateQueueMutatorDump);
2882 #endif
2883         FastMixerState *state = sq->begin();
2884         FastTrack *fastTrack = &state->mFastTracks[0];
2885         // wrap the source side of the MonoPipe to make it an AudioBufferProvider
2886         fastTrack->mBufferProvider = new SourceAudioBufferProvider(new MonoPipeReader(monoPipe));
2887         fastTrack->mVolumeProvider = NULL;
2888         fastTrack->mChannelMask = mChannelMask; // mPipeSink channel mask for audio to FastMixer
2889         fastTrack->mFormat = mFormat; // mPipeSink format for audio to FastMixer
2890         fastTrack->mGeneration++;
2891         state->mFastTracksGen++;
2892         state->mTrackMask = 1;
2893         // fast mixer will use the HAL output sink
2894         state->mOutputSink = mOutputSink.get();
2895         state->mOutputSinkGen++;
2896         state->mFrameCount = mFrameCount;
2897         state->mCommand = FastMixerState::COLD_IDLE;
2898         // already done in constructor initialization list
2899         //mFastMixerFutex = 0;
2900         state->mColdFutexAddr = &mFastMixerFutex;
2901         state->mColdGen++;
2902         state->mDumpState = &mFastMixerDumpState;
2903 #ifdef TEE_SINK
2904         state->mTeeSink = mTeeSink.get();
2905 #endif
2906         mFastMixerNBLogWriter = audioFlinger->newWriter_l(kFastMixerLogSize, "FastMixer");
2907         state->mNBLogWriter = mFastMixerNBLogWriter.get();
2908         sq->end();
2909         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
2910 
2911         // start the fast mixer
2912         mFastMixer->run("FastMixer", PRIORITY_URGENT_AUDIO);
2913         pid_t tid = mFastMixer->getTid();
2914         int err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
2915         if (err != 0) {
2916             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
2917                     kPriorityFastMixer, getpid_cached, tid, err);
2918         }
2919 
2920 #ifdef AUDIO_WATCHDOG
2921         // create and start the watchdog
2922         mAudioWatchdog = new AudioWatchdog();
2923         mAudioWatchdog->setDump(&mAudioWatchdogDump);
2924         mAudioWatchdog->run("AudioWatchdog", PRIORITY_URGENT_AUDIO);
2925         tid = mAudioWatchdog->getTid();
2926         err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
2927         if (err != 0) {
2928             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
2929                     kPriorityFastMixer, getpid_cached, tid, err);
2930         }
2931 #endif
2932 
2933     }
2934 
2935     switch (kUseFastMixer) {
2936     case FastMixer_Never:
2937     case FastMixer_Dynamic:
2938         mNormalSink = mOutputSink;
2939         break;
2940     case FastMixer_Always:
2941         mNormalSink = mPipeSink;
2942         break;
2943     case FastMixer_Static:
2944         mNormalSink = initFastMixer ? mPipeSink : mOutputSink;
2945         break;
2946     }
2947 }
2948 
~MixerThread()2949 AudioFlinger::MixerThread::~MixerThread()
2950 {
2951     if (mFastMixer != 0) {
2952         FastMixerStateQueue *sq = mFastMixer->sq();
2953         FastMixerState *state = sq->begin();
2954         if (state->mCommand == FastMixerState::COLD_IDLE) {
2955             int32_t old = android_atomic_inc(&mFastMixerFutex);
2956             if (old == -1) {
2957                 (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
2958             }
2959         }
2960         state->mCommand = FastMixerState::EXIT;
2961         sq->end();
2962         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
2963         mFastMixer->join();
2964         // Though the fast mixer thread has exited, it's state queue is still valid.
2965         // We'll use that extract the final state which contains one remaining fast track
2966         // corresponding to our sub-mix.
2967         state = sq->begin();
2968         ALOG_ASSERT(state->mTrackMask == 1);
2969         FastTrack *fastTrack = &state->mFastTracks[0];
2970         ALOG_ASSERT(fastTrack->mBufferProvider != NULL);
2971         delete fastTrack->mBufferProvider;
2972         sq->end(false /*didModify*/);
2973         mFastMixer.clear();
2974 #ifdef AUDIO_WATCHDOG
2975         if (mAudioWatchdog != 0) {
2976             mAudioWatchdog->requestExit();
2977             mAudioWatchdog->requestExitAndWait();
2978             mAudioWatchdog.clear();
2979         }
2980 #endif
2981     }
2982     mAudioFlinger->unregisterWriter(mFastMixerNBLogWriter);
2983     delete mAudioMixer;
2984 }
2985 
2986 
correctLatency_l(uint32_t latency) const2987 uint32_t AudioFlinger::MixerThread::correctLatency_l(uint32_t latency) const
2988 {
2989     if (mFastMixer != 0) {
2990         MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
2991         latency += (pipe->getAvgFrames() * 1000) / mSampleRate;
2992     }
2993     return latency;
2994 }
2995 
2996 
threadLoop_removeTracks(const Vector<sp<Track>> & tracksToRemove)2997 void AudioFlinger::MixerThread::threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove)
2998 {
2999     PlaybackThread::threadLoop_removeTracks(tracksToRemove);
3000 }
3001 
threadLoop_write()3002 ssize_t AudioFlinger::MixerThread::threadLoop_write()
3003 {
3004     // FIXME we should only do one push per cycle; confirm this is true
3005     // Start the fast mixer if it's not already running
3006     if (mFastMixer != 0) {
3007         FastMixerStateQueue *sq = mFastMixer->sq();
3008         FastMixerState *state = sq->begin();
3009         if (state->mCommand != FastMixerState::MIX_WRITE &&
3010                 (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)) {
3011             if (state->mCommand == FastMixerState::COLD_IDLE) {
3012                 int32_t old = android_atomic_inc(&mFastMixerFutex);
3013                 if (old == -1) {
3014                     (void) syscall(__NR_futex, &mFastMixerFutex, FUTEX_WAKE_PRIVATE, 1);
3015                 }
3016 #ifdef AUDIO_WATCHDOG
3017                 if (mAudioWatchdog != 0) {
3018                     mAudioWatchdog->resume();
3019                 }
3020 #endif
3021             }
3022             state->mCommand = FastMixerState::MIX_WRITE;
3023             mFastMixerDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
3024                     FastMixerDumpState::kSamplingNforLowRamDevice : FastMixerDumpState::kSamplingN);
3025             sq->end();
3026             sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
3027             if (kUseFastMixer == FastMixer_Dynamic) {
3028                 mNormalSink = mPipeSink;
3029             }
3030         } else {
3031             sq->end(false /*didModify*/);
3032         }
3033     }
3034     return PlaybackThread::threadLoop_write();
3035 }
3036 
threadLoop_standby()3037 void AudioFlinger::MixerThread::threadLoop_standby()
3038 {
3039     // Idle the fast mixer if it's currently running
3040     if (mFastMixer != 0) {
3041         FastMixerStateQueue *sq = mFastMixer->sq();
3042         FastMixerState *state = sq->begin();
3043         if (!(state->mCommand & FastMixerState::IDLE)) {
3044             state->mCommand = FastMixerState::COLD_IDLE;
3045             state->mColdFutexAddr = &mFastMixerFutex;
3046             state->mColdGen++;
3047             mFastMixerFutex = 0;
3048             sq->end();
3049             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
3050             sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
3051             if (kUseFastMixer == FastMixer_Dynamic) {
3052                 mNormalSink = mOutputSink;
3053             }
3054 #ifdef AUDIO_WATCHDOG
3055             if (mAudioWatchdog != 0) {
3056                 mAudioWatchdog->pause();
3057             }
3058 #endif
3059         } else {
3060             sq->end(false /*didModify*/);
3061         }
3062     }
3063     PlaybackThread::threadLoop_standby();
3064 }
3065 
waitingAsyncCallback_l()3066 bool AudioFlinger::PlaybackThread::waitingAsyncCallback_l()
3067 {
3068     return false;
3069 }
3070 
shouldStandby_l()3071 bool AudioFlinger::PlaybackThread::shouldStandby_l()
3072 {
3073     return !mStandby;
3074 }
3075 
waitingAsyncCallback()3076 bool AudioFlinger::PlaybackThread::waitingAsyncCallback()
3077 {
3078     Mutex::Autolock _l(mLock);
3079     return waitingAsyncCallback_l();
3080 }
3081 
3082 // shared by MIXER and DIRECT, overridden by DUPLICATING
threadLoop_standby()3083 void AudioFlinger::PlaybackThread::threadLoop_standby()
3084 {
3085     ALOGV("Audio hardware entering standby, mixer %p, suspend count %d", this, mSuspended);
3086     mOutput->stream->common.standby(&mOutput->stream->common);
3087     if (mUseAsyncWrite != 0) {
3088         // discard any pending drain or write ack by incrementing sequence
3089         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
3090         mDrainSequence = (mDrainSequence + 2) & ~1;
3091         ALOG_ASSERT(mCallbackThread != 0);
3092         mCallbackThread->setWriteBlocked(mWriteAckSequence);
3093         mCallbackThread->setDraining(mDrainSequence);
3094     }
3095     mHwPaused = false;
3096 }
3097 
onAddNewTrack_l()3098 void AudioFlinger::PlaybackThread::onAddNewTrack_l()
3099 {
3100     ALOGV("signal playback thread");
3101     broadcast_l();
3102 }
3103 
threadLoop_mix()3104 void AudioFlinger::MixerThread::threadLoop_mix()
3105 {
3106     // obtain the presentation timestamp of the next output buffer
3107     int64_t pts;
3108     status_t status = INVALID_OPERATION;
3109 
3110     if (mNormalSink != 0) {
3111         status = mNormalSink->getNextWriteTimestamp(&pts);
3112     } else {
3113         status = mOutputSink->getNextWriteTimestamp(&pts);
3114     }
3115 
3116     if (status != NO_ERROR) {
3117         pts = AudioBufferProvider::kInvalidPTS;
3118     }
3119 
3120     // mix buffers...
3121     mAudioMixer->process(pts);
3122     mCurrentWriteLength = mSinkBufferSize;
3123     // increase sleep time progressively when application underrun condition clears.
3124     // Only increase sleep time if the mixer is ready for two consecutive times to avoid
3125     // that a steady state of alternating ready/not ready conditions keeps the sleep time
3126     // such that we would underrun the audio HAL.
3127     if ((sleepTime == 0) && (sleepTimeShift > 0)) {
3128         sleepTimeShift--;
3129     }
3130     sleepTime = 0;
3131     standbyTime = systemTime() + standbyDelay;
3132     //TODO: delay standby when effects have a tail
3133 
3134 }
3135 
threadLoop_sleepTime()3136 void AudioFlinger::MixerThread::threadLoop_sleepTime()
3137 {
3138     // If no tracks are ready, sleep once for the duration of an output
3139     // buffer size, then write 0s to the output
3140     if (sleepTime == 0) {
3141         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
3142             sleepTime = activeSleepTime >> sleepTimeShift;
3143             if (sleepTime < kMinThreadSleepTimeUs) {
3144                 sleepTime = kMinThreadSleepTimeUs;
3145             }
3146             // reduce sleep time in case of consecutive application underruns to avoid
3147             // starving the audio HAL. As activeSleepTimeUs() is larger than a buffer
3148             // duration we would end up writing less data than needed by the audio HAL if
3149             // the condition persists.
3150             if (sleepTimeShift < kMaxThreadSleepTimeShift) {
3151                 sleepTimeShift++;
3152             }
3153         } else {
3154             sleepTime = idleSleepTime;
3155         }
3156     } else if (mBytesWritten != 0 || (mMixerStatus == MIXER_TRACKS_ENABLED)) {
3157         // clear out mMixerBuffer or mSinkBuffer, to ensure buffers are cleared
3158         // before effects processing or output.
3159         if (mMixerBufferValid) {
3160             memset(mMixerBuffer, 0, mMixerBufferSize);
3161         } else {
3162             memset(mSinkBuffer, 0, mSinkBufferSize);
3163         }
3164         sleepTime = 0;
3165         ALOGV_IF(mBytesWritten == 0 && (mMixerStatus == MIXER_TRACKS_ENABLED),
3166                 "anticipated start");
3167     }
3168     // TODO add standby time extension fct of effect tail
3169 }
3170 
3171 // prepareTracks_l() must be called with ThreadBase::mLock held
prepareTracks_l(Vector<sp<Track>> * tracksToRemove)3172 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l(
3173         Vector< sp<Track> > *tracksToRemove)
3174 {
3175 
3176     mixer_state mixerStatus = MIXER_IDLE;
3177     // find out which tracks need to be processed
3178     size_t count = mActiveTracks.size();
3179     size_t mixedTracks = 0;
3180     size_t tracksWithEffect = 0;
3181     // counts only _active_ fast tracks
3182     size_t fastTracks = 0;
3183     uint32_t resetMask = 0; // bit mask of fast tracks that need to be reset
3184 
3185     float masterVolume = mMasterVolume;
3186     bool masterMute = mMasterMute;
3187 
3188     if (masterMute) {
3189         masterVolume = 0;
3190     }
3191     // Delegate master volume control to effect in output mix effect chain if needed
3192     sp<EffectChain> chain = getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
3193     if (chain != 0) {
3194         uint32_t v = (uint32_t)(masterVolume * (1 << 24));
3195         chain->setVolume_l(&v, &v);
3196         masterVolume = (float)((v + (1 << 23)) >> 24);
3197         chain.clear();
3198     }
3199 
3200     // prepare a new state to push
3201     FastMixerStateQueue *sq = NULL;
3202     FastMixerState *state = NULL;
3203     bool didModify = false;
3204     FastMixerStateQueue::block_t block = FastMixerStateQueue::BLOCK_UNTIL_PUSHED;
3205     if (mFastMixer != 0) {
3206         sq = mFastMixer->sq();
3207         state = sq->begin();
3208     }
3209 
3210     mMixerBufferValid = false;  // mMixerBuffer has no valid data until appropriate tracks found.
3211     mEffectBufferValid = false; // mEffectBuffer has no valid data until tracks found.
3212 
3213     for (size_t i=0 ; i<count ; i++) {
3214         const sp<Track> t = mActiveTracks[i].promote();
3215         if (t == 0) {
3216             continue;
3217         }
3218 
3219         // this const just means the local variable doesn't change
3220         Track* const track = t.get();
3221 
3222         // process fast tracks
3223         if (track->isFastTrack()) {
3224 
3225             // It's theoretically possible (though unlikely) for a fast track to be created
3226             // and then removed within the same normal mix cycle.  This is not a problem, as
3227             // the track never becomes active so it's fast mixer slot is never touched.
3228             // The converse, of removing an (active) track and then creating a new track
3229             // at the identical fast mixer slot within the same normal mix cycle,
3230             // is impossible because the slot isn't marked available until the end of each cycle.
3231             int j = track->mFastIndex;
3232             ALOG_ASSERT(0 < j && j < (int)FastMixerState::kMaxFastTracks);
3233             ALOG_ASSERT(!(mFastTrackAvailMask & (1 << j)));
3234             FastTrack *fastTrack = &state->mFastTracks[j];
3235 
3236             // Determine whether the track is currently in underrun condition,
3237             // and whether it had a recent underrun.
3238             FastTrackDump *ftDump = &mFastMixerDumpState.mTracks[j];
3239             FastTrackUnderruns underruns = ftDump->mUnderruns;
3240             uint32_t recentFull = (underruns.mBitFields.mFull -
3241                     track->mObservedUnderruns.mBitFields.mFull) & UNDERRUN_MASK;
3242             uint32_t recentPartial = (underruns.mBitFields.mPartial -
3243                     track->mObservedUnderruns.mBitFields.mPartial) & UNDERRUN_MASK;
3244             uint32_t recentEmpty = (underruns.mBitFields.mEmpty -
3245                     track->mObservedUnderruns.mBitFields.mEmpty) & UNDERRUN_MASK;
3246             uint32_t recentUnderruns = recentPartial + recentEmpty;
3247             track->mObservedUnderruns = underruns;
3248             // don't count underruns that occur while stopping or pausing
3249             // or stopped which can occur when flush() is called while active
3250             if (!(track->isStopping() || track->isPausing() || track->isStopped()) &&
3251                     recentUnderruns > 0) {
3252                 // FIXME fast mixer will pull & mix partial buffers, but we count as a full underrun
3253                 track->mAudioTrackServerProxy->tallyUnderrunFrames(recentUnderruns * mFrameCount);
3254             }
3255 
3256             // This is similar to the state machine for normal tracks,
3257             // with a few modifications for fast tracks.
3258             bool isActive = true;
3259             switch (track->mState) {
3260             case TrackBase::STOPPING_1:
3261                 // track stays active in STOPPING_1 state until first underrun
3262                 if (recentUnderruns > 0 || track->isTerminated()) {
3263                     track->mState = TrackBase::STOPPING_2;
3264                 }
3265                 break;
3266             case TrackBase::PAUSING:
3267                 // ramp down is not yet implemented
3268                 track->setPaused();
3269                 break;
3270             case TrackBase::RESUMING:
3271                 // ramp up is not yet implemented
3272                 track->mState = TrackBase::ACTIVE;
3273                 break;
3274             case TrackBase::ACTIVE:
3275                 if (recentFull > 0 || recentPartial > 0) {
3276                     // track has provided at least some frames recently: reset retry count
3277                     track->mRetryCount = kMaxTrackRetries;
3278                 }
3279                 if (recentUnderruns == 0) {
3280                     // no recent underruns: stay active
3281                     break;
3282                 }
3283                 // there has recently been an underrun of some kind
3284                 if (track->sharedBuffer() == 0) {
3285                     // were any of the recent underruns "empty" (no frames available)?
3286                     if (recentEmpty == 0) {
3287                         // no, then ignore the partial underruns as they are allowed indefinitely
3288                         break;
3289                     }
3290                     // there has recently been an "empty" underrun: decrement the retry counter
3291                     if (--(track->mRetryCount) > 0) {
3292                         break;
3293                     }
3294                     // indicate to client process that the track was disabled because of underrun;
3295                     // it will then automatically call start() when data is available
3296                     android_atomic_or(CBLK_DISABLED, &track->mCblk->mFlags);
3297                     // remove from active list, but state remains ACTIVE [confusing but true]
3298                     isActive = false;
3299                     break;
3300                 }
3301                 // fall through
3302             case TrackBase::STOPPING_2:
3303             case TrackBase::PAUSED:
3304             case TrackBase::STOPPED:
3305             case TrackBase::FLUSHED:   // flush() while active
3306                 // Check for presentation complete if track is inactive
3307                 // We have consumed all the buffers of this track.
3308                 // This would be incomplete if we auto-paused on underrun
3309                 {
3310                     size_t audioHALFrames =
3311                             (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
3312                     size_t framesWritten = mBytesWritten / mFrameSize;
3313                     if (!(mStandby || track->presentationComplete(framesWritten, audioHALFrames))) {
3314                         // track stays in active list until presentation is complete
3315                         break;
3316                     }
3317                 }
3318                 if (track->isStopping_2()) {
3319                     track->mState = TrackBase::STOPPED;
3320                 }
3321                 if (track->isStopped()) {
3322                     // Can't reset directly, as fast mixer is still polling this track
3323                     //   track->reset();
3324                     // So instead mark this track as needing to be reset after push with ack
3325                     resetMask |= 1 << i;
3326                 }
3327                 isActive = false;
3328                 break;
3329             case TrackBase::IDLE:
3330             default:
3331                 LOG_ALWAYS_FATAL("unexpected track state %d", track->mState);
3332             }
3333 
3334             if (isActive) {
3335                 // was it previously inactive?
3336                 if (!(state->mTrackMask & (1 << j))) {
3337                     ExtendedAudioBufferProvider *eabp = track;
3338                     VolumeProvider *vp = track;
3339                     fastTrack->mBufferProvider = eabp;
3340                     fastTrack->mVolumeProvider = vp;
3341                     fastTrack->mChannelMask = track->mChannelMask;
3342                     fastTrack->mFormat = track->mFormat;
3343                     fastTrack->mGeneration++;
3344                     state->mTrackMask |= 1 << j;
3345                     didModify = true;
3346                     // no acknowledgement required for newly active tracks
3347                 }
3348                 // cache the combined master volume and stream type volume for fast mixer; this
3349                 // lacks any synchronization or barrier so VolumeProvider may read a stale value
3350                 track->mCachedVolume = masterVolume * mStreamTypes[track->streamType()].volume;
3351                 ++fastTracks;
3352             } else {
3353                 // was it previously active?
3354                 if (state->mTrackMask & (1 << j)) {
3355                     fastTrack->mBufferProvider = NULL;
3356                     fastTrack->mGeneration++;
3357                     state->mTrackMask &= ~(1 << j);
3358                     didModify = true;
3359                     // If any fast tracks were removed, we must wait for acknowledgement
3360                     // because we're about to decrement the last sp<> on those tracks.
3361                     block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
3362                 } else {
3363                     LOG_ALWAYS_FATAL("fast track %d should have been active", j);
3364                 }
3365                 tracksToRemove->add(track);
3366                 // Avoids a misleading display in dumpsys
3367                 track->mObservedUnderruns.mBitFields.mMostRecent = UNDERRUN_FULL;
3368             }
3369             continue;
3370         }
3371 
3372         {   // local variable scope to avoid goto warning
3373 
3374         audio_track_cblk_t* cblk = track->cblk();
3375 
3376         // The first time a track is added we wait
3377         // for all its buffers to be filled before processing it
3378         int name = track->name();
3379         // make sure that we have enough frames to mix one full buffer.
3380         // enforce this condition only once to enable draining the buffer in case the client
3381         // app does not call stop() and relies on underrun to stop:
3382         // hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
3383         // during last round
3384         size_t desiredFrames;
3385         uint32_t sr = track->sampleRate();
3386         if (sr == mSampleRate) {
3387             desiredFrames = mNormalFrameCount;
3388         } else {
3389             // +1 for rounding and +1 for additional sample needed for interpolation
3390             desiredFrames = (mNormalFrameCount * sr) / mSampleRate + 1 + 1;
3391             // add frames already consumed but not yet released by the resampler
3392             // because mAudioTrackServerProxy->framesReady() will include these frames
3393             desiredFrames += mAudioMixer->getUnreleasedFrames(track->name());
3394 #if 0
3395             // the minimum track buffer size is normally twice the number of frames necessary
3396             // to fill one buffer and the resampler should not leave more than one buffer worth
3397             // of unreleased frames after each pass, but just in case...
3398             ALOG_ASSERT(desiredFrames <= cblk->frameCount_);
3399 #endif
3400         }
3401         uint32_t minFrames = 1;
3402         if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing() &&
3403                 (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY)) {
3404             minFrames = desiredFrames;
3405         }
3406 
3407         size_t framesReady = track->framesReady();
3408         if ((framesReady >= minFrames) && track->isReady() &&
3409                 !track->isPaused() && !track->isTerminated())
3410         {
3411             ALOGVV("track %d s=%08x [OK] on thread %p", name, cblk->mServer, this);
3412 
3413             mixedTracks++;
3414 
3415             // track->mainBuffer() != mSinkBuffer or mMixerBuffer means
3416             // there is an effect chain connected to the track
3417             chain.clear();
3418             if (track->mainBuffer() != mSinkBuffer &&
3419                     track->mainBuffer() != mMixerBuffer) {
3420                 if (mEffectBufferEnabled) {
3421                     mEffectBufferValid = true; // Later can set directly.
3422                 }
3423                 chain = getEffectChain_l(track->sessionId());
3424                 // Delegate volume control to effect in track effect chain if needed
3425                 if (chain != 0) {
3426                     tracksWithEffect++;
3427                 } else {
3428                     ALOGW("prepareTracks_l(): track %d attached to effect but no chain found on "
3429                             "session %d",
3430                             name, track->sessionId());
3431                 }
3432             }
3433 
3434 
3435             int param = AudioMixer::VOLUME;
3436             if (track->mFillingUpStatus == Track::FS_FILLED) {
3437                 // no ramp for the first volume setting
3438                 track->mFillingUpStatus = Track::FS_ACTIVE;
3439                 if (track->mState == TrackBase::RESUMING) {
3440                     track->mState = TrackBase::ACTIVE;
3441                     param = AudioMixer::RAMP_VOLUME;
3442                 }
3443                 mAudioMixer->setParameter(name, AudioMixer::RESAMPLE, AudioMixer::RESET, NULL);
3444             // FIXME should not make a decision based on mServer
3445             } else if (cblk->mServer != 0) {
3446                 // If the track is stopped before the first frame was mixed,
3447                 // do not apply ramp
3448                 param = AudioMixer::RAMP_VOLUME;
3449             }
3450 
3451             // compute volume for this track
3452             uint32_t vl, vr;       // in U8.24 integer format
3453             float vlf, vrf, vaf;   // in [0.0, 1.0] float format
3454             if (track->isPausing() || mStreamTypes[track->streamType()].mute) {
3455                 vl = vr = 0;
3456                 vlf = vrf = vaf = 0.;
3457                 if (track->isPausing()) {
3458                     track->setPaused();
3459                 }
3460             } else {
3461 
3462                 // read original volumes with volume control
3463                 float typeVolume = mStreamTypes[track->streamType()].volume;
3464                 float v = masterVolume * typeVolume;
3465                 AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
3466                 gain_minifloat_packed_t vlr = proxy->getVolumeLR();
3467                 vlf = float_from_gain(gain_minifloat_unpack_left(vlr));
3468                 vrf = float_from_gain(gain_minifloat_unpack_right(vlr));
3469                 // track volumes come from shared memory, so can't be trusted and must be clamped
3470                 if (vlf > GAIN_FLOAT_UNITY) {
3471                     ALOGV("Track left volume out of range: %.3g", vlf);
3472                     vlf = GAIN_FLOAT_UNITY;
3473                 }
3474                 if (vrf > GAIN_FLOAT_UNITY) {
3475                     ALOGV("Track right volume out of range: %.3g", vrf);
3476                     vrf = GAIN_FLOAT_UNITY;
3477                 }
3478                 // now apply the master volume and stream type volume
3479                 vlf *= v;
3480                 vrf *= v;
3481                 // assuming master volume and stream type volume each go up to 1.0,
3482                 // then derive vl and vr as U8.24 versions for the effect chain
3483                 const float scaleto8_24 = MAX_GAIN_INT * MAX_GAIN_INT;
3484                 vl = (uint32_t) (scaleto8_24 * vlf);
3485                 vr = (uint32_t) (scaleto8_24 * vrf);
3486                 // vl and vr are now in U8.24 format
3487                 uint16_t sendLevel = proxy->getSendLevel_U4_12();
3488                 // send level comes from shared memory and so may be corrupt
3489                 if (sendLevel > MAX_GAIN_INT) {
3490                     ALOGV("Track send level out of range: %04X", sendLevel);
3491                     sendLevel = MAX_GAIN_INT;
3492                 }
3493                 // vaf is represented as [0.0, 1.0] float by rescaling sendLevel
3494                 vaf = v * sendLevel * (1. / MAX_GAIN_INT);
3495             }
3496 
3497             // Delegate volume control to effect in track effect chain if needed
3498             if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
3499                 // Do not ramp volume if volume is controlled by effect
3500                 param = AudioMixer::VOLUME;
3501                 // Update remaining floating point volume levels
3502                 vlf = (float)vl / (1 << 24);
3503                 vrf = (float)vr / (1 << 24);
3504                 track->mHasVolumeController = true;
3505             } else {
3506                 // force no volume ramp when volume controller was just disabled or removed
3507                 // from effect chain to avoid volume spike
3508                 if (track->mHasVolumeController) {
3509                     param = AudioMixer::VOLUME;
3510                 }
3511                 track->mHasVolumeController = false;
3512             }
3513 
3514             // XXX: these things DON'T need to be done each time
3515             mAudioMixer->setBufferProvider(name, track);
3516             mAudioMixer->enable(name);
3517 
3518             mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, &vlf);
3519             mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, &vrf);
3520             mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, &vaf);
3521             mAudioMixer->setParameter(
3522                 name,
3523                 AudioMixer::TRACK,
3524                 AudioMixer::FORMAT, (void *)track->format());
3525             mAudioMixer->setParameter(
3526                 name,
3527                 AudioMixer::TRACK,
3528                 AudioMixer::CHANNEL_MASK, (void *)(uintptr_t)track->channelMask());
3529             mAudioMixer->setParameter(
3530                 name,
3531                 AudioMixer::TRACK,
3532                 AudioMixer::MIXER_CHANNEL_MASK, (void *)(uintptr_t)mChannelMask);
3533             // limit track sample rate to 2 x output sample rate, which changes at re-configuration
3534             uint32_t maxSampleRate = mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX;
3535             uint32_t reqSampleRate = track->mAudioTrackServerProxy->getSampleRate();
3536             if (reqSampleRate == 0) {
3537                 reqSampleRate = mSampleRate;
3538             } else if (reqSampleRate > maxSampleRate) {
3539                 reqSampleRate = maxSampleRate;
3540             }
3541             mAudioMixer->setParameter(
3542                 name,
3543                 AudioMixer::RESAMPLE,
3544                 AudioMixer::SAMPLE_RATE,
3545                 (void *)(uintptr_t)reqSampleRate);
3546             /*
3547              * Select the appropriate output buffer for the track.
3548              *
3549              * Tracks with effects go into their own effects chain buffer
3550              * and from there into either mEffectBuffer or mSinkBuffer.
3551              *
3552              * Other tracks can use mMixerBuffer for higher precision
3553              * channel accumulation.  If this buffer is enabled
3554              * (mMixerBufferEnabled true), then selected tracks will accumulate
3555              * into it.
3556              *
3557              */
3558             if (mMixerBufferEnabled
3559                     && (track->mainBuffer() == mSinkBuffer
3560                             || track->mainBuffer() == mMixerBuffer)) {
3561                 mAudioMixer->setParameter(
3562                         name,
3563                         AudioMixer::TRACK,
3564                         AudioMixer::MIXER_FORMAT, (void *)mMixerBufferFormat);
3565                 mAudioMixer->setParameter(
3566                         name,
3567                         AudioMixer::TRACK,
3568                         AudioMixer::MAIN_BUFFER, (void *)mMixerBuffer);
3569                 // TODO: override track->mainBuffer()?
3570                 mMixerBufferValid = true;
3571             } else {
3572                 mAudioMixer->setParameter(
3573                         name,
3574                         AudioMixer::TRACK,
3575                         AudioMixer::MIXER_FORMAT, (void *)AUDIO_FORMAT_PCM_16_BIT);
3576                 mAudioMixer->setParameter(
3577                         name,
3578                         AudioMixer::TRACK,
3579                         AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
3580             }
3581             mAudioMixer->setParameter(
3582                 name,
3583                 AudioMixer::TRACK,
3584                 AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
3585 
3586             // reset retry count
3587             track->mRetryCount = kMaxTrackRetries;
3588 
3589             // If one track is ready, set the mixer ready if:
3590             //  - the mixer was not ready during previous round OR
3591             //  - no other track is not ready
3592             if (mMixerStatusIgnoringFastTracks != MIXER_TRACKS_READY ||
3593                     mixerStatus != MIXER_TRACKS_ENABLED) {
3594                 mixerStatus = MIXER_TRACKS_READY;
3595             }
3596         } else {
3597             if (framesReady < desiredFrames && !track->isStopped() && !track->isPaused()) {
3598                 track->mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);
3599             }
3600             // clear effect chain input buffer if an active track underruns to avoid sending
3601             // previous audio buffer again to effects
3602             chain = getEffectChain_l(track->sessionId());
3603             if (chain != 0) {
3604                 chain->clearInputBuffer();
3605             }
3606 
3607             ALOGVV("track %d s=%08x [NOT READY] on thread %p", name, cblk->mServer, this);
3608             if ((track->sharedBuffer() != 0) || track->isTerminated() ||
3609                     track->isStopped() || track->isPaused()) {
3610                 // We have consumed all the buffers of this track.
3611                 // Remove it from the list of active tracks.
3612                 // TODO: use actual buffer filling status instead of latency when available from
3613                 // audio HAL
3614                 size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
3615                 size_t framesWritten = mBytesWritten / mFrameSize;
3616                 if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
3617                     if (track->isStopped()) {
3618                         track->reset();
3619                     }
3620                     tracksToRemove->add(track);
3621                 }
3622             } else {
3623                 // No buffers for this track. Give it a few chances to
3624                 // fill a buffer, then remove it from active list.
3625                 if (--(track->mRetryCount) <= 0) {
3626                     ALOGI("BUFFER TIMEOUT: remove(%d) from active list on thread %p", name, this);
3627                     tracksToRemove->add(track);
3628                     // indicate to client process that the track was disabled because of underrun;
3629                     // it will then automatically call start() when data is available
3630                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
3631                 // If one track is not ready, mark the mixer also not ready if:
3632                 //  - the mixer was ready during previous round OR
3633                 //  - no other track is ready
3634                 } else if (mMixerStatusIgnoringFastTracks == MIXER_TRACKS_READY ||
3635                                 mixerStatus != MIXER_TRACKS_READY) {
3636                     mixerStatus = MIXER_TRACKS_ENABLED;
3637                 }
3638             }
3639             mAudioMixer->disable(name);
3640         }
3641 
3642         }   // local variable scope to avoid goto warning
3643 track_is_ready: ;
3644 
3645     }
3646 
3647     // Push the new FastMixer state if necessary
3648     bool pauseAudioWatchdog = false;
3649     if (didModify) {
3650         state->mFastTracksGen++;
3651         // if the fast mixer was active, but now there are no fast tracks, then put it in cold idle
3652         if (kUseFastMixer == FastMixer_Dynamic &&
3653                 state->mCommand == FastMixerState::MIX_WRITE && state->mTrackMask <= 1) {
3654             state->mCommand = FastMixerState::COLD_IDLE;
3655             state->mColdFutexAddr = &mFastMixerFutex;
3656             state->mColdGen++;
3657             mFastMixerFutex = 0;
3658             if (kUseFastMixer == FastMixer_Dynamic) {
3659                 mNormalSink = mOutputSink;
3660             }
3661             // If we go into cold idle, need to wait for acknowledgement
3662             // so that fast mixer stops doing I/O.
3663             block = FastMixerStateQueue::BLOCK_UNTIL_ACKED;
3664             pauseAudioWatchdog = true;
3665         }
3666     }
3667     if (sq != NULL) {
3668         sq->end(didModify);
3669         sq->push(block);
3670     }
3671 #ifdef AUDIO_WATCHDOG
3672     if (pauseAudioWatchdog && mAudioWatchdog != 0) {
3673         mAudioWatchdog->pause();
3674     }
3675 #endif
3676 
3677     // Now perform the deferred reset on fast tracks that have stopped
3678     while (resetMask != 0) {
3679         size_t i = __builtin_ctz(resetMask);
3680         ALOG_ASSERT(i < count);
3681         resetMask &= ~(1 << i);
3682         sp<Track> t = mActiveTracks[i].promote();
3683         if (t == 0) {
3684             continue;
3685         }
3686         Track* track = t.get();
3687         ALOG_ASSERT(track->isFastTrack() && track->isStopped());
3688         track->reset();
3689     }
3690 
3691     // remove all the tracks that need to be...
3692     removeTracks_l(*tracksToRemove);
3693 
3694     if (getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX) != 0) {
3695         mEffectBufferValid = true;
3696     }
3697 
3698     if (mEffectBufferValid) {
3699         // as long as there are effects we should clear the effects buffer, to avoid
3700         // passing a non-clean buffer to the effect chain
3701         memset(mEffectBuffer, 0, mEffectBufferSize);
3702     }
3703     // sink or mix buffer must be cleared if all tracks are connected to an
3704     // effect chain as in this case the mixer will not write to the sink or mix buffer
3705     // and track effects will accumulate into it
3706     if ((mBytesRemaining == 0) && ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
3707             (mixedTracks == 0 && fastTracks > 0))) {
3708         // FIXME as a performance optimization, should remember previous zero status
3709         if (mMixerBufferValid) {
3710             memset(mMixerBuffer, 0, mMixerBufferSize);
3711             // TODO: In testing, mSinkBuffer below need not be cleared because
3712             // the PlaybackThread::threadLoop() copies mMixerBuffer into mSinkBuffer
3713             // after mixing.
3714             //
3715             // To enforce this guarantee:
3716             // ((mixedTracks != 0 && mixedTracks == tracksWithEffect) ||
3717             // (mixedTracks == 0 && fastTracks > 0))
3718             // must imply MIXER_TRACKS_READY.
3719             // Later, we may clear buffers regardless, and skip much of this logic.
3720         }
3721         // FIXME as a performance optimization, should remember previous zero status
3722         memset(mSinkBuffer, 0, mNormalFrameCount * mFrameSize);
3723     }
3724 
3725     // if any fast tracks, then status is ready
3726     mMixerStatusIgnoringFastTracks = mixerStatus;
3727     if (fastTracks > 0) {
3728         mixerStatus = MIXER_TRACKS_READY;
3729     }
3730     return mixerStatus;
3731 }
3732 
3733 // getTrackName_l() must be called with ThreadBase::mLock held
getTrackName_l(audio_channel_mask_t channelMask,audio_format_t format,int sessionId)3734 int AudioFlinger::MixerThread::getTrackName_l(audio_channel_mask_t channelMask,
3735         audio_format_t format, int sessionId)
3736 {
3737     return mAudioMixer->getTrackName(channelMask, format, sessionId);
3738 }
3739 
3740 // deleteTrackName_l() must be called with ThreadBase::mLock held
deleteTrackName_l(int name)3741 void AudioFlinger::MixerThread::deleteTrackName_l(int name)
3742 {
3743     ALOGV("remove track (%d) and delete from mixer", name);
3744     mAudioMixer->deleteTrackName(name);
3745 }
3746 
3747 // checkForNewParameter_l() must be called with ThreadBase::mLock held
checkForNewParameter_l(const String8 & keyValuePair,status_t & status)3748 bool AudioFlinger::MixerThread::checkForNewParameter_l(const String8& keyValuePair,
3749                                                        status_t& status)
3750 {
3751     bool reconfig = false;
3752 
3753     status = NO_ERROR;
3754 
3755     // if !&IDLE, holds the FastMixer state to restore after new parameters processed
3756     FastMixerState::Command previousCommand = FastMixerState::HOT_IDLE;
3757     if (mFastMixer != 0) {
3758         FastMixerStateQueue *sq = mFastMixer->sq();
3759         FastMixerState *state = sq->begin();
3760         if (!(state->mCommand & FastMixerState::IDLE)) {
3761             previousCommand = state->mCommand;
3762             state->mCommand = FastMixerState::HOT_IDLE;
3763             sq->end();
3764             sq->push(FastMixerStateQueue::BLOCK_UNTIL_ACKED);
3765         } else {
3766             sq->end(false /*didModify*/);
3767         }
3768     }
3769 
3770     AudioParameter param = AudioParameter(keyValuePair);
3771     int value;
3772     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
3773         reconfig = true;
3774     }
3775     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
3776         if (!isValidPcmSinkFormat((audio_format_t) value)) {
3777             status = BAD_VALUE;
3778         } else {
3779             // no need to save value, since it's constant
3780             reconfig = true;
3781         }
3782     }
3783     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
3784         if (!isValidPcmSinkChannelMask((audio_channel_mask_t) value)) {
3785             status = BAD_VALUE;
3786         } else {
3787             // no need to save value, since it's constant
3788             reconfig = true;
3789         }
3790     }
3791     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
3792         // do not accept frame count changes if tracks are open as the track buffer
3793         // size depends on frame count and correct behavior would not be guaranteed
3794         // if frame count is changed after track creation
3795         if (!mTracks.isEmpty()) {
3796             status = INVALID_OPERATION;
3797         } else {
3798             reconfig = true;
3799         }
3800     }
3801     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
3802 #ifdef ADD_BATTERY_DATA
3803         // when changing the audio output device, call addBatteryData to notify
3804         // the change
3805         if (mOutDevice != value) {
3806             uint32_t params = 0;
3807             // check whether speaker is on
3808             if (value & AUDIO_DEVICE_OUT_SPEAKER) {
3809                 params |= IMediaPlayerService::kBatteryDataSpeakerOn;
3810             }
3811 
3812             audio_devices_t deviceWithoutSpeaker
3813                 = AUDIO_DEVICE_OUT_ALL & ~AUDIO_DEVICE_OUT_SPEAKER;
3814             // check if any other device (except speaker) is on
3815             if (value & deviceWithoutSpeaker ) {
3816                 params |= IMediaPlayerService::kBatteryDataOtherAudioDeviceOn;
3817             }
3818 
3819             if (params != 0) {
3820                 addBatteryData(params);
3821             }
3822         }
3823 #endif
3824 
3825         // forward device change to effects that have requested to be
3826         // aware of attached audio device.
3827         if (value != AUDIO_DEVICE_NONE) {
3828             mOutDevice = value;
3829             for (size_t i = 0; i < mEffectChains.size(); i++) {
3830                 mEffectChains[i]->setDevice_l(mOutDevice);
3831             }
3832         }
3833     }
3834 
3835     if (status == NO_ERROR) {
3836         status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
3837                                                 keyValuePair.string());
3838         if (!mStandby && status == INVALID_OPERATION) {
3839             mOutput->stream->common.standby(&mOutput->stream->common);
3840             mStandby = true;
3841             mBytesWritten = 0;
3842             status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
3843                                                    keyValuePair.string());
3844         }
3845         if (status == NO_ERROR && reconfig) {
3846             readOutputParameters_l();
3847             delete mAudioMixer;
3848             mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
3849             for (size_t i = 0; i < mTracks.size() ; i++) {
3850                 int name = getTrackName_l(mTracks[i]->mChannelMask,
3851                         mTracks[i]->mFormat, mTracks[i]->mSessionId);
3852                 if (name < 0) {
3853                     break;
3854                 }
3855                 mTracks[i]->mName = name;
3856             }
3857             sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
3858         }
3859     }
3860 
3861     if (!(previousCommand & FastMixerState::IDLE)) {
3862         ALOG_ASSERT(mFastMixer != 0);
3863         FastMixerStateQueue *sq = mFastMixer->sq();
3864         FastMixerState *state = sq->begin();
3865         ALOG_ASSERT(state->mCommand == FastMixerState::HOT_IDLE);
3866         state->mCommand = previousCommand;
3867         sq->end();
3868         sq->push(FastMixerStateQueue::BLOCK_UNTIL_PUSHED);
3869     }
3870 
3871     return reconfig;
3872 }
3873 
3874 
dumpInternals(int fd,const Vector<String16> & args)3875 void AudioFlinger::MixerThread::dumpInternals(int fd, const Vector<String16>& args)
3876 {
3877     const size_t SIZE = 256;
3878     char buffer[SIZE];
3879     String8 result;
3880 
3881     PlaybackThread::dumpInternals(fd, args);
3882 
3883     dprintf(fd, "  AudioMixer tracks: 0x%08x\n", mAudioMixer->trackNames());
3884 
3885     // Make a non-atomic copy of fast mixer dump state so it won't change underneath us
3886     const FastMixerDumpState copy(mFastMixerDumpState);
3887     copy.dump(fd);
3888 
3889 #ifdef STATE_QUEUE_DUMP
3890     // Similar for state queue
3891     StateQueueObserverDump observerCopy = mStateQueueObserverDump;
3892     observerCopy.dump(fd);
3893     StateQueueMutatorDump mutatorCopy = mStateQueueMutatorDump;
3894     mutatorCopy.dump(fd);
3895 #endif
3896 
3897 #ifdef TEE_SINK
3898     // Write the tee output to a .wav file
3899     dumpTee(fd, mTeeSource, mId);
3900 #endif
3901 
3902 #ifdef AUDIO_WATCHDOG
3903     if (mAudioWatchdog != 0) {
3904         // Make a non-atomic copy of audio watchdog dump so it won't change underneath us
3905         AudioWatchdogDump wdCopy = mAudioWatchdogDump;
3906         wdCopy.dump(fd);
3907     }
3908 #endif
3909 }
3910 
idleSleepTimeUs() const3911 uint32_t AudioFlinger::MixerThread::idleSleepTimeUs() const
3912 {
3913     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000) / 2;
3914 }
3915 
suspendSleepTimeUs() const3916 uint32_t AudioFlinger::MixerThread::suspendSleepTimeUs() const
3917 {
3918     return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000);
3919 }
3920 
cacheParameters_l()3921 void AudioFlinger::MixerThread::cacheParameters_l()
3922 {
3923     PlaybackThread::cacheParameters_l();
3924 
3925     // FIXME: Relaxed timing because of a certain device that can't meet latency
3926     // Should be reduced to 2x after the vendor fixes the driver issue
3927     // increase threshold again due to low power audio mode. The way this warning
3928     // threshold is calculated and its usefulness should be reconsidered anyway.
3929     maxPeriod = seconds(mNormalFrameCount) / mSampleRate * 15;
3930 }
3931 
3932 // ----------------------------------------------------------------------------
3933 
DirectOutputThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,audio_devices_t device)3934 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
3935         AudioStreamOut* output, audio_io_handle_t id, audio_devices_t device)
3936     :   PlaybackThread(audioFlinger, output, id, device, DIRECT)
3937         // mLeftVolFloat, mRightVolFloat
3938 {
3939 }
3940 
DirectOutputThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,uint32_t device,ThreadBase::type_t type)3941 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger,
3942         AudioStreamOut* output, audio_io_handle_t id, uint32_t device,
3943         ThreadBase::type_t type)
3944     :   PlaybackThread(audioFlinger, output, id, device, type)
3945         // mLeftVolFloat, mRightVolFloat
3946 {
3947 }
3948 
~DirectOutputThread()3949 AudioFlinger::DirectOutputThread::~DirectOutputThread()
3950 {
3951 }
3952 
processVolume_l(Track * track,bool lastTrack)3953 void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTrack)
3954 {
3955     audio_track_cblk_t* cblk = track->cblk();
3956     float left, right;
3957 
3958     if (mMasterMute || mStreamTypes[track->streamType()].mute) {
3959         left = right = 0;
3960     } else {
3961         float typeVolume = mStreamTypes[track->streamType()].volume;
3962         float v = mMasterVolume * typeVolume;
3963         AudioTrackServerProxy *proxy = track->mAudioTrackServerProxy;
3964         gain_minifloat_packed_t vlr = proxy->getVolumeLR();
3965         left = float_from_gain(gain_minifloat_unpack_left(vlr));
3966         if (left > GAIN_FLOAT_UNITY) {
3967             left = GAIN_FLOAT_UNITY;
3968         }
3969         left *= v;
3970         right = float_from_gain(gain_minifloat_unpack_right(vlr));
3971         if (right > GAIN_FLOAT_UNITY) {
3972             right = GAIN_FLOAT_UNITY;
3973         }
3974         right *= v;
3975     }
3976 
3977     if (lastTrack) {
3978         if (left != mLeftVolFloat || right != mRightVolFloat) {
3979             mLeftVolFloat = left;
3980             mRightVolFloat = right;
3981 
3982             // Convert volumes from float to 8.24
3983             uint32_t vl = (uint32_t)(left * (1 << 24));
3984             uint32_t vr = (uint32_t)(right * (1 << 24));
3985 
3986             // Delegate volume control to effect in track effect chain if needed
3987             // only one effect chain can be present on DirectOutputThread, so if
3988             // there is one, the track is connected to it
3989             if (!mEffectChains.isEmpty()) {
3990                 mEffectChains[0]->setVolume_l(&vl, &vr);
3991                 left = (float)vl / (1 << 24);
3992                 right = (float)vr / (1 << 24);
3993             }
3994             if (mOutput->stream->set_volume) {
3995                 mOutput->stream->set_volume(mOutput->stream, left, right);
3996             }
3997         }
3998     }
3999 }
4000 
4001 
prepareTracks_l(Vector<sp<Track>> * tracksToRemove)4002 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prepareTracks_l(
4003     Vector< sp<Track> > *tracksToRemove
4004 )
4005 {
4006     size_t count = mActiveTracks.size();
4007     mixer_state mixerStatus = MIXER_IDLE;
4008     bool doHwPause = false;
4009     bool doHwResume = false;
4010     bool flushPending = false;
4011 
4012     // find out which tracks need to be processed
4013     for (size_t i = 0; i < count; i++) {
4014         sp<Track> t = mActiveTracks[i].promote();
4015         // The track died recently
4016         if (t == 0) {
4017             continue;
4018         }
4019 
4020         Track* const track = t.get();
4021         audio_track_cblk_t* cblk = track->cblk();
4022         // Only consider last track started for volume and mixer state control.
4023         // In theory an older track could underrun and restart after the new one starts
4024         // but as we only care about the transition phase between two tracks on a
4025         // direct output, it is not a problem to ignore the underrun case.
4026         sp<Track> l = mLatestActiveTrack.promote();
4027         bool last = l.get() == track;
4028 
4029         if (mHwSupportsPause && track->isPausing()) {
4030             track->setPaused();
4031             if (last && !mHwPaused) {
4032                 doHwPause = true;
4033                 mHwPaused = true;
4034             }
4035             tracksToRemove->add(track);
4036         } else if (track->isFlushPending()) {
4037             track->flushAck();
4038             if (last) {
4039                 flushPending = true;
4040             }
4041         } else if (mHwSupportsPause && track->isResumePending()){
4042             track->resumeAck();
4043             if (last) {
4044                 if (mHwPaused) {
4045                     doHwResume = true;
4046                     mHwPaused = false;
4047                 }
4048             }
4049         }
4050 
4051         // The first time a track is added we wait
4052         // for all its buffers to be filled before processing it.
4053         // Allow draining the buffer in case the client
4054         // app does not call stop() and relies on underrun to stop:
4055         // hence the test on (track->mRetryCount > 1).
4056         // If retryCount<=1 then track is about to underrun and be removed.
4057         uint32_t minFrames;
4058         if ((track->sharedBuffer() == 0) && !track->isStopping_1() && !track->isPausing()
4059             && (track->mRetryCount > 1)) {
4060             minFrames = mNormalFrameCount;
4061         } else {
4062             minFrames = 1;
4063         }
4064 
4065         if ((track->framesReady() >= minFrames) && track->isReady() && !track->isPaused() &&
4066                 !track->isStopping_2() && !track->isStopped())
4067         {
4068             ALOGVV("track %d s=%08x [OK]", track->name(), cblk->mServer);
4069 
4070             if (track->mFillingUpStatus == Track::FS_FILLED) {
4071                 track->mFillingUpStatus = Track::FS_ACTIVE;
4072                 // make sure processVolume_l() will apply new volume even if 0
4073                 mLeftVolFloat = mRightVolFloat = -1.0;
4074                 if (!mHwSupportsPause) {
4075                     track->resumeAck();
4076                 }
4077             }
4078 
4079             // compute volume for this track
4080             processVolume_l(track, last);
4081             if (last) {
4082                 // reset retry count
4083                 track->mRetryCount = kMaxTrackRetriesDirect;
4084                 mActiveTrack = t;
4085                 mixerStatus = MIXER_TRACKS_READY;
4086                 if (usesHwAvSync() && mHwPaused) {
4087                     doHwResume = true;
4088                     mHwPaused = false;
4089                 }
4090             }
4091         } else {
4092             // clear effect chain input buffer if the last active track started underruns
4093             // to avoid sending previous audio buffer again to effects
4094             if (!mEffectChains.isEmpty() && last) {
4095                 mEffectChains[0]->clearInputBuffer();
4096             }
4097             if (track->isStopping_1()) {
4098                 track->mState = TrackBase::STOPPING_2;
4099             }
4100             if ((track->sharedBuffer() != 0) || track->isStopped() ||
4101                     track->isStopping_2() || track->isPaused()) {
4102                 // We have consumed all the buffers of this track.
4103                 // Remove it from the list of active tracks.
4104                 size_t audioHALFrames;
4105                 if (audio_is_linear_pcm(mFormat)) {
4106                     audioHALFrames = (latency_l() * mSampleRate) / 1000;
4107                 } else {
4108                     audioHALFrames = 0;
4109                 }
4110 
4111                 size_t framesWritten = mBytesWritten / mFrameSize;
4112                 if (mStandby || !last ||
4113                         track->presentationComplete(framesWritten, audioHALFrames)) {
4114                     if (track->isStopping_2()) {
4115                         track->mState = TrackBase::STOPPED;
4116                     }
4117                     if (track->isStopped()) {
4118                         track->reset();
4119                     }
4120                     tracksToRemove->add(track);
4121                 }
4122             } else {
4123                 // No buffers for this track. Give it a few chances to
4124                 // fill a buffer, then remove it from active list.
4125                 // Only consider last track started for mixer state control
4126                 if (--(track->mRetryCount) <= 0) {
4127                     ALOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
4128                     tracksToRemove->add(track);
4129                     // indicate to client process that the track was disabled because of underrun;
4130                     // it will then automatically call start() when data is available
4131                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
4132                 } else if (last) {
4133                     mixerStatus = MIXER_TRACKS_ENABLED;
4134                     if (usesHwAvSync() && !mHwPaused && !mStandby) {
4135                         doHwPause = true;
4136                         mHwPaused = true;
4137                     }
4138                 }
4139             }
4140         }
4141     }
4142 
4143     // if an active track did not command a flush, check for pending flush on stopped tracks
4144     if (!flushPending) {
4145         for (size_t i = 0; i < mTracks.size(); i++) {
4146             if (mTracks[i]->isFlushPending()) {
4147                 mTracks[i]->flushAck();
4148                 flushPending = true;
4149             }
4150         }
4151     }
4152 
4153     // make sure the pause/flush/resume sequence is executed in the right order.
4154     // If a flush is pending and a track is active but the HW is not paused, force a HW pause
4155     // before flush and then resume HW. This can happen in case of pause/flush/resume
4156     // if resume is received before pause is executed.
4157     if (mHwSupportsPause && !mStandby &&
4158             (doHwPause || (flushPending && !mHwPaused && (count != 0)))) {
4159         mOutput->stream->pause(mOutput->stream);
4160     }
4161     if (flushPending) {
4162         flushHw_l();
4163     }
4164     if (mHwSupportsPause && !mStandby && doHwResume) {
4165         mOutput->stream->resume(mOutput->stream);
4166     }
4167     // remove all the tracks that need to be...
4168     removeTracks_l(*tracksToRemove);
4169 
4170     return mixerStatus;
4171 }
4172 
threadLoop_mix()4173 void AudioFlinger::DirectOutputThread::threadLoop_mix()
4174 {
4175     size_t frameCount = mFrameCount;
4176     int8_t *curBuf = (int8_t *)mSinkBuffer;
4177     // output audio to hardware
4178     while (frameCount) {
4179         AudioBufferProvider::Buffer buffer;
4180         buffer.frameCount = frameCount;
4181         mActiveTrack->getNextBuffer(&buffer);
4182         if (buffer.raw == NULL) {
4183             memset(curBuf, 0, frameCount * mFrameSize);
4184             break;
4185         }
4186         memcpy(curBuf, buffer.raw, buffer.frameCount * mFrameSize);
4187         frameCount -= buffer.frameCount;
4188         curBuf += buffer.frameCount * mFrameSize;
4189         mActiveTrack->releaseBuffer(&buffer);
4190     }
4191     mCurrentWriteLength = curBuf - (int8_t *)mSinkBuffer;
4192     sleepTime = 0;
4193     standbyTime = systemTime() + standbyDelay;
4194     mActiveTrack.clear();
4195 }
4196 
threadLoop_sleepTime()4197 void AudioFlinger::DirectOutputThread::threadLoop_sleepTime()
4198 {
4199     // do not write to HAL when paused
4200     if (mHwPaused || (usesHwAvSync() && mStandby)) {
4201         sleepTime = idleSleepTime;
4202         return;
4203     }
4204     if (sleepTime == 0) {
4205         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
4206             sleepTime = activeSleepTime;
4207         } else {
4208             sleepTime = idleSleepTime;
4209         }
4210     } else if (mBytesWritten != 0 && audio_is_linear_pcm(mFormat)) {
4211         memset(mSinkBuffer, 0, mFrameCount * mFrameSize);
4212         sleepTime = 0;
4213     }
4214 }
4215 
threadLoop_exit()4216 void AudioFlinger::DirectOutputThread::threadLoop_exit()
4217 {
4218     {
4219         Mutex::Autolock _l(mLock);
4220         bool flushPending = false;
4221         for (size_t i = 0; i < mTracks.size(); i++) {
4222             if (mTracks[i]->isFlushPending()) {
4223                 mTracks[i]->flushAck();
4224                 flushPending = true;
4225             }
4226         }
4227         if (flushPending) {
4228             flushHw_l();
4229         }
4230     }
4231     PlaybackThread::threadLoop_exit();
4232 }
4233 
4234 // must be called with thread mutex locked
shouldStandby_l()4235 bool AudioFlinger::DirectOutputThread::shouldStandby_l()
4236 {
4237     bool trackPaused = false;
4238 
4239     // do not put the HAL in standby when paused. AwesomePlayer clear the offloaded AudioTrack
4240     // after a timeout and we will enter standby then.
4241     if (mTracks.size() > 0) {
4242         trackPaused = mTracks[mTracks.size() - 1]->isPaused();
4243     }
4244 
4245     return !mStandby && !(trackPaused || (usesHwAvSync() && mHwPaused));
4246 }
4247 
4248 // getTrackName_l() must be called with ThreadBase::mLock held
getTrackName_l(audio_channel_mask_t channelMask __unused,audio_format_t format __unused,int sessionId __unused)4249 int AudioFlinger::DirectOutputThread::getTrackName_l(audio_channel_mask_t channelMask __unused,
4250         audio_format_t format __unused, int sessionId __unused)
4251 {
4252     return 0;
4253 }
4254 
4255 // deleteTrackName_l() must be called with ThreadBase::mLock held
deleteTrackName_l(int name __unused)4256 void AudioFlinger::DirectOutputThread::deleteTrackName_l(int name __unused)
4257 {
4258 }
4259 
4260 // checkForNewParameter_l() must be called with ThreadBase::mLock held
checkForNewParameter_l(const String8 & keyValuePair,status_t & status)4261 bool AudioFlinger::DirectOutputThread::checkForNewParameter_l(const String8& keyValuePair,
4262                                                               status_t& status)
4263 {
4264     bool reconfig = false;
4265 
4266     status = NO_ERROR;
4267 
4268     AudioParameter param = AudioParameter(keyValuePair);
4269     int value;
4270     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
4271         // forward device change to effects that have requested to be
4272         // aware of attached audio device.
4273         if (value != AUDIO_DEVICE_NONE) {
4274             mOutDevice = value;
4275             for (size_t i = 0; i < mEffectChains.size(); i++) {
4276                 mEffectChains[i]->setDevice_l(mOutDevice);
4277             }
4278         }
4279     }
4280     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
4281         // do not accept frame count changes if tracks are open as the track buffer
4282         // size depends on frame count and correct behavior would not be garantied
4283         // if frame count is changed after track creation
4284         if (!mTracks.isEmpty()) {
4285             status = INVALID_OPERATION;
4286         } else {
4287             reconfig = true;
4288         }
4289     }
4290     if (status == NO_ERROR) {
4291         status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
4292                                                 keyValuePair.string());
4293         if (!mStandby && status == INVALID_OPERATION) {
4294             mOutput->stream->common.standby(&mOutput->stream->common);
4295             mStandby = true;
4296             mBytesWritten = 0;
4297             status = mOutput->stream->common.set_parameters(&mOutput->stream->common,
4298                                                    keyValuePair.string());
4299         }
4300         if (status == NO_ERROR && reconfig) {
4301             readOutputParameters_l();
4302             sendIoConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
4303         }
4304     }
4305 
4306     return reconfig;
4307 }
4308 
activeSleepTimeUs() const4309 uint32_t AudioFlinger::DirectOutputThread::activeSleepTimeUs() const
4310 {
4311     uint32_t time;
4312     if (audio_is_linear_pcm(mFormat)) {
4313         time = PlaybackThread::activeSleepTimeUs();
4314     } else {
4315         time = 10000;
4316     }
4317     return time;
4318 }
4319 
idleSleepTimeUs() const4320 uint32_t AudioFlinger::DirectOutputThread::idleSleepTimeUs() const
4321 {
4322     uint32_t time;
4323     if (audio_is_linear_pcm(mFormat)) {
4324         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
4325     } else {
4326         time = 10000;
4327     }
4328     return time;
4329 }
4330 
suspendSleepTimeUs() const4331 uint32_t AudioFlinger::DirectOutputThread::suspendSleepTimeUs() const
4332 {
4333     uint32_t time;
4334     if (audio_is_linear_pcm(mFormat)) {
4335         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000);
4336     } else {
4337         time = 10000;
4338     }
4339     return time;
4340 }
4341 
cacheParameters_l()4342 void AudioFlinger::DirectOutputThread::cacheParameters_l()
4343 {
4344     PlaybackThread::cacheParameters_l();
4345 
4346     // use shorter standby delay as on normal output to release
4347     // hardware resources as soon as possible
4348     if (audio_is_linear_pcm(mFormat)) {
4349         standbyDelay = microseconds(activeSleepTime*2);
4350     } else {
4351         standbyDelay = kOffloadStandbyDelayNs;
4352     }
4353 }
4354 
flushHw_l()4355 void AudioFlinger::DirectOutputThread::flushHw_l()
4356 {
4357     if (mOutput->stream->flush != NULL) {
4358         mOutput->stream->flush(mOutput->stream);
4359     }
4360     mHwPaused = false;
4361 }
4362 
4363 // ----------------------------------------------------------------------------
4364 
AsyncCallbackThread(const wp<AudioFlinger::PlaybackThread> & playbackThread)4365 AudioFlinger::AsyncCallbackThread::AsyncCallbackThread(
4366         const wp<AudioFlinger::PlaybackThread>& playbackThread)
4367     :   Thread(false /*canCallJava*/),
4368         mPlaybackThread(playbackThread),
4369         mWriteAckSequence(0),
4370         mDrainSequence(0)
4371 {
4372 }
4373 
~AsyncCallbackThread()4374 AudioFlinger::AsyncCallbackThread::~AsyncCallbackThread()
4375 {
4376 }
4377 
onFirstRef()4378 void AudioFlinger::AsyncCallbackThread::onFirstRef()
4379 {
4380     run("Offload Cbk", ANDROID_PRIORITY_URGENT_AUDIO);
4381 }
4382 
threadLoop()4383 bool AudioFlinger::AsyncCallbackThread::threadLoop()
4384 {
4385     while (!exitPending()) {
4386         uint32_t writeAckSequence;
4387         uint32_t drainSequence;
4388 
4389         {
4390             Mutex::Autolock _l(mLock);
4391             while (!((mWriteAckSequence & 1) ||
4392                      (mDrainSequence & 1) ||
4393                      exitPending())) {
4394                 mWaitWorkCV.wait(mLock);
4395             }
4396 
4397             if (exitPending()) {
4398                 break;
4399             }
4400             ALOGV("AsyncCallbackThread mWriteAckSequence %d mDrainSequence %d",
4401                   mWriteAckSequence, mDrainSequence);
4402             writeAckSequence = mWriteAckSequence;
4403             mWriteAckSequence &= ~1;
4404             drainSequence = mDrainSequence;
4405             mDrainSequence &= ~1;
4406         }
4407         {
4408             sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote();
4409             if (playbackThread != 0) {
4410                 if (writeAckSequence & 1) {
4411                     playbackThread->resetWriteBlocked(writeAckSequence >> 1);
4412                 }
4413                 if (drainSequence & 1) {
4414                     playbackThread->resetDraining(drainSequence >> 1);
4415                 }
4416             }
4417         }
4418     }
4419     return false;
4420 }
4421 
exit()4422 void AudioFlinger::AsyncCallbackThread::exit()
4423 {
4424     ALOGV("AsyncCallbackThread::exit");
4425     Mutex::Autolock _l(mLock);
4426     requestExit();
4427     mWaitWorkCV.broadcast();
4428 }
4429 
setWriteBlocked(uint32_t sequence)4430 void AudioFlinger::AsyncCallbackThread::setWriteBlocked(uint32_t sequence)
4431 {
4432     Mutex::Autolock _l(mLock);
4433     // bit 0 is cleared
4434     mWriteAckSequence = sequence << 1;
4435 }
4436 
resetWriteBlocked()4437 void AudioFlinger::AsyncCallbackThread::resetWriteBlocked()
4438 {
4439     Mutex::Autolock _l(mLock);
4440     // ignore unexpected callbacks
4441     if (mWriteAckSequence & 2) {
4442         mWriteAckSequence |= 1;
4443         mWaitWorkCV.signal();
4444     }
4445 }
4446 
setDraining(uint32_t sequence)4447 void AudioFlinger::AsyncCallbackThread::setDraining(uint32_t sequence)
4448 {
4449     Mutex::Autolock _l(mLock);
4450     // bit 0 is cleared
4451     mDrainSequence = sequence << 1;
4452 }
4453 
resetDraining()4454 void AudioFlinger::AsyncCallbackThread::resetDraining()
4455 {
4456     Mutex::Autolock _l(mLock);
4457     // ignore unexpected callbacks
4458     if (mDrainSequence & 2) {
4459         mDrainSequence |= 1;
4460         mWaitWorkCV.signal();
4461     }
4462 }
4463 
4464 
4465 // ----------------------------------------------------------------------------
OffloadThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,uint32_t device)4466 AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger,
4467         AudioStreamOut* output, audio_io_handle_t id, uint32_t device)
4468     :   DirectOutputThread(audioFlinger, output, id, device, OFFLOAD),
4469         mPausedBytesRemaining(0)
4470 {
4471     //FIXME: mStandby should be set to true by ThreadBase constructor
4472     mStandby = true;
4473 }
4474 
threadLoop_exit()4475 void AudioFlinger::OffloadThread::threadLoop_exit()
4476 {
4477     if (mFlushPending || mHwPaused) {
4478         // If a flush is pending or track was paused, just discard buffered data
4479         flushHw_l();
4480     } else {
4481         mMixerStatus = MIXER_DRAIN_ALL;
4482         threadLoop_drain();
4483     }
4484     if (mUseAsyncWrite) {
4485         ALOG_ASSERT(mCallbackThread != 0);
4486         mCallbackThread->exit();
4487     }
4488     PlaybackThread::threadLoop_exit();
4489 }
4490 
prepareTracks_l(Vector<sp<Track>> * tracksToRemove)4491 AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTracks_l(
4492     Vector< sp<Track> > *tracksToRemove
4493 )
4494 {
4495     size_t count = mActiveTracks.size();
4496 
4497     mixer_state mixerStatus = MIXER_IDLE;
4498     bool doHwPause = false;
4499     bool doHwResume = false;
4500 
4501     ALOGV("OffloadThread::prepareTracks_l active tracks %d", count);
4502 
4503     // find out which tracks need to be processed
4504     for (size_t i = 0; i < count; i++) {
4505         sp<Track> t = mActiveTracks[i].promote();
4506         // The track died recently
4507         if (t == 0) {
4508             continue;
4509         }
4510         Track* const track = t.get();
4511         audio_track_cblk_t* cblk = track->cblk();
4512         // Only consider last track started for volume and mixer state control.
4513         // In theory an older track could underrun and restart after the new one starts
4514         // but as we only care about the transition phase between two tracks on a
4515         // direct output, it is not a problem to ignore the underrun case.
4516         sp<Track> l = mLatestActiveTrack.promote();
4517         bool last = l.get() == track;
4518 
4519         if (track->isInvalid()) {
4520             ALOGW("An invalidated track shouldn't be in active list");
4521             tracksToRemove->add(track);
4522             continue;
4523         }
4524 
4525         if (track->mState == TrackBase::IDLE) {
4526             ALOGW("An idle track shouldn't be in active list");
4527             continue;
4528         }
4529 
4530         if (track->isPausing()) {
4531             track->setPaused();
4532             if (last) {
4533                 if (!mHwPaused) {
4534                     doHwPause = true;
4535                     mHwPaused = true;
4536                 }
4537                 // If we were part way through writing the mixbuffer to
4538                 // the HAL we must save this until we resume
4539                 // BUG - this will be wrong if a different track is made active,
4540                 // in that case we want to discard the pending data in the
4541                 // mixbuffer and tell the client to present it again when the
4542                 // track is resumed
4543                 mPausedWriteLength = mCurrentWriteLength;
4544                 mPausedBytesRemaining = mBytesRemaining;
4545                 mBytesRemaining = 0;    // stop writing
4546             }
4547             tracksToRemove->add(track);
4548         } else if (track->isFlushPending()) {
4549             track->flushAck();
4550             if (last) {
4551                 mFlushPending = true;
4552             }
4553         } else if (track->isResumePending()){
4554             track->resumeAck();
4555             if (last) {
4556                 if (mPausedBytesRemaining) {
4557                     // Need to continue write that was interrupted
4558                     mCurrentWriteLength = mPausedWriteLength;
4559                     mBytesRemaining = mPausedBytesRemaining;
4560                     mPausedBytesRemaining = 0;
4561                 }
4562                 if (mHwPaused) {
4563                     doHwResume = true;
4564                     mHwPaused = false;
4565                     // threadLoop_mix() will handle the case that we need to
4566                     // resume an interrupted write
4567                 }
4568                 // enable write to audio HAL
4569                 sleepTime = 0;
4570 
4571                 // Do not handle new data in this iteration even if track->framesReady()
4572                 mixerStatus = MIXER_TRACKS_ENABLED;
4573             }
4574         }  else if (track->framesReady() && track->isReady() &&
4575                 !track->isPaused() && !track->isTerminated() && !track->isStopping_2()) {
4576             ALOGVV("OffloadThread: track %d s=%08x [OK]", track->name(), cblk->mServer);
4577             if (track->mFillingUpStatus == Track::FS_FILLED) {
4578                 track->mFillingUpStatus = Track::FS_ACTIVE;
4579                 // make sure processVolume_l() will apply new volume even if 0
4580                 mLeftVolFloat = mRightVolFloat = -1.0;
4581             }
4582 
4583             if (last) {
4584                 sp<Track> previousTrack = mPreviousTrack.promote();
4585                 if (previousTrack != 0) {
4586                     if (track != previousTrack.get()) {
4587                         // Flush any data still being written from last track
4588                         mBytesRemaining = 0;
4589                         if (mPausedBytesRemaining) {
4590                             // Last track was paused so we also need to flush saved
4591                             // mixbuffer state and invalidate track so that it will
4592                             // re-submit that unwritten data when it is next resumed
4593                             mPausedBytesRemaining = 0;
4594                             // Invalidate is a bit drastic - would be more efficient
4595                             // to have a flag to tell client that some of the
4596                             // previously written data was lost
4597                             previousTrack->invalidate();
4598                         }
4599                         // flush data already sent to the DSP if changing audio session as audio
4600                         // comes from a different source. Also invalidate previous track to force a
4601                         // seek when resuming.
4602                         if (previousTrack->sessionId() != track->sessionId()) {
4603                             previousTrack->invalidate();
4604                         }
4605                     }
4606                 }
4607                 mPreviousTrack = track;
4608                 // reset retry count
4609                 track->mRetryCount = kMaxTrackRetriesOffload;
4610                 mActiveTrack = t;
4611                 mixerStatus = MIXER_TRACKS_READY;
4612             }
4613         } else {
4614             ALOGVV("OffloadThread: track %d s=%08x [NOT READY]", track->name(), cblk->mServer);
4615             if (track->isStopping_1()) {
4616                 // Hardware buffer can hold a large amount of audio so we must
4617                 // wait for all current track's data to drain before we say
4618                 // that the track is stopped.
4619                 if (mBytesRemaining == 0) {
4620                     // Only start draining when all data in mixbuffer
4621                     // has been written
4622                     ALOGV("OffloadThread: underrun and STOPPING_1 -> draining, STOPPING_2");
4623                     track->mState = TrackBase::STOPPING_2; // so presentation completes after drain
4624                     // do not drain if no data was ever sent to HAL (mStandby == true)
4625                     if (last && !mStandby) {
4626                         // do not modify drain sequence if we are already draining. This happens
4627                         // when resuming from pause after drain.
4628                         if ((mDrainSequence & 1) == 0) {
4629                             sleepTime = 0;
4630                             standbyTime = systemTime() + standbyDelay;
4631                             mixerStatus = MIXER_DRAIN_TRACK;
4632                             mDrainSequence += 2;
4633                         }
4634                         if (mHwPaused) {
4635                             // It is possible to move from PAUSED to STOPPING_1 without
4636                             // a resume so we must ensure hardware is running
4637                             doHwResume = true;
4638                             mHwPaused = false;
4639                         }
4640                     }
4641                 }
4642             } else if (track->isStopping_2()) {
4643                 // Drain has completed or we are in standby, signal presentation complete
4644                 if (!(mDrainSequence & 1) || !last || mStandby) {
4645                     track->mState = TrackBase::STOPPED;
4646                     size_t audioHALFrames =
4647                             (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
4648                     size_t framesWritten =
4649                             mBytesWritten / audio_stream_out_frame_size(mOutput->stream);
4650                     track->presentationComplete(framesWritten, audioHALFrames);
4651                     track->reset();
4652                     tracksToRemove->add(track);
4653                 }
4654             } else {
4655                 // No buffers for this track. Give it a few chances to
4656                 // fill a buffer, then remove it from active list.
4657                 if (--(track->mRetryCount) <= 0) {
4658                     ALOGV("OffloadThread: BUFFER TIMEOUT: remove(%d) from active list",
4659                           track->name());
4660                     tracksToRemove->add(track);
4661                     // indicate to client process that the track was disabled because of underrun;
4662                     // it will then automatically call start() when data is available
4663                     android_atomic_or(CBLK_DISABLED, &cblk->mFlags);
4664                 } else if (last){
4665                     mixerStatus = MIXER_TRACKS_ENABLED;
4666                 }
4667             }
4668         }
4669         // compute volume for this track
4670         processVolume_l(track, last);
4671     }
4672 
4673     // make sure the pause/flush/resume sequence is executed in the right order.
4674     // If a flush is pending and a track is active but the HW is not paused, force a HW pause
4675     // before flush and then resume HW. This can happen in case of pause/flush/resume
4676     // if resume is received before pause is executed.
4677     if (!mStandby && (doHwPause || (mFlushPending && !mHwPaused && (count != 0)))) {
4678         mOutput->stream->pause(mOutput->stream);
4679     }
4680     if (mFlushPending) {
4681         flushHw_l();
4682         mFlushPending = false;
4683     }
4684     if (!mStandby && doHwResume) {
4685         mOutput->stream->resume(mOutput->stream);
4686     }
4687 
4688     // remove all the tracks that need to be...
4689     removeTracks_l(*tracksToRemove);
4690 
4691     return mixerStatus;
4692 }
4693 
4694 // must be called with thread mutex locked
waitingAsyncCallback_l()4695 bool AudioFlinger::OffloadThread::waitingAsyncCallback_l()
4696 {
4697     ALOGVV("waitingAsyncCallback_l mWriteAckSequence %d mDrainSequence %d",
4698           mWriteAckSequence, mDrainSequence);
4699     if (mUseAsyncWrite && ((mWriteAckSequence & 1) || (mDrainSequence & 1))) {
4700         return true;
4701     }
4702     return false;
4703 }
4704 
waitingAsyncCallback()4705 bool AudioFlinger::OffloadThread::waitingAsyncCallback()
4706 {
4707     Mutex::Autolock _l(mLock);
4708     return waitingAsyncCallback_l();
4709 }
4710 
flushHw_l()4711 void AudioFlinger::OffloadThread::flushHw_l()
4712 {
4713     DirectOutputThread::flushHw_l();
4714     // Flush anything still waiting in the mixbuffer
4715     mCurrentWriteLength = 0;
4716     mBytesRemaining = 0;
4717     mPausedWriteLength = 0;
4718     mPausedBytesRemaining = 0;
4719 
4720     if (mUseAsyncWrite) {
4721         // discard any pending drain or write ack by incrementing sequence
4722         mWriteAckSequence = (mWriteAckSequence + 2) & ~1;
4723         mDrainSequence = (mDrainSequence + 2) & ~1;
4724         ALOG_ASSERT(mCallbackThread != 0);
4725         mCallbackThread->setWriteBlocked(mWriteAckSequence);
4726         mCallbackThread->setDraining(mDrainSequence);
4727     }
4728 }
4729 
onAddNewTrack_l()4730 void AudioFlinger::OffloadThread::onAddNewTrack_l()
4731 {
4732     sp<Track> previousTrack = mPreviousTrack.promote();
4733     sp<Track> latestTrack = mLatestActiveTrack.promote();
4734 
4735     if (previousTrack != 0 && latestTrack != 0 &&
4736         (previousTrack->sessionId() != latestTrack->sessionId())) {
4737         mFlushPending = true;
4738     }
4739     PlaybackThread::onAddNewTrack_l();
4740 }
4741 
4742 // ----------------------------------------------------------------------------
4743 
DuplicatingThread(const sp<AudioFlinger> & audioFlinger,AudioFlinger::MixerThread * mainThread,audio_io_handle_t id)4744 AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger,
4745         AudioFlinger::MixerThread* mainThread, audio_io_handle_t id)
4746     :   MixerThread(audioFlinger, mainThread->getOutput(), id, mainThread->outDevice(),
4747                 DUPLICATING),
4748         mWaitTimeMs(UINT_MAX)
4749 {
4750     addOutputTrack(mainThread);
4751 }
4752 
~DuplicatingThread()4753 AudioFlinger::DuplicatingThread::~DuplicatingThread()
4754 {
4755     for (size_t i = 0; i < mOutputTracks.size(); i++) {
4756         mOutputTracks[i]->destroy();
4757     }
4758 }
4759 
threadLoop_mix()4760 void AudioFlinger::DuplicatingThread::threadLoop_mix()
4761 {
4762     // mix buffers...
4763     if (outputsReady(outputTracks)) {
4764         mAudioMixer->process(AudioBufferProvider::kInvalidPTS);
4765     } else {
4766         if (mMixerBufferValid) {
4767             memset(mMixerBuffer, 0, mMixerBufferSize);
4768         } else {
4769             memset(mSinkBuffer, 0, mSinkBufferSize);
4770         }
4771     }
4772     sleepTime = 0;
4773     writeFrames = mNormalFrameCount;
4774     mCurrentWriteLength = mSinkBufferSize;
4775     standbyTime = systemTime() + standbyDelay;
4776 }
4777 
threadLoop_sleepTime()4778 void AudioFlinger::DuplicatingThread::threadLoop_sleepTime()
4779 {
4780     if (sleepTime == 0) {
4781         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
4782             sleepTime = activeSleepTime;
4783         } else {
4784             sleepTime = idleSleepTime;
4785         }
4786     } else if (mBytesWritten != 0) {
4787         if (mMixerStatus == MIXER_TRACKS_ENABLED) {
4788             writeFrames = mNormalFrameCount;
4789             memset(mSinkBuffer, 0, mSinkBufferSize);
4790         } else {
4791             // flush remaining overflow buffers in output tracks
4792             writeFrames = 0;
4793         }
4794         sleepTime = 0;
4795     }
4796 }
4797 
threadLoop_write()4798 ssize_t AudioFlinger::DuplicatingThread::threadLoop_write()
4799 {
4800     // We convert the duplicating thread format to AUDIO_FORMAT_PCM_16_BIT
4801     // for delivery downstream as needed. This in-place conversion is safe as
4802     // AUDIO_FORMAT_PCM_16_BIT is smaller than any other supported format
4803     // (AUDIO_FORMAT_PCM_8_BIT is not allowed here).
4804     if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
4805         memcpy_by_audio_format(mSinkBuffer, AUDIO_FORMAT_PCM_16_BIT,
4806                                mSinkBuffer, mFormat, writeFrames * mChannelCount);
4807     }
4808     for (size_t i = 0; i < outputTracks.size(); i++) {
4809         outputTracks[i]->write(reinterpret_cast<int16_t*>(mSinkBuffer), writeFrames);
4810     }
4811     mStandby = false;
4812     return (ssize_t)mSinkBufferSize;
4813 }
4814 
threadLoop_standby()4815 void AudioFlinger::DuplicatingThread::threadLoop_standby()
4816 {
4817     // DuplicatingThread implements standby by stopping all tracks
4818     for (size_t i = 0; i < outputTracks.size(); i++) {
4819         outputTracks[i]->stop();
4820     }
4821 }
4822 
saveOutputTracks()4823 void AudioFlinger::DuplicatingThread::saveOutputTracks()
4824 {
4825     outputTracks = mOutputTracks;
4826 }
4827 
clearOutputTracks()4828 void AudioFlinger::DuplicatingThread::clearOutputTracks()
4829 {
4830     outputTracks.clear();
4831 }
4832 
addOutputTrack(MixerThread * thread)4833 void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)
4834 {
4835     Mutex::Autolock _l(mLock);
4836     // FIXME explain this formula
4837     size_t frameCount = (3 * mNormalFrameCount * mSampleRate) / thread->sampleRate();
4838     // OutputTrack is forced to AUDIO_FORMAT_PCM_16_BIT regardless of mFormat
4839     // due to current usage case and restrictions on the AudioBufferProvider.
4840     // Actual buffer conversion is done in threadLoop_write().
4841     //
4842     // TODO: This may change in the future, depending on multichannel
4843     // (and non int16_t*) support on AF::PlaybackThread::OutputTrack
4844     OutputTrack *outputTrack = new OutputTrack(thread,
4845                                             this,
4846                                             mSampleRate,
4847                                             AUDIO_FORMAT_PCM_16_BIT,
4848                                             mChannelMask,
4849                                             frameCount,
4850                                             IPCThreadState::self()->getCallingUid());
4851     if (outputTrack->cblk() != NULL) {
4852         thread->setStreamVolume(AUDIO_STREAM_PATCH, 1.0f);
4853         mOutputTracks.add(outputTrack);
4854         ALOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
4855         updateWaitTime_l();
4856     }
4857 }
4858 
removeOutputTrack(MixerThread * thread)4859 void AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread)
4860 {
4861     Mutex::Autolock _l(mLock);
4862     for (size_t i = 0; i < mOutputTracks.size(); i++) {
4863         if (mOutputTracks[i]->thread() == thread) {
4864             mOutputTracks[i]->destroy();
4865             mOutputTracks.removeAt(i);
4866             updateWaitTime_l();
4867             return;
4868         }
4869     }
4870     ALOGV("removeOutputTrack(): unkonwn thread: %p", thread);
4871 }
4872 
4873 // caller must hold mLock
updateWaitTime_l()4874 void AudioFlinger::DuplicatingThread::updateWaitTime_l()
4875 {
4876     mWaitTimeMs = UINT_MAX;
4877     for (size_t i = 0; i < mOutputTracks.size(); i++) {
4878         sp<ThreadBase> strong = mOutputTracks[i]->thread().promote();
4879         if (strong != 0) {
4880             uint32_t waitTimeMs = (strong->frameCount() * 2 * 1000) / strong->sampleRate();
4881             if (waitTimeMs < mWaitTimeMs) {
4882                 mWaitTimeMs = waitTimeMs;
4883             }
4884         }
4885     }
4886 }
4887 
4888 
outputsReady(const SortedVector<sp<OutputTrack>> & outputTracks)4889 bool AudioFlinger::DuplicatingThread::outputsReady(
4890         const SortedVector< sp<OutputTrack> > &outputTracks)
4891 {
4892     for (size_t i = 0; i < outputTracks.size(); i++) {
4893         sp<ThreadBase> thread = outputTracks[i]->thread().promote();
4894         if (thread == 0) {
4895             ALOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p",
4896                     outputTracks[i].get());
4897             return false;
4898         }
4899         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
4900         // see note at standby() declaration
4901         if (playbackThread->standby() && !playbackThread->isSuspended()) {
4902             ALOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(),
4903                     thread.get());
4904             return false;
4905         }
4906     }
4907     return true;
4908 }
4909 
activeSleepTimeUs() const4910 uint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs() const
4911 {
4912     return (mWaitTimeMs * 1000) / 2;
4913 }
4914 
cacheParameters_l()4915 void AudioFlinger::DuplicatingThread::cacheParameters_l()
4916 {
4917     // updateWaitTime_l() sets mWaitTimeMs, which affects activeSleepTimeUs(), so call it first
4918     updateWaitTime_l();
4919 
4920     MixerThread::cacheParameters_l();
4921 }
4922 
4923 // ----------------------------------------------------------------------------
4924 //      Record
4925 // ----------------------------------------------------------------------------
4926 
RecordThread(const sp<AudioFlinger> & audioFlinger,AudioStreamIn * input,audio_io_handle_t id,audio_devices_t outDevice,audio_devices_t inDevice,const sp<NBAIO_Sink> & teeSink)4927 AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,
4928                                          AudioStreamIn *input,
4929                                          audio_io_handle_t id,
4930                                          audio_devices_t outDevice,
4931                                          audio_devices_t inDevice
4932 #ifdef TEE_SINK
4933                                          , const sp<NBAIO_Sink>& teeSink
4934 #endif
4935                                          ) :
4936     ThreadBase(audioFlinger, id, outDevice, inDevice, RECORD),
4937     mInput(input), mActiveTracksGen(0), mRsmpInBuffer(NULL),
4938     // mRsmpInFrames and mRsmpInFramesP2 are set by readInputParameters_l()
4939     mRsmpInRear(0)
4940 #ifdef TEE_SINK
4941     , mTeeSink(teeSink)
4942 #endif
4943     , mReadOnlyHeap(new MemoryDealer(kRecordThreadReadOnlyHeapSize,
4944             "RecordThreadRO", MemoryHeapBase::READ_ONLY))
4945     // mFastCapture below
4946     , mFastCaptureFutex(0)
4947     // mInputSource
4948     // mPipeSink
4949     // mPipeSource
4950     , mPipeFramesP2(0)
4951     // mPipeMemory
4952     // mFastCaptureNBLogWriter
4953     , mFastTrackAvail(false)
4954 {
4955     snprintf(mName, kNameLength, "AudioIn_%X", id);
4956     mNBLogWriter = audioFlinger->newWriter_l(kLogSize, mName);
4957 
4958     readInputParameters_l();
4959 
4960     // create an NBAIO source for the HAL input stream, and negotiate
4961     mInputSource = new AudioStreamInSource(input->stream);
4962     size_t numCounterOffers = 0;
4963     const NBAIO_Format offers[1] = {Format_from_SR_C(mSampleRate, mChannelCount, mFormat)};
4964     ssize_t index = mInputSource->negotiate(offers, 1, NULL, numCounterOffers);
4965     ALOG_ASSERT(index == 0);
4966 
4967     // initialize fast capture depending on configuration
4968     bool initFastCapture;
4969     switch (kUseFastCapture) {
4970     case FastCapture_Never:
4971         initFastCapture = false;
4972         break;
4973     case FastCapture_Always:
4974         initFastCapture = true;
4975         break;
4976     case FastCapture_Static:
4977         uint32_t primaryOutputSampleRate;
4978         {
4979             AutoMutex _l(audioFlinger->mHardwareLock);
4980             primaryOutputSampleRate = audioFlinger->mPrimaryOutputSampleRate;
4981         }
4982         initFastCapture =
4983                 // either capture sample rate is same as (a reasonable) primary output sample rate
4984                 (((primaryOutputSampleRate == 44100 || primaryOutputSampleRate == 48000) &&
4985                     (mSampleRate == primaryOutputSampleRate)) ||
4986                 // or primary output sample rate is unknown, and capture sample rate is reasonable
4987                 ((primaryOutputSampleRate == 0) &&
4988                     ((mSampleRate == 44100 || mSampleRate == 48000)))) &&
4989                 // and the buffer size is < 12 ms
4990                 (mFrameCount * 1000) / mSampleRate < 12;
4991         break;
4992     // case FastCapture_Dynamic:
4993     }
4994 
4995     if (initFastCapture) {
4996         // create a Pipe for FastMixer to write to, and for us and fast tracks to read from
4997         NBAIO_Format format = mInputSource->format();
4998         size_t pipeFramesP2 = roundup(mSampleRate / 25);    // double-buffering of 20 ms each
4999         size_t pipeSize = pipeFramesP2 * Format_frameSize(format);
5000         void *pipeBuffer;
5001         const sp<MemoryDealer> roHeap(readOnlyHeap());
5002         sp<IMemory> pipeMemory;
5003         if ((roHeap == 0) ||
5004                 (pipeMemory = roHeap->allocate(pipeSize)) == 0 ||
5005                 (pipeBuffer = pipeMemory->pointer()) == NULL) {
5006             ALOGE("not enough memory for pipe buffer size=%zu", pipeSize);
5007             goto failed;
5008         }
5009         // pipe will be shared directly with fast clients, so clear to avoid leaking old information
5010         memset(pipeBuffer, 0, pipeSize);
5011         Pipe *pipe = new Pipe(pipeFramesP2, format, pipeBuffer);
5012         const NBAIO_Format offers[1] = {format};
5013         size_t numCounterOffers = 0;
5014         ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers);
5015         ALOG_ASSERT(index == 0);
5016         mPipeSink = pipe;
5017         PipeReader *pipeReader = new PipeReader(*pipe);
5018         numCounterOffers = 0;
5019         index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers);
5020         ALOG_ASSERT(index == 0);
5021         mPipeSource = pipeReader;
5022         mPipeFramesP2 = pipeFramesP2;
5023         mPipeMemory = pipeMemory;
5024 
5025         // create fast capture
5026         mFastCapture = new FastCapture();
5027         FastCaptureStateQueue *sq = mFastCapture->sq();
5028 #ifdef STATE_QUEUE_DUMP
5029         // FIXME
5030 #endif
5031         FastCaptureState *state = sq->begin();
5032         state->mCblk = NULL;
5033         state->mInputSource = mInputSource.get();
5034         state->mInputSourceGen++;
5035         state->mPipeSink = pipe;
5036         state->mPipeSinkGen++;
5037         state->mFrameCount = mFrameCount;
5038         state->mCommand = FastCaptureState::COLD_IDLE;
5039         // already done in constructor initialization list
5040         //mFastCaptureFutex = 0;
5041         state->mColdFutexAddr = &mFastCaptureFutex;
5042         state->mColdGen++;
5043         state->mDumpState = &mFastCaptureDumpState;
5044 #ifdef TEE_SINK
5045         // FIXME
5046 #endif
5047         mFastCaptureNBLogWriter = audioFlinger->newWriter_l(kFastCaptureLogSize, "FastCapture");
5048         state->mNBLogWriter = mFastCaptureNBLogWriter.get();
5049         sq->end();
5050         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
5051 
5052         // start the fast capture
5053         mFastCapture->run("FastCapture", ANDROID_PRIORITY_URGENT_AUDIO);
5054         pid_t tid = mFastCapture->getTid();
5055         int err = requestPriority(getpid_cached, tid, kPriorityFastMixer);
5056         if (err != 0) {
5057             ALOGW("Policy SCHED_FIFO priority %d is unavailable for pid %d tid %d; error %d",
5058                     kPriorityFastCapture, getpid_cached, tid, err);
5059         }
5060 
5061 #ifdef AUDIO_WATCHDOG
5062         // FIXME
5063 #endif
5064 
5065         mFastTrackAvail = true;
5066     }
5067 failed: ;
5068 
5069     // FIXME mNormalSource
5070 }
5071 
5072 
~RecordThread()5073 AudioFlinger::RecordThread::~RecordThread()
5074 {
5075     if (mFastCapture != 0) {
5076         FastCaptureStateQueue *sq = mFastCapture->sq();
5077         FastCaptureState *state = sq->begin();
5078         if (state->mCommand == FastCaptureState::COLD_IDLE) {
5079             int32_t old = android_atomic_inc(&mFastCaptureFutex);
5080             if (old == -1) {
5081                 (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
5082             }
5083         }
5084         state->mCommand = FastCaptureState::EXIT;
5085         sq->end();
5086         sq->push(FastCaptureStateQueue::BLOCK_UNTIL_PUSHED);
5087         mFastCapture->join();
5088         mFastCapture.clear();
5089     }
5090     mAudioFlinger->unregisterWriter(mFastCaptureNBLogWriter);
5091     mAudioFlinger->unregisterWriter(mNBLogWriter);
5092     delete[] mRsmpInBuffer;
5093 }
5094 
onFirstRef()5095 void AudioFlinger::RecordThread::onFirstRef()
5096 {
5097     run(mName, PRIORITY_URGENT_AUDIO);
5098 }
5099 
threadLoop()5100 bool AudioFlinger::RecordThread::threadLoop()
5101 {
5102     nsecs_t lastWarning = 0;
5103 
5104     inputStandBy();
5105 
5106 reacquire_wakelock:
5107     sp<RecordTrack> activeTrack;
5108     int activeTracksGen;
5109     {
5110         Mutex::Autolock _l(mLock);
5111         size_t size = mActiveTracks.size();
5112         activeTracksGen = mActiveTracksGen;
5113         if (size > 0) {
5114             // FIXME an arbitrary choice
5115             activeTrack = mActiveTracks[0];
5116             acquireWakeLock_l(activeTrack->uid());
5117             if (size > 1) {
5118                 SortedVector<int> tmp;
5119                 for (size_t i = 0; i < size; i++) {
5120                     tmp.add(mActiveTracks[i]->uid());
5121                 }
5122                 updateWakeLockUids_l(tmp);
5123             }
5124         } else {
5125             acquireWakeLock_l(-1);
5126         }
5127     }
5128 
5129     // used to request a deferred sleep, to be executed later while mutex is unlocked
5130     uint32_t sleepUs = 0;
5131 
5132     // loop while there is work to do
5133     for (;;) {
5134         Vector< sp<EffectChain> > effectChains;
5135 
5136         // sleep with mutex unlocked
5137         if (sleepUs > 0) {
5138             usleep(sleepUs);
5139             sleepUs = 0;
5140         }
5141 
5142         // activeTracks accumulates a copy of a subset of mActiveTracks
5143         Vector< sp<RecordTrack> > activeTracks;
5144 
5145         // reference to the (first and only) active fast track
5146         sp<RecordTrack> fastTrack;
5147 
5148         // reference to a fast track which is about to be removed
5149         sp<RecordTrack> fastTrackToRemove;
5150 
5151         { // scope for mLock
5152             Mutex::Autolock _l(mLock);
5153 
5154             processConfigEvents_l();
5155 
5156             // check exitPending here because checkForNewParameters_l() and
5157             // checkForNewParameters_l() can temporarily release mLock
5158             if (exitPending()) {
5159                 break;
5160             }
5161 
5162             // if no active track(s), then standby and release wakelock
5163             size_t size = mActiveTracks.size();
5164             if (size == 0) {
5165                 standbyIfNotAlreadyInStandby();
5166                 // exitPending() can't become true here
5167                 releaseWakeLock_l();
5168                 ALOGV("RecordThread: loop stopping");
5169                 // go to sleep
5170                 mWaitWorkCV.wait(mLock);
5171                 ALOGV("RecordThread: loop starting");
5172                 goto reacquire_wakelock;
5173             }
5174 
5175             if (mActiveTracksGen != activeTracksGen) {
5176                 activeTracksGen = mActiveTracksGen;
5177                 SortedVector<int> tmp;
5178                 for (size_t i = 0; i < size; i++) {
5179                     tmp.add(mActiveTracks[i]->uid());
5180                 }
5181                 updateWakeLockUids_l(tmp);
5182             }
5183 
5184             bool doBroadcast = false;
5185             for (size_t i = 0; i < size; ) {
5186 
5187                 activeTrack = mActiveTracks[i];
5188                 if (activeTrack->isTerminated()) {
5189                     if (activeTrack->isFastTrack()) {
5190                         ALOG_ASSERT(fastTrackToRemove == 0);
5191                         fastTrackToRemove = activeTrack;
5192                     }
5193                     removeTrack_l(activeTrack);
5194                     mActiveTracks.remove(activeTrack);
5195                     mActiveTracksGen++;
5196                     size--;
5197                     continue;
5198                 }
5199 
5200                 TrackBase::track_state activeTrackState = activeTrack->mState;
5201                 switch (activeTrackState) {
5202 
5203                 case TrackBase::PAUSING:
5204                     mActiveTracks.remove(activeTrack);
5205                     mActiveTracksGen++;
5206                     doBroadcast = true;
5207                     size--;
5208                     continue;
5209 
5210                 case TrackBase::STARTING_1:
5211                     sleepUs = 10000;
5212                     i++;
5213                     continue;
5214 
5215                 case TrackBase::STARTING_2:
5216                     doBroadcast = true;
5217                     mStandby = false;
5218                     activeTrack->mState = TrackBase::ACTIVE;
5219                     break;
5220 
5221                 case TrackBase::ACTIVE:
5222                     break;
5223 
5224                 case TrackBase::IDLE:
5225                     i++;
5226                     continue;
5227 
5228                 default:
5229                     LOG_ALWAYS_FATAL("Unexpected activeTrackState %d", activeTrackState);
5230                 }
5231 
5232                 activeTracks.add(activeTrack);
5233                 i++;
5234 
5235                 if (activeTrack->isFastTrack()) {
5236                     ALOG_ASSERT(!mFastTrackAvail);
5237                     ALOG_ASSERT(fastTrack == 0);
5238                     fastTrack = activeTrack;
5239                 }
5240             }
5241             if (doBroadcast) {
5242                 mStartStopCond.broadcast();
5243             }
5244 
5245             // sleep if there are no active tracks to process
5246             if (activeTracks.size() == 0) {
5247                 if (sleepUs == 0) {
5248                     sleepUs = kRecordThreadSleepUs;
5249                 }
5250                 continue;
5251             }
5252             sleepUs = 0;
5253 
5254             lockEffectChains_l(effectChains);
5255         }
5256 
5257         // thread mutex is now unlocked, mActiveTracks unknown, activeTracks.size() > 0
5258 
5259         size_t size = effectChains.size();
5260         for (size_t i = 0; i < size; i++) {
5261             // thread mutex is not locked, but effect chain is locked
5262             effectChains[i]->process_l();
5263         }
5264 
5265         // Push a new fast capture state if fast capture is not already running, or cblk change
5266         if (mFastCapture != 0) {
5267             FastCaptureStateQueue *sq = mFastCapture->sq();
5268             FastCaptureState *state = sq->begin();
5269             bool didModify = false;
5270             FastCaptureStateQueue::block_t block = FastCaptureStateQueue::BLOCK_UNTIL_PUSHED;
5271             if (state->mCommand != FastCaptureState::READ_WRITE /* FIXME &&
5272                     (kUseFastMixer != FastMixer_Dynamic || state->mTrackMask > 1)*/) {
5273                 if (state->mCommand == FastCaptureState::COLD_IDLE) {
5274                     int32_t old = android_atomic_inc(&mFastCaptureFutex);
5275                     if (old == -1) {
5276                         (void) syscall(__NR_futex, &mFastCaptureFutex, FUTEX_WAKE_PRIVATE, 1);
5277                     }
5278                 }
5279                 state->mCommand = FastCaptureState::READ_WRITE;
5280 #if 0   // FIXME
5281                 mFastCaptureDumpState.increaseSamplingN(mAudioFlinger->isLowRamDevice() ?
5282                         FastCaptureDumpState::kSamplingNforLowRamDevice : FastMixerDumpState::kSamplingN);
5283 #endif
5284                 didModify = true;
5285             }
5286             audio_track_cblk_t *cblkOld = state->mCblk;
5287             audio_track_cblk_t *cblkNew = fastTrack != 0 ? fastTrack->cblk() : NULL;
5288             if (cblkNew != cblkOld) {
5289                 state->mCblk = cblkNew;
5290                 // block until acked if removing a fast track
5291                 if (cblkOld != NULL) {
5292                     block = FastCaptureStateQueue::BLOCK_UNTIL_ACKED;
5293                 }
5294                 didModify = true;
5295             }
5296             sq->end(didModify);
5297             if (didModify) {
5298                 sq->push(block);
5299 #if 0
5300                 if (kUseFastCapture == FastCapture_Dynamic) {
5301                     mNormalSource = mPipeSource;
5302                 }
5303 #endif
5304             }
5305         }
5306 
5307         // now run the fast track destructor with thread mutex unlocked
5308         fastTrackToRemove.clear();
5309 
5310         // Read from HAL to keep up with fastest client if multiple active tracks, not slowest one.
5311         // Only the client(s) that are too slow will overrun. But if even the fastest client is too
5312         // slow, then this RecordThread will overrun by not calling HAL read often enough.
5313         // If destination is non-contiguous, first read past the nominal end of buffer, then
5314         // copy to the right place.  Permitted because mRsmpInBuffer was over-allocated.
5315 
5316         int32_t rear = mRsmpInRear & (mRsmpInFramesP2 - 1);
5317         ssize_t framesRead;
5318 
5319         // If an NBAIO source is present, use it to read the normal capture's data
5320         if (mPipeSource != 0) {
5321             size_t framesToRead = mBufferSize / mFrameSize;
5322             framesRead = mPipeSource->read(&mRsmpInBuffer[rear * mChannelCount],
5323                     framesToRead, AudioBufferProvider::kInvalidPTS);
5324             if (framesRead == 0) {
5325                 // since pipe is non-blocking, simulate blocking input
5326                 sleepUs = (framesToRead * 1000000LL) / mSampleRate;
5327             }
5328         // otherwise use the HAL / AudioStreamIn directly
5329         } else {
5330             ssize_t bytesRead = mInput->stream->read(mInput->stream,
5331                     &mRsmpInBuffer[rear * mChannelCount], mBufferSize);
5332             if (bytesRead < 0) {
5333                 framesRead = bytesRead;
5334             } else {
5335                 framesRead = bytesRead / mFrameSize;
5336             }
5337         }
5338 
5339         if (framesRead < 0 || (framesRead == 0 && mPipeSource == 0)) {
5340             ALOGE("read failed: framesRead=%d", framesRead);
5341             // Force input into standby so that it tries to recover at next read attempt
5342             inputStandBy();
5343             sleepUs = kRecordThreadSleepUs;
5344         }
5345         if (framesRead <= 0) {
5346             goto unlock;
5347         }
5348         ALOG_ASSERT(framesRead > 0);
5349 
5350         if (mTeeSink != 0) {
5351             (void) mTeeSink->write(&mRsmpInBuffer[rear * mChannelCount], framesRead);
5352         }
5353         // If destination is non-contiguous, we now correct for reading past end of buffer.
5354         {
5355             size_t part1 = mRsmpInFramesP2 - rear;
5356             if ((size_t) framesRead > part1) {
5357                 memcpy(mRsmpInBuffer, &mRsmpInBuffer[mRsmpInFramesP2 * mChannelCount],
5358                         (framesRead - part1) * mFrameSize);
5359             }
5360         }
5361         rear = mRsmpInRear += framesRead;
5362 
5363         size = activeTracks.size();
5364         // loop over each active track
5365         for (size_t i = 0; i < size; i++) {
5366             activeTrack = activeTracks[i];
5367 
5368             // skip fast tracks, as those are handled directly by FastCapture
5369             if (activeTrack->isFastTrack()) {
5370                 continue;
5371             }
5372 
5373             enum {
5374                 OVERRUN_UNKNOWN,
5375                 OVERRUN_TRUE,
5376                 OVERRUN_FALSE
5377             } overrun = OVERRUN_UNKNOWN;
5378 
5379             // loop over getNextBuffer to handle circular sink
5380             for (;;) {
5381 
5382                 activeTrack->mSink.frameCount = ~0;
5383                 status_t status = activeTrack->getNextBuffer(&activeTrack->mSink);
5384                 size_t framesOut = activeTrack->mSink.frameCount;
5385                 LOG_ALWAYS_FATAL_IF((status == OK) != (framesOut > 0));
5386 
5387                 int32_t front = activeTrack->mRsmpInFront;
5388                 ssize_t filled = rear - front;
5389                 size_t framesIn;
5390 
5391                 if (filled < 0) {
5392                     // should not happen, but treat like a massive overrun and re-sync
5393                     framesIn = 0;
5394                     activeTrack->mRsmpInFront = rear;
5395                     overrun = OVERRUN_TRUE;
5396                 } else if ((size_t) filled <= mRsmpInFrames) {
5397                     framesIn = (size_t) filled;
5398                 } else {
5399                     // client is not keeping up with server, but give it latest data
5400                     framesIn = mRsmpInFrames;
5401                     activeTrack->mRsmpInFront = front = rear - framesIn;
5402                     overrun = OVERRUN_TRUE;
5403                 }
5404 
5405                 if (framesOut == 0 || framesIn == 0) {
5406                     break;
5407                 }
5408 
5409                 if (activeTrack->mResampler == NULL) {
5410                     // no resampling
5411                     if (framesIn > framesOut) {
5412                         framesIn = framesOut;
5413                     } else {
5414                         framesOut = framesIn;
5415                     }
5416                     int8_t *dst = activeTrack->mSink.i8;
5417                     while (framesIn > 0) {
5418                         front &= mRsmpInFramesP2 - 1;
5419                         size_t part1 = mRsmpInFramesP2 - front;
5420                         if (part1 > framesIn) {
5421                             part1 = framesIn;
5422                         }
5423                         int8_t *src = (int8_t *)mRsmpInBuffer + (front * mFrameSize);
5424                         if (mChannelCount == activeTrack->mChannelCount) {
5425                             memcpy(dst, src, part1 * mFrameSize);
5426                         } else if (mChannelCount == 1) {
5427                             upmix_to_stereo_i16_from_mono_i16((int16_t *)dst, (const int16_t *)src,
5428                                     part1);
5429                         } else {
5430                             downmix_to_mono_i16_from_stereo_i16((int16_t *)dst, (const int16_t *)src,
5431                                     part1);
5432                         }
5433                         dst += part1 * activeTrack->mFrameSize;
5434                         front += part1;
5435                         framesIn -= part1;
5436                     }
5437                     activeTrack->mRsmpInFront += framesOut;
5438 
5439                 } else {
5440                     // resampling
5441                     // FIXME framesInNeeded should really be part of resampler API, and should
5442                     //       depend on the SRC ratio
5443                     //       to keep mRsmpInBuffer full so resampler always has sufficient input
5444                     size_t framesInNeeded;
5445                     // FIXME only re-calculate when it changes, and optimize for common ratios
5446                     // Do not precompute in/out because floating point is not associative
5447                     // e.g. a*b/c != a*(b/c).
5448                     const double in(mSampleRate);
5449                     const double out(activeTrack->mSampleRate);
5450                     framesInNeeded = ceil(framesOut * in / out) + 1;
5451                     ALOGV("need %u frames in to produce %u out given in/out ratio of %.4g",
5452                                 framesInNeeded, framesOut, in / out);
5453                     // Although we theoretically have framesIn in circular buffer, some of those are
5454                     // unreleased frames, and thus must be discounted for purpose of budgeting.
5455                     size_t unreleased = activeTrack->mRsmpInUnrel;
5456                     framesIn = framesIn > unreleased ? framesIn - unreleased : 0;
5457                     if (framesIn < framesInNeeded) {
5458                         ALOGV("not enough to resample: have %u frames in but need %u in to "
5459                                 "produce %u out given in/out ratio of %.4g",
5460                                 framesIn, framesInNeeded, framesOut, in / out);
5461                         size_t newFramesOut = framesIn > 0 ? floor((framesIn - 1) * out / in) : 0;
5462                         LOG_ALWAYS_FATAL_IF(newFramesOut >= framesOut);
5463                         if (newFramesOut == 0) {
5464                             break;
5465                         }
5466                         framesInNeeded = ceil(newFramesOut * in / out) + 1;
5467                         ALOGV("now need %u frames in to produce %u out given out/in ratio of %.4g",
5468                                 framesInNeeded, newFramesOut, out / in);
5469                         LOG_ALWAYS_FATAL_IF(framesIn < framesInNeeded);
5470                         ALOGV("success 2: have %u frames in and need %u in to produce %u out "
5471                               "given in/out ratio of %.4g",
5472                               framesIn, framesInNeeded, newFramesOut, in / out);
5473                         framesOut = newFramesOut;
5474                     } else {
5475                         ALOGV("success 1: have %u in and need %u in to produce %u out "
5476                             "given in/out ratio of %.4g",
5477                             framesIn, framesInNeeded, framesOut, in / out);
5478                     }
5479 
5480                     // reallocate mRsmpOutBuffer as needed; we will grow but never shrink
5481                     if (activeTrack->mRsmpOutFrameCount < framesOut) {
5482                         // FIXME why does each track need it's own mRsmpOutBuffer? can't they share?
5483                         delete[] activeTrack->mRsmpOutBuffer;
5484                         // resampler always outputs stereo
5485                         activeTrack->mRsmpOutBuffer = new int32_t[framesOut * FCC_2];
5486                         activeTrack->mRsmpOutFrameCount = framesOut;
5487                     }
5488 
5489                     // resampler accumulates, but we only have one source track
5490                     memset(activeTrack->mRsmpOutBuffer, 0, framesOut * FCC_2 * sizeof(int32_t));
5491                     activeTrack->mResampler->resample(activeTrack->mRsmpOutBuffer, framesOut,
5492                             // FIXME how about having activeTrack implement this interface itself?
5493                             activeTrack->mResamplerBufferProvider
5494                             /*this*/ /* AudioBufferProvider* */);
5495                     // ditherAndClamp() works as long as all buffers returned by
5496                     // activeTrack->getNextBuffer() are 32 bit aligned which should be always true.
5497                     if (activeTrack->mChannelCount == 1) {
5498                         // temporarily type pun mRsmpOutBuffer from Q4.27 to int16_t
5499                         ditherAndClamp(activeTrack->mRsmpOutBuffer, activeTrack->mRsmpOutBuffer,
5500                                 framesOut);
5501                         // the resampler always outputs stereo samples:
5502                         // do post stereo to mono conversion
5503                         downmix_to_mono_i16_from_stereo_i16(activeTrack->mSink.i16,
5504                                 (const int16_t *)activeTrack->mRsmpOutBuffer, framesOut);
5505                     } else {
5506                         ditherAndClamp((int32_t *)activeTrack->mSink.raw,
5507                                 activeTrack->mRsmpOutBuffer, framesOut);
5508                     }
5509                     // now done with mRsmpOutBuffer
5510 
5511                 }
5512 
5513                 if (framesOut > 0 && (overrun == OVERRUN_UNKNOWN)) {
5514                     overrun = OVERRUN_FALSE;
5515                 }
5516 
5517                 if (activeTrack->mFramesToDrop == 0) {
5518                     if (framesOut > 0) {
5519                         activeTrack->mSink.frameCount = framesOut;
5520                         activeTrack->releaseBuffer(&activeTrack->mSink);
5521                     }
5522                 } else {
5523                     // FIXME could do a partial drop of framesOut
5524                     if (activeTrack->mFramesToDrop > 0) {
5525                         activeTrack->mFramesToDrop -= framesOut;
5526                         if (activeTrack->mFramesToDrop <= 0) {
5527                             activeTrack->clearSyncStartEvent();
5528                         }
5529                     } else {
5530                         activeTrack->mFramesToDrop += framesOut;
5531                         if (activeTrack->mFramesToDrop >= 0 || activeTrack->mSyncStartEvent == 0 ||
5532                                 activeTrack->mSyncStartEvent->isCancelled()) {
5533                             ALOGW("Synced record %s, session %d, trigger session %d",
5534                                   (activeTrack->mFramesToDrop >= 0) ? "timed out" : "cancelled",
5535                                   activeTrack->sessionId(),
5536                                   (activeTrack->mSyncStartEvent != 0) ?
5537                                           activeTrack->mSyncStartEvent->triggerSession() : 0);
5538                             activeTrack->clearSyncStartEvent();
5539                         }
5540                     }
5541                 }
5542 
5543                 if (framesOut == 0) {
5544                     break;
5545                 }
5546             }
5547 
5548             switch (overrun) {
5549             case OVERRUN_TRUE:
5550                 // client isn't retrieving buffers fast enough
5551                 if (!activeTrack->setOverflow()) {
5552                     nsecs_t now = systemTime();
5553                     // FIXME should lastWarning per track?
5554                     if ((now - lastWarning) > kWarningThrottleNs) {
5555                         ALOGW("RecordThread: buffer overflow");
5556                         lastWarning = now;
5557                     }
5558                 }
5559                 break;
5560             case OVERRUN_FALSE:
5561                 activeTrack->clearOverflow();
5562                 break;
5563             case OVERRUN_UNKNOWN:
5564                 break;
5565             }
5566 
5567         }
5568 
5569 unlock:
5570         // enable changes in effect chain
5571         unlockEffectChains(effectChains);
5572         // effectChains doesn't need to be cleared, since it is cleared by destructor at scope end
5573     }
5574 
5575     standbyIfNotAlreadyInStandby();
5576 
5577     {
5578         Mutex::Autolock _l(mLock);
5579         for (size_t i = 0; i < mTracks.size(); i++) {
5580             sp<RecordTrack> track = mTracks[i];
5581             track->invalidate();
5582         }
5583         mActiveTracks.clear();
5584         mActiveTracksGen++;
5585         mStartStopCond.broadcast();
5586     }
5587 
5588     releaseWakeLock();
5589 
5590     ALOGV("RecordThread %p exiting", this);
5591     return false;
5592 }
5593 
standbyIfNotAlreadyInStandby()5594 void AudioFlinger::RecordThread::standbyIfNotAlreadyInStandby()
5595 {
5596     if (!mStandby) {
5597         inputStandBy();
5598         mStandby = true;
5599     }
5600 }
5601 
inputStandBy()5602 void AudioFlinger::RecordThread::inputStandBy()
5603 {
5604     // Idle the fast capture if it's currently running
5605     if (mFastCapture != 0) {
5606         FastCaptureStateQueue *sq = mFastCapture->sq();
5607         FastCaptureState *state = sq->begin();
5608         if (!(state->mCommand & FastCaptureState::IDLE)) {
5609             state->mCommand = FastCaptureState::COLD_IDLE;
5610             state->mColdFutexAddr = &mFastCaptureFutex;
5611             state->mColdGen++;
5612             mFastCaptureFutex = 0;
5613             sq->end();
5614             // BLOCK_UNTIL_PUSHED would be insufficient, as we need it to stop doing I/O now
5615             sq->push(FastCaptureStateQueue::BLOCK_UNTIL_ACKED);
5616 #if 0
5617             if (kUseFastCapture == FastCapture_Dynamic) {
5618                 // FIXME
5619             }
5620 #endif
5621 #ifdef AUDIO_WATCHDOG
5622             // FIXME
5623 #endif
5624         } else {
5625             sq->end(false /*didModify*/);
5626         }
5627     }
5628     mInput->stream->common.standby(&mInput->stream->common);
5629 }
5630 
5631 // RecordThread::createRecordTrack_l() must be called with AudioFlinger::mLock held
createRecordTrack_l(const sp<AudioFlinger::Client> & client,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * pFrameCount,int sessionId,size_t * notificationFrames,int uid,IAudioFlinger::track_flags_t * flags,pid_t tid,status_t * status)5632 sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRecordTrack_l(
5633         const sp<AudioFlinger::Client>& client,
5634         uint32_t sampleRate,
5635         audio_format_t format,
5636         audio_channel_mask_t channelMask,
5637         size_t *pFrameCount,
5638         int sessionId,
5639         size_t *notificationFrames,
5640         int uid,
5641         IAudioFlinger::track_flags_t *flags,
5642         pid_t tid,
5643         status_t *status)
5644 {
5645     size_t frameCount = *pFrameCount;
5646     sp<RecordTrack> track;
5647     status_t lStatus;
5648 
5649     // client expresses a preference for FAST, but we get the final say
5650     if (*flags & IAudioFlinger::TRACK_FAST) {
5651       if (
5652             // use case: callback handler
5653             (tid != -1) &&
5654             // frame count is not specified, or is exactly the pipe depth
5655             ((frameCount == 0) || (frameCount == mPipeFramesP2)) &&
5656             // PCM data
5657             audio_is_linear_pcm(format) &&
5658             // native format
5659             (format == mFormat) &&
5660             // native channel mask
5661             (channelMask == mChannelMask) &&
5662             // native hardware sample rate
5663             (sampleRate == mSampleRate) &&
5664             // record thread has an associated fast capture
5665             hasFastCapture() &&
5666             // there are sufficient fast track slots available
5667             mFastTrackAvail
5668         ) {
5669         ALOGV("AUDIO_INPUT_FLAG_FAST accepted: frameCount=%u mFrameCount=%u",
5670                 frameCount, mFrameCount);
5671       } else {
5672         ALOGV("AUDIO_INPUT_FLAG_FAST denied: frameCount=%u mFrameCount=%u mPipeFramesP2=%u "
5673                 "format=%#x isLinear=%d channelMask=%#x sampleRate=%u mSampleRate=%u "
5674                 "hasFastCapture=%d tid=%d mFastTrackAvail=%d",
5675                 frameCount, mFrameCount, mPipeFramesP2,
5676                 format, audio_is_linear_pcm(format), channelMask, sampleRate, mSampleRate,
5677                 hasFastCapture(), tid, mFastTrackAvail);
5678         *flags &= ~IAudioFlinger::TRACK_FAST;
5679       }
5680     }
5681 
5682     // compute track buffer size in frames, and suggest the notification frame count
5683     if (*flags & IAudioFlinger::TRACK_FAST) {
5684         // fast track: frame count is exactly the pipe depth
5685         frameCount = mPipeFramesP2;
5686         // ignore requested notificationFrames, and always notify exactly once every HAL buffer
5687         *notificationFrames = mFrameCount;
5688     } else {
5689         // not fast track: max notification period is resampled equivalent of one HAL buffer time
5690         //                 or 20 ms if there is a fast capture
5691         // TODO This could be a roundupRatio inline, and const
5692         size_t maxNotificationFrames = ((int64_t) (hasFastCapture() ? mSampleRate/50 : mFrameCount)
5693                 * sampleRate + mSampleRate - 1) / mSampleRate;
5694         // minimum number of notification periods is at least kMinNotifications,
5695         // and at least kMinMs rounded up to a whole notification period (minNotificationsByMs)
5696         static const size_t kMinNotifications = 3;
5697         static const uint32_t kMinMs = 30;
5698         // TODO This could be a roundupRatio inline
5699         const size_t minFramesByMs = (sampleRate * kMinMs + 1000 - 1) / 1000;
5700         // TODO This could be a roundupRatio inline
5701         const size_t minNotificationsByMs = (minFramesByMs + maxNotificationFrames - 1) /
5702                 maxNotificationFrames;
5703         const size_t minFrameCount = maxNotificationFrames *
5704                 max(kMinNotifications, minNotificationsByMs);
5705         frameCount = max(frameCount, minFrameCount);
5706         if (*notificationFrames == 0 || *notificationFrames > maxNotificationFrames) {
5707             *notificationFrames = maxNotificationFrames;
5708         }
5709     }
5710     *pFrameCount = frameCount;
5711 
5712     lStatus = initCheck();
5713     if (lStatus != NO_ERROR) {
5714         ALOGE("createRecordTrack_l() audio driver not initialized");
5715         goto Exit;
5716     }
5717 
5718     { // scope for mLock
5719         Mutex::Autolock _l(mLock);
5720 
5721         track = new RecordTrack(this, client, sampleRate,
5722                       format, channelMask, frameCount, NULL, sessionId, uid,
5723                       *flags, TrackBase::TYPE_DEFAULT);
5724 
5725         lStatus = track->initCheck();
5726         if (lStatus != NO_ERROR) {
5727             ALOGE("createRecordTrack_l() initCheck failed %d; no control block?", lStatus);
5728             // track must be cleared from the caller as the caller has the AF lock
5729             goto Exit;
5730         }
5731         mTracks.add(track);
5732 
5733         // disable AEC and NS if the device is a BT SCO headset supporting those pre processings
5734         bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
5735                         mAudioFlinger->btNrecIsOff();
5736         setEffectSuspended_l(FX_IID_AEC, suspend, sessionId);
5737         setEffectSuspended_l(FX_IID_NS, suspend, sessionId);
5738 
5739         if ((*flags & IAudioFlinger::TRACK_FAST) && (tid != -1)) {
5740             pid_t callingPid = IPCThreadState::self()->getCallingPid();
5741             // we don't have CAP_SYS_NICE, nor do we want to have it as it's too powerful,
5742             // so ask activity manager to do this on our behalf
5743             sendPrioConfigEvent_l(callingPid, tid, kPriorityAudioApp);
5744         }
5745     }
5746 
5747     lStatus = NO_ERROR;
5748 
5749 Exit:
5750     *status = lStatus;
5751     return track;
5752 }
5753 
start(RecordThread::RecordTrack * recordTrack,AudioSystem::sync_event_t event,int triggerSession)5754 status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrack,
5755                                            AudioSystem::sync_event_t event,
5756                                            int triggerSession)
5757 {
5758     ALOGV("RecordThread::start event %d, triggerSession %d", event, triggerSession);
5759     sp<ThreadBase> strongMe = this;
5760     status_t status = NO_ERROR;
5761 
5762     if (event == AudioSystem::SYNC_EVENT_NONE) {
5763         recordTrack->clearSyncStartEvent();
5764     } else if (event != AudioSystem::SYNC_EVENT_SAME) {
5765         recordTrack->mSyncStartEvent = mAudioFlinger->createSyncEvent(event,
5766                                        triggerSession,
5767                                        recordTrack->sessionId(),
5768                                        syncStartEventCallback,
5769                                        recordTrack);
5770         // Sync event can be cancelled by the trigger session if the track is not in a
5771         // compatible state in which case we start record immediately
5772         if (recordTrack->mSyncStartEvent->isCancelled()) {
5773             recordTrack->clearSyncStartEvent();
5774         } else {
5775             // do not wait for the event for more than AudioSystem::kSyncRecordStartTimeOutMs
5776             recordTrack->mFramesToDrop = -
5777                     ((AudioSystem::kSyncRecordStartTimeOutMs * recordTrack->mSampleRate) / 1000);
5778         }
5779     }
5780 
5781     {
5782         // This section is a rendezvous between binder thread executing start() and RecordThread
5783         AutoMutex lock(mLock);
5784         if (mActiveTracks.indexOf(recordTrack) >= 0) {
5785             if (recordTrack->mState == TrackBase::PAUSING) {
5786                 ALOGV("active record track PAUSING -> ACTIVE");
5787                 recordTrack->mState = TrackBase::ACTIVE;
5788             } else {
5789                 ALOGV("active record track state %d", recordTrack->mState);
5790             }
5791             return status;
5792         }
5793 
5794         // TODO consider other ways of handling this, such as changing the state to :STARTING and
5795         //      adding the track to mActiveTracks after returning from AudioSystem::startInput(),
5796         //      or using a separate command thread
5797         recordTrack->mState = TrackBase::STARTING_1;
5798         mActiveTracks.add(recordTrack);
5799         mActiveTracksGen++;
5800         status_t status = NO_ERROR;
5801         if (recordTrack->isExternalTrack()) {
5802             mLock.unlock();
5803             status = AudioSystem::startInput(mId, (audio_session_t)recordTrack->sessionId());
5804             mLock.lock();
5805             // FIXME should verify that recordTrack is still in mActiveTracks
5806             if (status != NO_ERROR) {
5807                 mActiveTracks.remove(recordTrack);
5808                 mActiveTracksGen++;
5809                 recordTrack->clearSyncStartEvent();
5810                 ALOGV("RecordThread::start error %d", status);
5811                 return status;
5812             }
5813         }
5814         // Catch up with current buffer indices if thread is already running.
5815         // This is what makes a new client discard all buffered data.  If the track's mRsmpInFront
5816         // was initialized to some value closer to the thread's mRsmpInFront, then the track could
5817         // see previously buffered data before it called start(), but with greater risk of overrun.
5818 
5819         recordTrack->mRsmpInFront = mRsmpInRear;
5820         recordTrack->mRsmpInUnrel = 0;
5821         // FIXME why reset?
5822         if (recordTrack->mResampler != NULL) {
5823             recordTrack->mResampler->reset();
5824         }
5825         recordTrack->mState = TrackBase::STARTING_2;
5826         // signal thread to start
5827         mWaitWorkCV.broadcast();
5828         if (mActiveTracks.indexOf(recordTrack) < 0) {
5829             ALOGV("Record failed to start");
5830             status = BAD_VALUE;
5831             goto startError;
5832         }
5833         return status;
5834     }
5835 
5836 startError:
5837     if (recordTrack->isExternalTrack()) {
5838         AudioSystem::stopInput(mId, (audio_session_t)recordTrack->sessionId());
5839     }
5840     recordTrack->clearSyncStartEvent();
5841     // FIXME I wonder why we do not reset the state here?
5842     return status;
5843 }
5844 
syncStartEventCallback(const wp<SyncEvent> & event)5845 void AudioFlinger::RecordThread::syncStartEventCallback(const wp<SyncEvent>& event)
5846 {
5847     sp<SyncEvent> strongEvent = event.promote();
5848 
5849     if (strongEvent != 0) {
5850         sp<RefBase> ptr = strongEvent->cookie().promote();
5851         if (ptr != 0) {
5852             RecordTrack *recordTrack = (RecordTrack *)ptr.get();
5853             recordTrack->handleSyncStartEvent(strongEvent);
5854         }
5855     }
5856 }
5857 
stop(RecordThread::RecordTrack * recordTrack)5858 bool AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) {
5859     ALOGV("RecordThread::stop");
5860     AutoMutex _l(mLock);
5861     if (mActiveTracks.indexOf(recordTrack) != 0 || recordTrack->mState == TrackBase::PAUSING) {
5862         return false;
5863     }
5864     // note that threadLoop may still be processing the track at this point [without lock]
5865     recordTrack->mState = TrackBase::PAUSING;
5866     // do not wait for mStartStopCond if exiting
5867     if (exitPending()) {
5868         return true;
5869     }
5870     // FIXME incorrect usage of wait: no explicit predicate or loop
5871     mStartStopCond.wait(mLock);
5872     // if we have been restarted, recordTrack is in mActiveTracks here
5873     if (exitPending() || mActiveTracks.indexOf(recordTrack) != 0) {
5874         ALOGV("Record stopped OK");
5875         return true;
5876     }
5877     return false;
5878 }
5879 
isValidSyncEvent(const sp<SyncEvent> & event __unused) const5880 bool AudioFlinger::RecordThread::isValidSyncEvent(const sp<SyncEvent>& event __unused) const
5881 {
5882     return false;
5883 }
5884 
setSyncEvent(const sp<SyncEvent> & event __unused)5885 status_t AudioFlinger::RecordThread::setSyncEvent(const sp<SyncEvent>& event __unused)
5886 {
5887 #if 0   // This branch is currently dead code, but is preserved in case it will be needed in future
5888     if (!isValidSyncEvent(event)) {
5889         return BAD_VALUE;
5890     }
5891 
5892     int eventSession = event->triggerSession();
5893     status_t ret = NAME_NOT_FOUND;
5894 
5895     Mutex::Autolock _l(mLock);
5896 
5897     for (size_t i = 0; i < mTracks.size(); i++) {
5898         sp<RecordTrack> track = mTracks[i];
5899         if (eventSession == track->sessionId()) {
5900             (void) track->setSyncEvent(event);
5901             ret = NO_ERROR;
5902         }
5903     }
5904     return ret;
5905 #else
5906     return BAD_VALUE;
5907 #endif
5908 }
5909 
5910 // destroyTrack_l() must be called with ThreadBase::mLock held
destroyTrack_l(const sp<RecordTrack> & track)5911 void AudioFlinger::RecordThread::destroyTrack_l(const sp<RecordTrack>& track)
5912 {
5913     track->terminate();
5914     track->mState = TrackBase::STOPPED;
5915     // active tracks are removed by threadLoop()
5916     if (mActiveTracks.indexOf(track) < 0) {
5917         removeTrack_l(track);
5918     }
5919 }
5920 
removeTrack_l(const sp<RecordTrack> & track)5921 void AudioFlinger::RecordThread::removeTrack_l(const sp<RecordTrack>& track)
5922 {
5923     mTracks.remove(track);
5924     // need anything related to effects here?
5925     if (track->isFastTrack()) {
5926         ALOG_ASSERT(!mFastTrackAvail);
5927         mFastTrackAvail = true;
5928     }
5929 }
5930 
dump(int fd,const Vector<String16> & args)5931 void AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)
5932 {
5933     dumpInternals(fd, args);
5934     dumpTracks(fd, args);
5935     dumpEffectChains(fd, args);
5936 }
5937 
dumpInternals(int fd,const Vector<String16> & args)5938 void AudioFlinger::RecordThread::dumpInternals(int fd, const Vector<String16>& args)
5939 {
5940     dprintf(fd, "\nInput thread %p:\n", this);
5941 
5942     if (mActiveTracks.size() > 0) {
5943         dprintf(fd, "  Buffer size: %zu bytes\n", mBufferSize);
5944     } else {
5945         dprintf(fd, "  No active record clients\n");
5946     }
5947     dprintf(fd, "  Fast capture thread: %s\n", hasFastCapture() ? "yes" : "no");
5948     dprintf(fd, "  Fast track available: %s\n", mFastTrackAvail ? "yes" : "no");
5949 
5950     dumpBase(fd, args);
5951 }
5952 
dumpTracks(int fd,const Vector<String16> & args __unused)5953 void AudioFlinger::RecordThread::dumpTracks(int fd, const Vector<String16>& args __unused)
5954 {
5955     const size_t SIZE = 256;
5956     char buffer[SIZE];
5957     String8 result;
5958 
5959     size_t numtracks = mTracks.size();
5960     size_t numactive = mActiveTracks.size();
5961     size_t numactiveseen = 0;
5962     dprintf(fd, "  %d Tracks", numtracks);
5963     if (numtracks) {
5964         dprintf(fd, " of which %d are active\n", numactive);
5965         RecordTrack::appendDumpHeader(result);
5966         for (size_t i = 0; i < numtracks ; ++i) {
5967             sp<RecordTrack> track = mTracks[i];
5968             if (track != 0) {
5969                 bool active = mActiveTracks.indexOf(track) >= 0;
5970                 if (active) {
5971                     numactiveseen++;
5972                 }
5973                 track->dump(buffer, SIZE, active);
5974                 result.append(buffer);
5975             }
5976         }
5977     } else {
5978         dprintf(fd, "\n");
5979     }
5980 
5981     if (numactiveseen != numactive) {
5982         snprintf(buffer, SIZE, "  The following tracks are in the active list but"
5983                 " not in the track list\n");
5984         result.append(buffer);
5985         RecordTrack::appendDumpHeader(result);
5986         for (size_t i = 0; i < numactive; ++i) {
5987             sp<RecordTrack> track = mActiveTracks[i];
5988             if (mTracks.indexOf(track) < 0) {
5989                 track->dump(buffer, SIZE, true);
5990                 result.append(buffer);
5991             }
5992         }
5993 
5994     }
5995     write(fd, result.string(), result.size());
5996 }
5997 
5998 // AudioBufferProvider interface
getNextBuffer(AudioBufferProvider::Buffer * buffer,int64_t pts __unused)5999 status_t AudioFlinger::RecordThread::ResamplerBufferProvider::getNextBuffer(
6000         AudioBufferProvider::Buffer* buffer, int64_t pts __unused)
6001 {
6002     RecordTrack *activeTrack = mRecordTrack;
6003     sp<ThreadBase> threadBase = activeTrack->mThread.promote();
6004     if (threadBase == 0) {
6005         buffer->frameCount = 0;
6006         buffer->raw = NULL;
6007         return NOT_ENOUGH_DATA;
6008     }
6009     RecordThread *recordThread = (RecordThread *) threadBase.get();
6010     int32_t rear = recordThread->mRsmpInRear;
6011     int32_t front = activeTrack->mRsmpInFront;
6012     ssize_t filled = rear - front;
6013     // FIXME should not be P2 (don't want to increase latency)
6014     // FIXME if client not keeping up, discard
6015     LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames));
6016     // 'filled' may be non-contiguous, so return only the first contiguous chunk
6017     front &= recordThread->mRsmpInFramesP2 - 1;
6018     size_t part1 = recordThread->mRsmpInFramesP2 - front;
6019     if (part1 > (size_t) filled) {
6020         part1 = filled;
6021     }
6022     size_t ask = buffer->frameCount;
6023     ALOG_ASSERT(ask > 0);
6024     if (part1 > ask) {
6025         part1 = ask;
6026     }
6027     if (part1 == 0) {
6028         // Higher-level should keep mRsmpInBuffer full, and not call resampler if empty
6029         LOG_ALWAYS_FATAL("RecordThread::getNextBuffer() starved");
6030         buffer->raw = NULL;
6031         buffer->frameCount = 0;
6032         activeTrack->mRsmpInUnrel = 0;
6033         return NOT_ENOUGH_DATA;
6034     }
6035 
6036     buffer->raw = recordThread->mRsmpInBuffer + front * recordThread->mChannelCount;
6037     buffer->frameCount = part1;
6038     activeTrack->mRsmpInUnrel = part1;
6039     return NO_ERROR;
6040 }
6041 
6042 // AudioBufferProvider interface
releaseBuffer(AudioBufferProvider::Buffer * buffer)6043 void AudioFlinger::RecordThread::ResamplerBufferProvider::releaseBuffer(
6044         AudioBufferProvider::Buffer* buffer)
6045 {
6046     RecordTrack *activeTrack = mRecordTrack;
6047     size_t stepCount = buffer->frameCount;
6048     if (stepCount == 0) {
6049         return;
6050     }
6051     ALOG_ASSERT(stepCount <= activeTrack->mRsmpInUnrel);
6052     activeTrack->mRsmpInUnrel -= stepCount;
6053     activeTrack->mRsmpInFront += stepCount;
6054     buffer->raw = NULL;
6055     buffer->frameCount = 0;
6056 }
6057 
checkForNewParameter_l(const String8 & keyValuePair,status_t & status)6058 bool AudioFlinger::RecordThread::checkForNewParameter_l(const String8& keyValuePair,
6059                                                         status_t& status)
6060 {
6061     bool reconfig = false;
6062 
6063     status = NO_ERROR;
6064 
6065     audio_format_t reqFormat = mFormat;
6066     uint32_t samplingRate = mSampleRate;
6067     audio_channel_mask_t channelMask = audio_channel_in_mask_from_count(mChannelCount);
6068 
6069     AudioParameter param = AudioParameter(keyValuePair);
6070     int value;
6071     // TODO Investigate when this code runs. Check with audio policy when a sample rate and
6072     //      channel count change can be requested. Do we mandate the first client defines the
6073     //      HAL sampling rate and channel count or do we allow changes on the fly?
6074     if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
6075         samplingRate = value;
6076         reconfig = true;
6077     }
6078     if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
6079         if ((audio_format_t) value != AUDIO_FORMAT_PCM_16_BIT) {
6080             status = BAD_VALUE;
6081         } else {
6082             reqFormat = (audio_format_t) value;
6083             reconfig = true;
6084         }
6085     }
6086     if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
6087         audio_channel_mask_t mask = (audio_channel_mask_t) value;
6088         if (mask != AUDIO_CHANNEL_IN_MONO && mask != AUDIO_CHANNEL_IN_STEREO) {
6089             status = BAD_VALUE;
6090         } else {
6091             channelMask = mask;
6092             reconfig = true;
6093         }
6094     }
6095     if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
6096         // do not accept frame count changes if tracks are open as the track buffer
6097         // size depends on frame count and correct behavior would not be guaranteed
6098         // if frame count is changed after track creation
6099         if (mActiveTracks.size() > 0) {
6100             status = INVALID_OPERATION;
6101         } else {
6102             reconfig = true;
6103         }
6104     }
6105     if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
6106         // forward device change to effects that have requested to be
6107         // aware of attached audio device.
6108         for (size_t i = 0; i < mEffectChains.size(); i++) {
6109             mEffectChains[i]->setDevice_l(value);
6110         }
6111 
6112         // store input device and output device but do not forward output device to audio HAL.
6113         // Note that status is ignored by the caller for output device
6114         // (see AudioFlinger::setParameters()
6115         if (audio_is_output_devices(value)) {
6116             mOutDevice = value;
6117             status = BAD_VALUE;
6118         } else {
6119             mInDevice = value;
6120             // disable AEC and NS if the device is a BT SCO headset supporting those
6121             // pre processings
6122             if (mTracks.size() > 0) {
6123                 bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
6124                                     mAudioFlinger->btNrecIsOff();
6125                 for (size_t i = 0; i < mTracks.size(); i++) {
6126                     sp<RecordTrack> track = mTracks[i];
6127                     setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
6128                     setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
6129                 }
6130             }
6131         }
6132     }
6133     if (param.getInt(String8(AudioParameter::keyInputSource), value) == NO_ERROR &&
6134             mAudioSource != (audio_source_t)value) {
6135         // forward device change to effects that have requested to be
6136         // aware of attached audio device.
6137         for (size_t i = 0; i < mEffectChains.size(); i++) {
6138             mEffectChains[i]->setAudioSource_l((audio_source_t)value);
6139         }
6140         mAudioSource = (audio_source_t)value;
6141     }
6142 
6143     if (status == NO_ERROR) {
6144         status = mInput->stream->common.set_parameters(&mInput->stream->common,
6145                 keyValuePair.string());
6146         if (status == INVALID_OPERATION) {
6147             inputStandBy();
6148             status = mInput->stream->common.set_parameters(&mInput->stream->common,
6149                     keyValuePair.string());
6150         }
6151         if (reconfig) {
6152             if (status == BAD_VALUE &&
6153                 reqFormat == mInput->stream->common.get_format(&mInput->stream->common) &&
6154                 reqFormat == AUDIO_FORMAT_PCM_16_BIT &&
6155                 (mInput->stream->common.get_sample_rate(&mInput->stream->common)
6156                         <= (2 * samplingRate)) &&
6157                 audio_channel_count_from_in_mask(
6158                         mInput->stream->common.get_channels(&mInput->stream->common)) <= FCC_2 &&
6159                 (channelMask == AUDIO_CHANNEL_IN_MONO ||
6160                         channelMask == AUDIO_CHANNEL_IN_STEREO)) {
6161                 status = NO_ERROR;
6162             }
6163             if (status == NO_ERROR) {
6164                 readInputParameters_l();
6165                 sendIoConfigEvent_l(AudioSystem::INPUT_CONFIG_CHANGED);
6166             }
6167         }
6168     }
6169 
6170     return reconfig;
6171 }
6172 
getParameters(const String8 & keys)6173 String8 AudioFlinger::RecordThread::getParameters(const String8& keys)
6174 {
6175     Mutex::Autolock _l(mLock);
6176     if (initCheck() != NO_ERROR) {
6177         return String8();
6178     }
6179 
6180     char *s = mInput->stream->common.get_parameters(&mInput->stream->common, keys.string());
6181     const String8 out_s8(s);
6182     free(s);
6183     return out_s8;
6184 }
6185 
audioConfigChanged(int event,int param __unused)6186 void AudioFlinger::RecordThread::audioConfigChanged(int event, int param __unused) {
6187     AudioSystem::OutputDescriptor desc;
6188     const void *param2 = NULL;
6189 
6190     switch (event) {
6191     case AudioSystem::INPUT_OPENED:
6192     case AudioSystem::INPUT_CONFIG_CHANGED:
6193         desc.channelMask = mChannelMask;
6194         desc.samplingRate = mSampleRate;
6195         desc.format = mFormat;
6196         desc.frameCount = mFrameCount;
6197         desc.latency = 0;
6198         param2 = &desc;
6199         break;
6200 
6201     case AudioSystem::INPUT_CLOSED:
6202     default:
6203         break;
6204     }
6205     mAudioFlinger->audioConfigChanged(event, mId, param2);
6206 }
6207 
readInputParameters_l()6208 void AudioFlinger::RecordThread::readInputParameters_l()
6209 {
6210     mSampleRate = mInput->stream->common.get_sample_rate(&mInput->stream->common);
6211     mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common);
6212     mChannelCount = audio_channel_count_from_in_mask(mChannelMask);
6213     mHALFormat = mInput->stream->common.get_format(&mInput->stream->common);
6214     mFormat = mHALFormat;
6215     if (mFormat != AUDIO_FORMAT_PCM_16_BIT) {
6216         ALOGE("HAL format %#x not supported; must be AUDIO_FORMAT_PCM_16_BIT", mFormat);
6217     }
6218     mFrameSize = audio_stream_in_frame_size(mInput->stream);
6219     mBufferSize = mInput->stream->common.get_buffer_size(&mInput->stream->common);
6220     mFrameCount = mBufferSize / mFrameSize;
6221     // This is the formula for calculating the temporary buffer size.
6222     // With 7 HAL buffers, we can guarantee ability to down-sample the input by ratio of 6:1 to
6223     // 1 full output buffer, regardless of the alignment of the available input.
6224     // The value is somewhat arbitrary, and could probably be even larger.
6225     // A larger value should allow more old data to be read after a track calls start(),
6226     // without increasing latency.
6227     mRsmpInFrames = mFrameCount * 7;
6228     mRsmpInFramesP2 = roundup(mRsmpInFrames);
6229     delete[] mRsmpInBuffer;
6230 
6231     // TODO optimize audio capture buffer sizes ...
6232     // Here we calculate the size of the sliding buffer used as a source
6233     // for resampling.  mRsmpInFramesP2 is currently roundup(mFrameCount * 7).
6234     // For current HAL frame counts, this is usually 2048 = 40 ms.  It would
6235     // be better to have it derived from the pipe depth in the long term.
6236     // The current value is higher than necessary.  However it should not add to latency.
6237 
6238     // Over-allocate beyond mRsmpInFramesP2 to permit a HAL read past end of buffer
6239     mRsmpInBuffer = new int16_t[(mRsmpInFramesP2 + mFrameCount - 1) * mChannelCount];
6240 
6241     // AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints.
6242     // But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks?
6243 }
6244 
getInputFramesLost()6245 uint32_t AudioFlinger::RecordThread::getInputFramesLost()
6246 {
6247     Mutex::Autolock _l(mLock);
6248     if (initCheck() != NO_ERROR) {
6249         return 0;
6250     }
6251 
6252     return mInput->stream->get_input_frames_lost(mInput->stream);
6253 }
6254 
hasAudioSession(int sessionId) const6255 uint32_t AudioFlinger::RecordThread::hasAudioSession(int sessionId) const
6256 {
6257     Mutex::Autolock _l(mLock);
6258     uint32_t result = 0;
6259     if (getEffectChain_l(sessionId) != 0) {
6260         result = EFFECT_SESSION;
6261     }
6262 
6263     for (size_t i = 0; i < mTracks.size(); ++i) {
6264         if (sessionId == mTracks[i]->sessionId()) {
6265             result |= TRACK_SESSION;
6266             break;
6267         }
6268     }
6269 
6270     return result;
6271 }
6272 
sessionIds() const6273 KeyedVector<int, bool> AudioFlinger::RecordThread::sessionIds() const
6274 {
6275     KeyedVector<int, bool> ids;
6276     Mutex::Autolock _l(mLock);
6277     for (size_t j = 0; j < mTracks.size(); ++j) {
6278         sp<RecordThread::RecordTrack> track = mTracks[j];
6279         int sessionId = track->sessionId();
6280         if (ids.indexOfKey(sessionId) < 0) {
6281             ids.add(sessionId, true);
6282         }
6283     }
6284     return ids;
6285 }
6286 
clearInput()6287 AudioFlinger::AudioStreamIn* AudioFlinger::RecordThread::clearInput()
6288 {
6289     Mutex::Autolock _l(mLock);
6290     AudioStreamIn *input = mInput;
6291     mInput = NULL;
6292     return input;
6293 }
6294 
6295 // this method must always be called either with ThreadBase mLock held or inside the thread loop
stream() const6296 audio_stream_t* AudioFlinger::RecordThread::stream() const
6297 {
6298     if (mInput == NULL) {
6299         return NULL;
6300     }
6301     return &mInput->stream->common;
6302 }
6303 
addEffectChain_l(const sp<EffectChain> & chain)6304 status_t AudioFlinger::RecordThread::addEffectChain_l(const sp<EffectChain>& chain)
6305 {
6306     // only one chain per input thread
6307     if (mEffectChains.size() != 0) {
6308         ALOGW("addEffectChain_l() already one chain %p on thread %p", chain.get(), this);
6309         return INVALID_OPERATION;
6310     }
6311     ALOGV("addEffectChain_l() %p on thread %p", chain.get(), this);
6312     chain->setThread(this);
6313     chain->setInBuffer(NULL);
6314     chain->setOutBuffer(NULL);
6315 
6316     checkSuspendOnAddEffectChain_l(chain);
6317 
6318     // make sure enabled pre processing effects state is communicated to the HAL as we
6319     // just moved them to a new input stream.
6320     chain->syncHalEffectsState();
6321 
6322     mEffectChains.add(chain);
6323 
6324     return NO_ERROR;
6325 }
6326 
removeEffectChain_l(const sp<EffectChain> & chain)6327 size_t AudioFlinger::RecordThread::removeEffectChain_l(const sp<EffectChain>& chain)
6328 {
6329     ALOGV("removeEffectChain_l() %p from thread %p", chain.get(), this);
6330     ALOGW_IF(mEffectChains.size() != 1,
6331             "removeEffectChain_l() %p invalid chain size %d on thread %p",
6332             chain.get(), mEffectChains.size(), this);
6333     if (mEffectChains.size() == 1) {
6334         mEffectChains.removeAt(0);
6335     }
6336     return 0;
6337 }
6338 
createAudioPatch_l(const struct audio_patch * patch,audio_patch_handle_t * handle)6339 status_t AudioFlinger::RecordThread::createAudioPatch_l(const struct audio_patch *patch,
6340                                                           audio_patch_handle_t *handle)
6341 {
6342     status_t status = NO_ERROR;
6343     if (mInput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
6344         // store new device and send to effects
6345         mInDevice = patch->sources[0].ext.device.type;
6346         for (size_t i = 0; i < mEffectChains.size(); i++) {
6347             mEffectChains[i]->setDevice_l(mInDevice);
6348         }
6349 
6350         // disable AEC and NS if the device is a BT SCO headset supporting those
6351         // pre processings
6352         if (mTracks.size() > 0) {
6353             bool suspend = audio_is_bluetooth_sco_device(mInDevice) &&
6354                                 mAudioFlinger->btNrecIsOff();
6355             for (size_t i = 0; i < mTracks.size(); i++) {
6356                 sp<RecordTrack> track = mTracks[i];
6357                 setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
6358                 setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
6359             }
6360         }
6361 
6362         // store new source and send to effects
6363         if (mAudioSource != patch->sinks[0].ext.mix.usecase.source) {
6364             mAudioSource = patch->sinks[0].ext.mix.usecase.source;
6365             for (size_t i = 0; i < mEffectChains.size(); i++) {
6366                 mEffectChains[i]->setAudioSource_l(mAudioSource);
6367             }
6368         }
6369 
6370         audio_hw_device_t *hwDevice = mInput->audioHwDev->hwDevice();
6371         status = hwDevice->create_audio_patch(hwDevice,
6372                                                patch->num_sources,
6373                                                patch->sources,
6374                                                patch->num_sinks,
6375                                                patch->sinks,
6376                                                handle);
6377     } else {
6378         ALOG_ASSERT(false, "createAudioPatch_l() called on a pre 3.0 HAL");
6379     }
6380     return status;
6381 }
6382 
releaseAudioPatch_l(const audio_patch_handle_t handle)6383 status_t AudioFlinger::RecordThread::releaseAudioPatch_l(const audio_patch_handle_t handle)
6384 {
6385     status_t status = NO_ERROR;
6386     if (mInput->audioHwDev->version() >= AUDIO_DEVICE_API_VERSION_3_0) {
6387         audio_hw_device_t *hwDevice = mInput->audioHwDev->hwDevice();
6388         status = hwDevice->release_audio_patch(hwDevice, handle);
6389     } else {
6390         ALOG_ASSERT(false, "releaseAudioPatch_l() called on a pre 3.0 HAL");
6391     }
6392     return status;
6393 }
6394 
addPatchRecord(const sp<PatchRecord> & record)6395 void AudioFlinger::RecordThread::addPatchRecord(const sp<PatchRecord>& record)
6396 {
6397     Mutex::Autolock _l(mLock);
6398     mTracks.add(record);
6399 }
6400 
deletePatchRecord(const sp<PatchRecord> & record)6401 void AudioFlinger::RecordThread::deletePatchRecord(const sp<PatchRecord>& record)
6402 {
6403     Mutex::Autolock _l(mLock);
6404     destroyTrack_l(record);
6405 }
6406 
getAudioPortConfig(struct audio_port_config * config)6407 void AudioFlinger::RecordThread::getAudioPortConfig(struct audio_port_config *config)
6408 {
6409     ThreadBase::getAudioPortConfig(config);
6410     config->role = AUDIO_PORT_ROLE_SINK;
6411     config->ext.mix.hw_module = mInput->audioHwDev->handle();
6412     config->ext.mix.usecase.source = mAudioSource;
6413 }
6414 
6415 }; // namespace android
6416