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