PageRenderTime 92ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 1ms

/services/audioflinger/Threads.cpp

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