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 <math.h> 23 #include <cutils/compiler.h> 24 #include <utils/Log.h> 25 26 #include <private/media/AudioTrackShared.h> 27 28 #include <common_time/cc_helper.h> 29 #include <common_time/local_clock.h> 30 31 #include "AudioMixer.h" 32 #include "AudioFlinger.h" 33 #include "ServiceUtilities.h" 34 35 #include <media/nbaio/Pipe.h> 36 #include <media/nbaio/PipeReader.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 // ---------------------------------------------------------------------------- 56 // TrackBase 57 // ---------------------------------------------------------------------------- 58 59 static volatile int32_t nextTrackId = 55; 60 61 // TrackBase constructor must be called with AudioFlinger::mLock held 62 AudioFlinger::ThreadBase::TrackBase::TrackBase( 63 ThreadBase *thread, 64 const sp<Client>& client, 65 uint32_t sampleRate, 66 audio_format_t format, 67 audio_channel_mask_t channelMask, 68 size_t frameCount, 69 const sp<IMemory>& sharedBuffer, 70 int sessionId, 71 bool isOut) 72 : RefBase(), 73 mThread(thread), 74 mClient(client), 75 mCblk(NULL), 76 // mBuffer 77 // mBufferEnd 78 mStepCount(0), 79 mState(IDLE), 80 mSampleRate(sampleRate), 81 mFormat(format), 82 mChannelMask(channelMask), 83 mChannelCount(popcount(channelMask)), 84 mFrameSize(audio_is_linear_pcm(format) ? 85 mChannelCount * audio_bytes_per_sample(format) : sizeof(int8_t)), 86 mFrameCount(frameCount), 87 mStepServerFailed(false), 88 mSessionId(sessionId), 89 mIsOut(isOut), 90 mServerProxy(NULL), 91 mId(android_atomic_inc(&nextTrackId)) 92 { 93 // client == 0 implies sharedBuffer == 0 94 ALOG_ASSERT(!(client == 0 && sharedBuffer != 0)); 95 96 ALOGV_IF(sharedBuffer != 0, "sharedBuffer: %p, size: %d", sharedBuffer->pointer(), 97 sharedBuffer->size()); 98 99 // ALOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize); 100 size_t size = sizeof(audio_track_cblk_t); 101 size_t bufferSize = frameCount * mFrameSize; 102 if (sharedBuffer == 0) { 103 size += bufferSize; 104 } 105 106 if (client != 0) { 107 mCblkMemory = client->heap()->allocate(size); 108 if (mCblkMemory != 0) { 109 mCblk = static_cast<audio_track_cblk_t *>(mCblkMemory->pointer()); 110 // can't assume mCblk != NULL 111 } else { 112 ALOGE("not enough memory for AudioTrack size=%u", size); 113 client->heap()->dump("AudioTrack"); 114 return; 115 } 116 } else { 117 // this syntax avoids calling the audio_track_cblk_t constructor twice 118 mCblk = (audio_track_cblk_t *) new uint8_t[size]; 119 // assume mCblk != NULL 120 } 121 122 // construct the shared structure in-place. 123 if (mCblk != NULL) { 124 new(mCblk) audio_track_cblk_t(); 125 // clear all buffers 126 mCblk->frameCount_ = frameCount; 127 // uncomment the following lines to quickly test 32-bit wraparound 128 // mCblk->user = 0xffff0000; 129 // mCblk->server = 0xffff0000; 130 // mCblk->userBase = 0xffff0000; 131 // mCblk->serverBase = 0xffff0000; 132 if (sharedBuffer == 0) { 133 mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t); 134 memset(mBuffer, 0, bufferSize); 135 // Force underrun condition to avoid false underrun callback until first data is 136 // written to buffer (other flags are cleared) 137 mCblk->flags = CBLK_UNDERRUN; 138 } else { 139 mBuffer = sharedBuffer->pointer(); 140 } 141 mBufferEnd = (uint8_t *)mBuffer + bufferSize; 142 mServerProxy = new ServerProxy(mCblk, mBuffer, frameCount, mFrameSize, isOut); 143 144 #ifdef TEE_SINK 145 if (mTeeSinkTrackEnabled) { 146 NBAIO_Format pipeFormat = Format_from_SR_C(mSampleRate, mChannelCount); 147 if (pipeFormat != Format_Invalid) { 148 Pipe *pipe = new Pipe(mTeeSinkTrackFrames, pipeFormat); 149 size_t numCounterOffers = 0; 150 const NBAIO_Format offers[1] = {pipeFormat}; 151 ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers); 152 ALOG_ASSERT(index == 0); 153 PipeReader *pipeReader = new PipeReader(*pipe); 154 numCounterOffers = 0; 155 index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers); 156 ALOG_ASSERT(index == 0); 157 mTeeSink = pipe; 158 mTeeSource = pipeReader; 159 } 160 } 161 #endif 162 163 } 164 } 165 166 AudioFlinger::ThreadBase::TrackBase::~TrackBase() 167 { 168 #ifdef TEE_SINK 169 dumpTee(-1, mTeeSource, mId); 170 #endif 171 // delete the proxy before deleting the shared memory it refers to, to avoid dangling reference 172 delete mServerProxy; 173 if (mCblk != NULL) { 174 if (mClient == 0) { 175 delete mCblk; 176 } else { 177 mCblk->~audio_track_cblk_t(); // destroy our shared-structure. 178 } 179 } 180 mCblkMemory.clear(); // free the shared memory before releasing the heap it belongs to 181 if (mClient != 0) { 182 // Client destructor must run with AudioFlinger mutex locked 183 Mutex::Autolock _l(mClient->audioFlinger()->mLock); 184 // If the client's reference count drops to zero, the associated destructor 185 // must run with AudioFlinger lock held. Thus the explicit clear() rather than 186 // relying on the automatic clear() at end of scope. 187 mClient.clear(); 188 } 189 } 190 191 // AudioBufferProvider interface 192 // getNextBuffer() = 0; 193 // This implementation of releaseBuffer() is used by Track and RecordTrack, but not TimedTrack 194 void AudioFlinger::ThreadBase::TrackBase::releaseBuffer(AudioBufferProvider::Buffer* buffer) 195 { 196 #ifdef TEE_SINK 197 if (mTeeSink != 0) { 198 (void) mTeeSink->write(buffer->raw, buffer->frameCount); 199 } 200 #endif 201 202 buffer->raw = NULL; 203 mStepCount = buffer->frameCount; 204 // FIXME See note at getNextBuffer() 205 (void) step(); // ignore return value of step() 206 buffer->frameCount = 0; 207 } 208 209 bool AudioFlinger::ThreadBase::TrackBase::step() { 210 bool result = mServerProxy->step(mStepCount); 211 if (!result) { 212 ALOGV("stepServer failed acquiring cblk mutex"); 213 mStepServerFailed = true; 214 } 215 return result; 216 } 217 218 void AudioFlinger::ThreadBase::TrackBase::reset() { 219 audio_track_cblk_t* cblk = this->cblk(); 220 221 cblk->user = 0; 222 cblk->server = 0; 223 cblk->userBase = 0; 224 cblk->serverBase = 0; 225 mStepServerFailed = false; 226 ALOGV("TrackBase::reset"); 227 } 228 229 uint32_t AudioFlinger::ThreadBase::TrackBase::sampleRate() const { 230 return mServerProxy->getSampleRate(); 231 } 232 233 void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t frames) const { 234 audio_track_cblk_t* cblk = this->cblk(); 235 int8_t *bufferStart = (int8_t *)mBuffer + (offset-cblk->serverBase) * mFrameSize; 236 int8_t *bufferEnd = bufferStart + frames * mFrameSize; 237 238 // Check validity of returned pointer in case the track control block would have been corrupted. 239 ALOG_ASSERT(!(bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd), 240 "TrackBase::getBuffer buffer out of range:\n" 241 " start: %p, end %p , mBuffer %p mBufferEnd %p\n" 242 " server %u, serverBase %u, user %u, userBase %u, frameSize %u", 243 bufferStart, bufferEnd, mBuffer, mBufferEnd, 244 cblk->server, cblk->serverBase, cblk->user, cblk->userBase, mFrameSize); 245 246 return bufferStart; 247 } 248 249 status_t AudioFlinger::ThreadBase::TrackBase::setSyncEvent(const sp<SyncEvent>& event) 250 { 251 mSyncEvents.add(event); 252 return NO_ERROR; 253 } 254 255 // ---------------------------------------------------------------------------- 256 // Playback 257 // ---------------------------------------------------------------------------- 258 259 AudioFlinger::TrackHandle::TrackHandle(const sp<AudioFlinger::PlaybackThread::Track>& track) 260 : BnAudioTrack(), 261 mTrack(track) 262 { 263 } 264 265 AudioFlinger::TrackHandle::~TrackHandle() { 266 // just stop the track on deletion, associated resources 267 // will be freed from the main thread once all pending buffers have 268 // been played. Unless it's not in the active track list, in which 269 // case we free everything now... 270 mTrack->destroy(); 271 } 272 273 sp<IMemory> AudioFlinger::TrackHandle::getCblk() const { 274 return mTrack->getCblk(); 275 } 276 277 status_t AudioFlinger::TrackHandle::start() { 278 return mTrack->start(); 279 } 280 281 void AudioFlinger::TrackHandle::stop() { 282 mTrack->stop(); 283 } 284 285 void AudioFlinger::TrackHandle::flush() { 286 mTrack->flush(); 287 } 288 289 void AudioFlinger::TrackHandle::pause() { 290 mTrack->pause(); 291 } 292 293 status_t AudioFlinger::TrackHandle::attachAuxEffect(int EffectId) 294 { 295 return mTrack->attachAuxEffect(EffectId); 296 } 297 298 status_t AudioFlinger::TrackHandle::allocateTimedBuffer(size_t size, 299 sp<IMemory>* buffer) { 300 if (!mTrack->isTimedTrack()) 301 return INVALID_OPERATION; 302 303 PlaybackThread::TimedTrack* tt = 304 reinterpret_cast<PlaybackThread::TimedTrack*>(mTrack.get()); 305 return tt->allocateTimedBuffer(size, buffer); 306 } 307 308 status_t AudioFlinger::TrackHandle::queueTimedBuffer(const sp<IMemory>& buffer, 309 int64_t pts) { 310 if (!mTrack->isTimedTrack()) 311 return INVALID_OPERATION; 312 313 PlaybackThread::TimedTrack* tt = 314 reinterpret_cast<PlaybackThread::TimedTrack*>(mTrack.get()); 315 return tt->queueTimedBuffer(buffer, pts); 316 } 317 318 status_t AudioFlinger::TrackHandle::setMediaTimeTransform( 319 const LinearTransform& xform, int target) { 320 321 if (!mTrack->isTimedTrack()) 322 return INVALID_OPERATION; 323 324 PlaybackThread::TimedTrack* tt = 325 reinterpret_cast<PlaybackThread::TimedTrack*>(mTrack.get()); 326 return tt->setMediaTimeTransform( 327 xform, static_cast<TimedAudioTrack::TargetTimeline>(target)); 328 } 329 330 status_t AudioFlinger::TrackHandle::onTransact( 331 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 332 { 333 return BnAudioTrack::onTransact(code, data, reply, flags); 334 } 335 336 // ---------------------------------------------------------------------------- 337 338 // Track constructor must be called with AudioFlinger::mLock and ThreadBase::mLock held 339 AudioFlinger::PlaybackThread::Track::Track( 340 PlaybackThread *thread, 341 const sp<Client>& client, 342 audio_stream_type_t streamType, 343 uint32_t sampleRate, 344 audio_format_t format, 345 audio_channel_mask_t channelMask, 346 size_t frameCount, 347 const sp<IMemory>& sharedBuffer, 348 int sessionId, 349 IAudioFlinger::track_flags_t flags) 350 : TrackBase(thread, client, sampleRate, format, channelMask, frameCount, sharedBuffer, 351 sessionId, true /*isOut*/), 352 mFillingUpStatus(FS_INVALID), 353 // mRetryCount initialized later when needed 354 mSharedBuffer(sharedBuffer), 355 mStreamType(streamType), 356 mName(-1), // see note below 357 mMainBuffer(thread->mixBuffer()), 358 mAuxBuffer(NULL), 359 mAuxEffectId(0), mHasVolumeController(false), 360 mPresentationCompleteFrames(0), 361 mFlags(flags), 362 mFastIndex(-1), 363 mUnderrunCount(0), 364 mCachedVolume(1.0), 365 mIsInvalid(false) 366 { 367 if (mCblk != NULL) { 368 // to avoid leaking a track name, do not allocate one unless there is an mCblk 369 mName = thread->getTrackName_l(channelMask, sessionId); 370 mCblk->mName = mName; 371 if (mName < 0) { 372 ALOGE("no more track names available"); 373 return; 374 } 375 // only allocate a fast track index if we were able to allocate a normal track name 376 if (flags & IAudioFlinger::TRACK_FAST) { 377 ALOG_ASSERT(thread->mFastTrackAvailMask != 0); 378 int i = __builtin_ctz(thread->mFastTrackAvailMask); 379 ALOG_ASSERT(0 < i && i < (int)FastMixerState::kMaxFastTracks); 380 // FIXME This is too eager. We allocate a fast track index before the 381 // fast track becomes active. Since fast tracks are a scarce resource, 382 // this means we are potentially denying other more important fast tracks from 383 // being created. It would be better to allocate the index dynamically. 384 mFastIndex = i; 385 mCblk->mName = i; 386 // Read the initial underruns because this field is never cleared by the fast mixer 387 mObservedUnderruns = thread->getFastTrackUnderruns(i); 388 thread->mFastTrackAvailMask &= ~(1 << i); 389 } 390 } 391 ALOGV("Track constructor name %d, calling pid %d", mName, 392 IPCThreadState::self()->getCallingPid()); 393 } 394 395 AudioFlinger::PlaybackThread::Track::~Track() 396 { 397 ALOGV("PlaybackThread::Track destructor"); 398 } 399 400 void AudioFlinger::PlaybackThread::Track::destroy() 401 { 402 // NOTE: destroyTrack_l() can remove a strong reference to this Track 403 // by removing it from mTracks vector, so there is a risk that this Tracks's 404 // destructor is called. As the destructor needs to lock mLock, 405 // we must acquire a strong reference on this Track before locking mLock 406 // here so that the destructor is called only when exiting this function. 407 // On the other hand, as long as Track::destroy() is only called by 408 // TrackHandle destructor, the TrackHandle still holds a strong ref on 409 // this Track with its member mTrack. 410 sp<Track> keep(this); 411 { // scope for mLock 412 sp<ThreadBase> thread = mThread.promote(); 413 if (thread != 0) { 414 if (!isOutputTrack()) { 415 if (mState == ACTIVE || mState == RESUMING) { 416 AudioSystem::stopOutput(thread->id(), mStreamType, mSessionId); 417 418 #ifdef ADD_BATTERY_DATA 419 // to track the speaker usage 420 addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop); 421 #endif 422 } 423 AudioSystem::releaseOutput(thread->id()); 424 } 425 Mutex::Autolock _l(thread->mLock); 426 PlaybackThread *playbackThread = (PlaybackThread *)thread.get(); 427 playbackThread->destroyTrack_l(this); 428 } 429 } 430 } 431 432 /*static*/ void AudioFlinger::PlaybackThread::Track::appendDumpHeader(String8& result) 433 { 434 result.append(" Name Client Type Fmt Chn mask Session StpCnt fCount S F SRate " 435 "L dB R dB Server User Main buf Aux Buf Flags Underruns\n"); 436 } 437 438 void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size) 439 { 440 uint32_t vlr = mServerProxy->getVolumeLR(); 441 if (isFastTrack()) { 442 sprintf(buffer, " F %2d", mFastIndex); 443 } else { 444 sprintf(buffer, " %4d", mName - AudioMixer::TRACK0); 445 } 446 track_state state = mState; 447 char stateChar; 448 switch (state) { 449 case IDLE: 450 stateChar = 'I'; 451 break; 452 case TERMINATED: 453 stateChar = 'T'; 454 break; 455 case STOPPING_1: 456 stateChar = 's'; 457 break; 458 case STOPPING_2: 459 stateChar = '5'; 460 break; 461 case STOPPED: 462 stateChar = 'S'; 463 break; 464 case RESUMING: 465 stateChar = 'R'; 466 break; 467 case ACTIVE: 468 stateChar = 'A'; 469 break; 470 case PAUSING: 471 stateChar = 'p'; 472 break; 473 case PAUSED: 474 stateChar = 'P'; 475 break; 476 case FLUSHED: 477 stateChar = 'F'; 478 break; 479 default: 480 stateChar = '?'; 481 break; 482 } 483 char nowInUnderrun; 484 switch (mObservedUnderruns.mBitFields.mMostRecent) { 485 case UNDERRUN_FULL: 486 nowInUnderrun = ' '; 487 break; 488 case UNDERRUN_PARTIAL: 489 nowInUnderrun = '<'; 490 break; 491 case UNDERRUN_EMPTY: 492 nowInUnderrun = '*'; 493 break; 494 default: 495 nowInUnderrun = '?'; 496 break; 497 } 498 snprintf(&buffer[7], size-7, " %6d %4u %3u 0x%08x %7u %6u %6u %1c %1d %5u %5.2g %5.2g " 499 "0x%08x 0x%08x 0x%08x 0x%08x %#5x %9u%c\n", 500 (mClient == 0) ? getpid_cached : mClient->pid(), 501 mStreamType, 502 mFormat, 503 mChannelMask, 504 mSessionId, 505 mStepCount, 506 mFrameCount, 507 stateChar, 508 mFillingUpStatus, 509 mServerProxy->getSampleRate(), 510 20.0 * log10((vlr & 0xFFFF) / 4096.0), 511 20.0 * log10((vlr >> 16) / 4096.0), 512 mCblk->server, 513 mCblk->user, 514 (int)mMainBuffer, 515 (int)mAuxBuffer, 516 mCblk->flags, 517 mUnderrunCount, 518 nowInUnderrun); 519 } 520 521 // AudioBufferProvider interface 522 status_t AudioFlinger::PlaybackThread::Track::getNextBuffer( 523 AudioBufferProvider::Buffer* buffer, int64_t pts) 524 { 525 audio_track_cblk_t* cblk = this->cblk(); 526 uint32_t framesReady; 527 uint32_t framesReq = buffer->frameCount; 528 529 // Check if last stepServer failed, try to step now 530 if (mStepServerFailed) { 531 // FIXME When called by fast mixer, this takes a mutex with tryLock(). 532 // Since the fast mixer is higher priority than client callback thread, 533 // it does not result in priority inversion for client. 534 // But a non-blocking solution would be preferable to avoid 535 // fast mixer being unable to tryLock(), and 536 // to avoid the extra context switches if the client wakes up, 537 // discovers the mutex is locked, then has to wait for fast mixer to unlock. 538 if (!step()) goto getNextBuffer_exit; 539 ALOGV("stepServer recovered"); 540 mStepServerFailed = false; 541 } 542 543 // FIXME Same as above 544 framesReady = mServerProxy->framesReady(); 545 546 if (CC_LIKELY(framesReady)) { 547 uint32_t s = cblk->server; 548 uint32_t bufferEnd = cblk->serverBase + mFrameCount; 549 550 bufferEnd = (cblk->loopEnd < bufferEnd) ? cblk->loopEnd : bufferEnd; 551 if (framesReq > framesReady) { 552 framesReq = framesReady; 553 } 554 if (framesReq > bufferEnd - s) { 555 framesReq = bufferEnd - s; 556 } 557 558 buffer->raw = getBuffer(s, framesReq); 559 buffer->frameCount = framesReq; 560 return NO_ERROR; 561 } 562 563 getNextBuffer_exit: 564 buffer->raw = NULL; 565 buffer->frameCount = 0; 566 ALOGV("getNextBuffer() no more data for track %d on thread %p", mName, mThread.unsafe_get()); 567 return NOT_ENOUGH_DATA; 568 } 569 570 // Note that framesReady() takes a mutex on the control block using tryLock(). 571 // This could result in priority inversion if framesReady() is called by the normal mixer, 572 // as the normal mixer thread runs at lower 573 // priority than the client's callback thread: there is a short window within framesReady() 574 // during which the normal mixer could be preempted, and the client callback would block. 575 // Another problem can occur if framesReady() is called by the fast mixer: 576 // the tryLock() could block for up to 1 ms, and a sequence of these could delay fast mixer. 577 // FIXME Replace AudioTrackShared control block implementation by a non-blocking FIFO queue. 578 size_t AudioFlinger::PlaybackThread::Track::framesReady() const { 579 return mServerProxy->framesReady(); 580 } 581 582 // Don't call for fast tracks; the framesReady() could result in priority inversion 583 bool AudioFlinger::PlaybackThread::Track::isReady() const { 584 if (mFillingUpStatus != FS_FILLING || isStopped() || isPausing()) { 585 return true; 586 } 587 588 if (framesReady() >= mFrameCount || 589 (mCblk->flags & CBLK_FORCEREADY)) { 590 mFillingUpStatus = FS_FILLED; 591 android_atomic_and(~CBLK_FORCEREADY, &mCblk->flags); 592 return true; 593 } 594 return false; 595 } 596 597 status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t event, 598 int triggerSession) 599 { 600 status_t status = NO_ERROR; 601 ALOGV("start(%d), calling pid %d session %d", 602 mName, IPCThreadState::self()->getCallingPid(), mSessionId); 603 604 sp<ThreadBase> thread = mThread.promote(); 605 if (thread != 0) { 606 Mutex::Autolock _l(thread->mLock); 607 track_state state = mState; 608 // here the track could be either new, or restarted 609 // in both cases "unstop" the track 610 if (state == PAUSED) { 611 mState = TrackBase::RESUMING; 612 ALOGV("PAUSED => RESUMING (%d) on thread %p", mName, this); 613 } else { 614 mState = TrackBase::ACTIVE; 615 ALOGV("? => ACTIVE (%d) on thread %p", mName, this); 616 } 617 618 if (!isOutputTrack() && state != ACTIVE && state != RESUMING) { 619 thread->mLock.unlock(); 620 status = AudioSystem::startOutput(thread->id(), mStreamType, mSessionId); 621 thread->mLock.lock(); 622 623 #ifdef ADD_BATTERY_DATA 624 // to track the speaker usage 625 if (status == NO_ERROR) { 626 addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStart); 627 } 628 #endif 629 } 630 if (status == NO_ERROR) { 631 PlaybackThread *playbackThread = (PlaybackThread *)thread.get(); 632 playbackThread->addTrack_l(this); 633 } else { 634 mState = state; 635 triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE); 636 } 637 } else { 638 status = BAD_VALUE; 639 } 640 return status; 641 } 642 643 void AudioFlinger::PlaybackThread::Track::stop() 644 { 645 ALOGV("stop(%d), calling pid %d", mName, IPCThreadState::self()->getCallingPid()); 646 sp<ThreadBase> thread = mThread.promote(); 647 if (thread != 0) { 648 Mutex::Autolock _l(thread->mLock); 649 track_state state = mState; 650 if (state == RESUMING || state == ACTIVE || state == PAUSING || state == PAUSED) { 651 // If the track is not active (PAUSED and buffers full), flush buffers 652 PlaybackThread *playbackThread = (PlaybackThread *)thread.get(); 653 if (playbackThread->mActiveTracks.indexOf(this) < 0) { 654 reset(); 655 mState = STOPPED; 656 } else if (!isFastTrack()) { 657 mState = STOPPED; 658 } else { 659 // prepareTracks_l() will set state to STOPPING_2 after next underrun, 660 // and then to STOPPED and reset() when presentation is complete 661 mState = STOPPING_1; 662 } 663 ALOGV("not stopping/stopped => stopping/stopped (%d) on thread %p", mName, 664 playbackThread); 665 } 666 if (!isOutputTrack() && (state == ACTIVE || state == RESUMING)) { 667 thread->mLock.unlock(); 668 AudioSystem::stopOutput(thread->id(), mStreamType, mSessionId); 669 thread->mLock.lock(); 670 671 #ifdef ADD_BATTERY_DATA 672 // to track the speaker usage 673 addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop); 674 #endif 675 } 676 } 677 } 678 679 void AudioFlinger::PlaybackThread::Track::pause() 680 { 681 ALOGV("pause(%d), calling pid %d", mName, IPCThreadState::self()->getCallingPid()); 682 sp<ThreadBase> thread = mThread.promote(); 683 if (thread != 0) { 684 Mutex::Autolock _l(thread->mLock); 685 if (mState == ACTIVE || mState == RESUMING) { 686 mState = PAUSING; 687 ALOGV("ACTIVE/RESUMING => PAUSING (%d) on thread %p", mName, thread.get()); 688 if (!isOutputTrack()) { 689 thread->mLock.unlock(); 690 AudioSystem::stopOutput(thread->id(), mStreamType, mSessionId); 691 thread->mLock.lock(); 692 693 #ifdef ADD_BATTERY_DATA 694 // to track the speaker usage 695 addBatteryData(IMediaPlayerService::kBatteryDataAudioFlingerStop); 696 #endif 697 } 698 } 699 } 700 } 701 702 void AudioFlinger::PlaybackThread::Track::flush() 703 { 704 ALOGV("flush(%d)", mName); 705 sp<ThreadBase> thread = mThread.promote(); 706 if (thread != 0) { 707 Mutex::Autolock _l(thread->mLock); 708 if (mState != STOPPING_1 && mState != STOPPING_2 && mState != STOPPED && mState != PAUSED && 709 mState != PAUSING && mState != IDLE && mState != FLUSHED) { 710 return; 711 } 712 // No point remaining in PAUSED state after a flush => go to 713 // FLUSHED state 714 mState = FLUSHED; 715 // do not reset the track if it is still in the process of being stopped or paused. 716 // this will be done by prepareTracks_l() when the track is stopped. 717 // prepareTracks_l() will see mState == FLUSHED, then 718 // remove from active track list, reset(), and trigger presentation complete 719 PlaybackThread *playbackThread = (PlaybackThread *)thread.get(); 720 if (playbackThread->mActiveTracks.indexOf(this) < 0) { 721 reset(); 722 } 723 } 724 } 725 726 void AudioFlinger::PlaybackThread::Track::reset() 727 { 728 // Do not reset twice to avoid discarding data written just after a flush and before 729 // the audioflinger thread detects the track is stopped. 730 if (!mResetDone) { 731 TrackBase::reset(); 732 // Force underrun condition to avoid false underrun callback until first data is 733 // written to buffer 734 android_atomic_and(~CBLK_FORCEREADY, &mCblk->flags); 735 android_atomic_or(CBLK_UNDERRUN, &mCblk->flags); 736 mFillingUpStatus = FS_FILLING; 737 mResetDone = true; 738 if (mState == FLUSHED) { 739 mState = IDLE; 740 } 741 } 742 } 743 744 status_t AudioFlinger::PlaybackThread::Track::attachAuxEffect(int EffectId) 745 { 746 status_t status = DEAD_OBJECT; 747 sp<ThreadBase> thread = mThread.promote(); 748 if (thread != 0) { 749 PlaybackThread *playbackThread = (PlaybackThread *)thread.get(); 750 sp<AudioFlinger> af = mClient->audioFlinger(); 751 752 Mutex::Autolock _l(af->mLock); 753 754 sp<PlaybackThread> srcThread = af->getEffectThread_l(AUDIO_SESSION_OUTPUT_MIX, EffectId); 755 756 if (EffectId != 0 && srcThread != 0 && playbackThread != srcThread.get()) { 757 Mutex::Autolock _dl(playbackThread->mLock); 758 Mutex::Autolock _sl(srcThread->mLock); 759 sp<EffectChain> chain = srcThread->getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX); 760 if (chain == 0) { 761 return INVALID_OPERATION; 762 } 763 764 sp<EffectModule> effect = chain->getEffectFromId_l(EffectId); 765 if (effect == 0) { 766 return INVALID_OPERATION; 767 } 768 srcThread->removeEffect_l(effect); 769 playbackThread->addEffect_l(effect); 770 // removeEffect_l() has stopped the effect if it was active so it must be restarted 771 if (effect->state() == EffectModule::ACTIVE || 772 effect->state() == EffectModule::STOPPING) { 773 effect->start(); 774 } 775 776 sp<EffectChain> dstChain = effect->chain().promote(); 777 if (dstChain == 0) { 778 srcThread->addEffect_l(effect); 779 return INVALID_OPERATION; 780 } 781 AudioSystem::unregisterEffect(effect->id()); 782 AudioSystem::registerEffect(&effect->desc(), 783 srcThread->id(), 784 dstChain->strategy(), 785 AUDIO_SESSION_OUTPUT_MIX, 786 effect->id()); 787 } 788 status = playbackThread->attachAuxEffect(this, EffectId); 789 } 790 return status; 791 } 792 793 void AudioFlinger::PlaybackThread::Track::setAuxBuffer(int EffectId, int32_t *buffer) 794 { 795 mAuxEffectId = EffectId; 796 mAuxBuffer = buffer; 797 } 798 799 bool AudioFlinger::PlaybackThread::Track::presentationComplete(size_t framesWritten, 800 size_t audioHalFrames) 801 { 802 // a track is considered presented when the total number of frames written to audio HAL 803 // corresponds to the number of frames written when presentationComplete() is called for the 804 // first time (mPresentationCompleteFrames == 0) plus the buffer filling status at that time. 805 if (mPresentationCompleteFrames == 0) { 806 mPresentationCompleteFrames = framesWritten + audioHalFrames; 807 ALOGV("presentationComplete() reset: mPresentationCompleteFrames %d audioHalFrames %d", 808 mPresentationCompleteFrames, audioHalFrames); 809 } 810 if (framesWritten >= mPresentationCompleteFrames) { 811 ALOGV("presentationComplete() session %d complete: framesWritten %d", 812 mSessionId, framesWritten); 813 triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE); 814 return true; 815 } 816 return false; 817 } 818 819 void AudioFlinger::PlaybackThread::Track::triggerEvents(AudioSystem::sync_event_t type) 820 { 821 for (int i = 0; i < (int)mSyncEvents.size(); i++) { 822 if (mSyncEvents[i]->type() == type) { 823 mSyncEvents[i]->trigger(); 824 mSyncEvents.removeAt(i); 825 i--; 826 } 827 } 828 } 829 830 // implement VolumeBufferProvider interface 831 832 uint32_t AudioFlinger::PlaybackThread::Track::getVolumeLR() 833 { 834 // called by FastMixer, so not allowed to take any locks, block, or do I/O including logs 835 ALOG_ASSERT(isFastTrack() && (mCblk != NULL)); 836 uint32_t vlr = mServerProxy->getVolumeLR(); 837 uint32_t vl = vlr & 0xFFFF; 838 uint32_t vr = vlr >> 16; 839 // track volumes come from shared memory, so can't be trusted and must be clamped 840 if (vl > MAX_GAIN_INT) { 841 vl = MAX_GAIN_INT; 842 } 843 if (vr > MAX_GAIN_INT) { 844 vr = MAX_GAIN_INT; 845 } 846 // now apply the cached master volume and stream type volume; 847 // this is trusted but lacks any synchronization or barrier so may be stale 848 float v = mCachedVolume; 849 vl *= v; 850 vr *= v; 851 // re-combine into U4.16 852 vlr = (vr << 16) | (vl & 0xFFFF); 853 // FIXME look at mute, pause, and stop flags 854 return vlr; 855 } 856 857 status_t AudioFlinger::PlaybackThread::Track::setSyncEvent(const sp<SyncEvent>& event) 858 { 859 if (mState == TERMINATED || mState == PAUSED || 860 ((framesReady() == 0) && ((mSharedBuffer != 0) || 861 (mState == STOPPED)))) { 862 ALOGW("Track::setSyncEvent() in invalid state %d on session %d %s mode, framesReady %d ", 863 mState, mSessionId, (mSharedBuffer != 0) ? "static" : "stream", framesReady()); 864 event->cancel(); 865 return INVALID_OPERATION; 866 } 867 (void) TrackBase::setSyncEvent(event); 868 return NO_ERROR; 869 } 870 871 void AudioFlinger::PlaybackThread::Track::invalidate() 872 { 873 // FIXME should use proxy 874 android_atomic_or(CBLK_INVALID, &mCblk->flags); 875 mCblk->cv.signal(); 876 mIsInvalid = true; 877 } 878 879 // ---------------------------------------------------------------------------- 880 881 sp<AudioFlinger::PlaybackThread::TimedTrack> 882 AudioFlinger::PlaybackThread::TimedTrack::create( 883 PlaybackThread *thread, 884 const sp<Client>& client, 885 audio_stream_type_t streamType, 886 uint32_t sampleRate, 887 audio_format_t format, 888 audio_channel_mask_t channelMask, 889 size_t frameCount, 890 const sp<IMemory>& sharedBuffer, 891 int sessionId) { 892 if (!client->reserveTimedTrack()) 893 return 0; 894 895 return new TimedTrack( 896 thread, client, streamType, sampleRate, format, channelMask, frameCount, 897 sharedBuffer, sessionId); 898 } 899 900 AudioFlinger::PlaybackThread::TimedTrack::TimedTrack( 901 PlaybackThread *thread, 902 const sp<Client>& client, 903 audio_stream_type_t streamType, 904 uint32_t sampleRate, 905 audio_format_t format, 906 audio_channel_mask_t channelMask, 907 size_t frameCount, 908 const sp<IMemory>& sharedBuffer, 909 int sessionId) 910 : Track(thread, client, streamType, sampleRate, format, channelMask, 911 frameCount, sharedBuffer, sessionId, IAudioFlinger::TRACK_TIMED), 912 mQueueHeadInFlight(false), 913 mTrimQueueHeadOnRelease(false), 914 mFramesPendingInQueue(0), 915 mTimedSilenceBuffer(NULL), 916 mTimedSilenceBufferSize(0), 917 mTimedAudioOutputOnTime(false), 918 mMediaTimeTransformValid(false) 919 { 920 LocalClock lc; 921 mLocalTimeFreq = lc.getLocalFreq(); 922 923 mLocalTimeToSampleTransform.a_zero = 0; 924 mLocalTimeToSampleTransform.b_zero = 0; 925 mLocalTimeToSampleTransform.a_to_b_numer = sampleRate; 926 mLocalTimeToSampleTransform.a_to_b_denom = mLocalTimeFreq; 927 LinearTransform::reduce(&mLocalTimeToSampleTransform.a_to_b_numer, 928 &mLocalTimeToSampleTransform.a_to_b_denom); 929 930 mMediaTimeToSampleTransform.a_zero = 0; 931 mMediaTimeToSampleTransform.b_zero = 0; 932 mMediaTimeToSampleTransform.a_to_b_numer = sampleRate; 933 mMediaTimeToSampleTransform.a_to_b_denom = 1000000; 934 LinearTransform::reduce(&mMediaTimeToSampleTransform.a_to_b_numer, 935 &mMediaTimeToSampleTransform.a_to_b_denom); 936 } 937 938 AudioFlinger::PlaybackThread::TimedTrack::~TimedTrack() { 939 mClient->releaseTimedTrack(); 940 delete [] mTimedSilenceBuffer; 941 } 942 943 status_t AudioFlinger::PlaybackThread::TimedTrack::allocateTimedBuffer( 944 size_t size, sp<IMemory>* buffer) { 945 946 Mutex::Autolock _l(mTimedBufferQueueLock); 947 948 trimTimedBufferQueue_l(); 949 950 // lazily initialize the shared memory heap for timed buffers 951 if (mTimedMemoryDealer == NULL) { 952 const int kTimedBufferHeapSize = 512 << 10; 953 954 mTimedMemoryDealer = new MemoryDealer(kTimedBufferHeapSize, 955 "AudioFlingerTimed"); 956 if (mTimedMemoryDealer == NULL) 957 return NO_MEMORY; 958 } 959 960 sp<IMemory> newBuffer = mTimedMemoryDealer->allocate(size); 961 if (newBuffer == NULL) { 962 newBuffer = mTimedMemoryDealer->allocate(size); 963 if (newBuffer == NULL) 964 return NO_MEMORY; 965 } 966 967 *buffer = newBuffer; 968 return NO_ERROR; 969 } 970 971 // caller must hold mTimedBufferQueueLock 972 void AudioFlinger::PlaybackThread::TimedTrack::trimTimedBufferQueue_l() { 973 int64_t mediaTimeNow; 974 { 975 Mutex::Autolock mttLock(mMediaTimeTransformLock); 976 if (!mMediaTimeTransformValid) 977 return; 978 979 int64_t targetTimeNow; 980 status_t res = (mMediaTimeTransformTarget == TimedAudioTrack::COMMON_TIME) 981 ? mCCHelper.getCommonTime(&targetTimeNow) 982 : mCCHelper.getLocalTime(&targetTimeNow); 983 984 if (OK != res) 985 return; 986 987 if (!mMediaTimeTransform.doReverseTransform(targetTimeNow, 988 &mediaTimeNow)) { 989 return; 990 } 991 } 992 993 size_t trimEnd; 994 for (trimEnd = 0; trimEnd < mTimedBufferQueue.size(); trimEnd++) { 995 int64_t bufEnd; 996 997 if ((trimEnd + 1) < mTimedBufferQueue.size()) { 998 // We have a next buffer. Just use its PTS as the PTS of the frame 999 // following the last frame in this buffer. If the stream is sparse 1000 // (ie, there are deliberate gaps left in the stream which should be 1001 // filled with silence by the TimedAudioTrack), then this can result 1002 // in one extra buffer being left un-trimmed when it could have 1003 // been. In general, this is not typical, and we would rather 1004 // optimized away the TS calculation below for the more common case 1005 // where PTSes are contiguous. 1006 bufEnd = mTimedBufferQueue[trimEnd + 1].pts(); 1007 } else { 1008 // We have no next buffer. Compute the PTS of the frame following 1009 // the last frame in this buffer by computing the duration of of 1010 // this frame in media time units and adding it to the PTS of the 1011 // buffer. 1012 int64_t frameCount = mTimedBufferQueue[trimEnd].buffer()->size() 1013 / mFrameSize; 1014 1015 if (!mMediaTimeToSampleTransform.doReverseTransform(frameCount, 1016 &bufEnd)) { 1017 ALOGE("Failed to convert frame count of %lld to media time" 1018 " duration" " (scale factor %d/%u) in %s", 1019 frameCount, 1020 mMediaTimeToSampleTransform.a_to_b_numer, 1021 mMediaTimeToSampleTransform.a_to_b_denom, 1022 __PRETTY_FUNCTION__); 1023 break; 1024 } 1025 bufEnd += mTimedBufferQueue[trimEnd].pts(); 1026 } 1027 1028 if (bufEnd > mediaTimeNow) 1029 break; 1030 1031 // Is the buffer we want to use in the middle of a mix operation right 1032 // now? If so, don't actually trim it. Just wait for the releaseBuffer 1033 // from the mixer which should be coming back shortly. 1034 if (!trimEnd && mQueueHeadInFlight) { 1035 mTrimQueueHeadOnRelease = true; 1036 } 1037 } 1038 1039 size_t trimStart = mTrimQueueHeadOnRelease ? 1 : 0; 1040 if (trimStart < trimEnd) { 1041 // Update the bookkeeping for framesReady() 1042 for (size_t i = trimStart; i < trimEnd; ++i) { 1043 updateFramesPendingAfterTrim_l(mTimedBufferQueue[i], "trim"); 1044 } 1045 1046 // Now actually remove the buffers from the queue. 1047 mTimedBufferQueue.removeItemsAt(trimStart, trimEnd); 1048 } 1049 } 1050 1051 void AudioFlinger::PlaybackThread::TimedTrack::trimTimedBufferQueueHead_l( 1052 const char* logTag) { 1053 ALOG_ASSERT(mTimedBufferQueue.size() > 0, 1054 "%s called (reason \"%s\"), but timed buffer queue has no" 1055 " elements to trim.", __FUNCTION__, logTag); 1056 1057 updateFramesPendingAfterTrim_l(mTimedBufferQueue[0], logTag); 1058 mTimedBufferQueue.removeAt(0); 1059 } 1060 1061 void AudioFlinger::PlaybackThread::TimedTrack::updateFramesPendingAfterTrim_l( 1062 const TimedBuffer& buf, 1063 const char* logTag) { 1064 uint32_t bufBytes = buf.buffer()->size(); 1065 uint32_t consumedAlready = buf.position(); 1066 1067 ALOG_ASSERT(consumedAlready <= bufBytes, 1068 "Bad bookkeeping while updating frames pending. Timed buffer is" 1069 " only %u bytes long, but claims to have consumed %u" 1070 " bytes. (update reason: \"%s\")", 1071 bufBytes, consumedAlready, logTag); 1072 1073 uint32_t bufFrames = (bufBytes - consumedAlready) / mFrameSize; 1074 ALOG_ASSERT(mFramesPendingInQueue >= bufFrames, 1075 "Bad bookkeeping while updating frames pending. Should have at" 1076 " least %u queued frames, but we think we have only %u. (update" 1077 " reason: \"%s\")", 1078 bufFrames, mFramesPendingInQueue, logTag); 1079 1080 mFramesPendingInQueue -= bufFrames; 1081 } 1082 1083 status_t AudioFlinger::PlaybackThread::TimedTrack::queueTimedBuffer( 1084 const sp<IMemory>& buffer, int64_t pts) { 1085 1086 { 1087 Mutex::Autolock mttLock(mMediaTimeTransformLock); 1088 if (!mMediaTimeTransformValid) 1089 return INVALID_OPERATION; 1090 } 1091 1092 Mutex::Autolock _l(mTimedBufferQueueLock); 1093 1094 uint32_t bufFrames = buffer->size() / mFrameSize; 1095 mFramesPendingInQueue += bufFrames; 1096 mTimedBufferQueue.add(TimedBuffer(buffer, pts)); 1097 1098 return NO_ERROR; 1099 } 1100 1101 status_t AudioFlinger::PlaybackThread::TimedTrack::setMediaTimeTransform( 1102 const LinearTransform& xform, TimedAudioTrack::TargetTimeline target) { 1103 1104 ALOGVV("setMediaTimeTransform az=%lld bz=%lld n=%d d=%u tgt=%d", 1105 xform.a_zero, xform.b_zero, xform.a_to_b_numer, xform.a_to_b_denom, 1106 target); 1107 1108 if (!(target == TimedAudioTrack::LOCAL_TIME || 1109 target == TimedAudioTrack::COMMON_TIME)) { 1110 return BAD_VALUE; 1111 } 1112 1113 Mutex::Autolock lock(mMediaTimeTransformLock); 1114 mMediaTimeTransform = xform; 1115 mMediaTimeTransformTarget = target; 1116 mMediaTimeTransformValid = true; 1117 1118 return NO_ERROR; 1119 } 1120 1121 #define min(a, b) ((a) < (b) ? (a) : (b)) 1122 1123 // implementation of getNextBuffer for tracks whose buffers have timestamps 1124 status_t AudioFlinger::PlaybackThread::TimedTrack::getNextBuffer( 1125 AudioBufferProvider::Buffer* buffer, int64_t pts) 1126 { 1127 if (pts == AudioBufferProvider::kInvalidPTS) { 1128 buffer->raw = NULL; 1129 buffer->frameCount = 0; 1130 mTimedAudioOutputOnTime = false; 1131 return INVALID_OPERATION; 1132 } 1133 1134 Mutex::Autolock _l(mTimedBufferQueueLock); 1135 1136 ALOG_ASSERT(!mQueueHeadInFlight, 1137 "getNextBuffer called without releaseBuffer!"); 1138 1139 while (true) { 1140 1141 // if we have no timed buffers, then fail 1142 if (mTimedBufferQueue.isEmpty()) { 1143 buffer->raw = NULL; 1144 buffer->frameCount = 0; 1145 return NOT_ENOUGH_DATA; 1146 } 1147 1148 TimedBuffer& head = mTimedBufferQueue.editItemAt(0); 1149 1150 // calculate the PTS of the head of the timed buffer queue expressed in 1151 // local time 1152 int64_t headLocalPTS; 1153 { 1154 Mutex::Autolock mttLock(mMediaTimeTransformLock); 1155 1156 ALOG_ASSERT(mMediaTimeTransformValid, "media time transform invalid"); 1157 1158 if (mMediaTimeTransform.a_to_b_denom == 0) { 1159 // the transform represents a pause, so yield silence 1160 timedYieldSilence_l(buffer->frameCount, buffer); 1161 return NO_ERROR; 1162 } 1163 1164 int64_t transformedPTS; 1165 if (!mMediaTimeTransform.doForwardTransform(head.pts(), 1166 &transformedPTS)) { 1167 // the transform failed. this shouldn't happen, but if it does 1168 // then just drop this buffer 1169 ALOGW("timedGetNextBuffer transform failed"); 1170 buffer->raw = NULL; 1171 buffer->frameCount = 0; 1172 trimTimedBufferQueueHead_l("getNextBuffer; no transform"); 1173 return NO_ERROR; 1174 } 1175 1176 if (mMediaTimeTransformTarget == TimedAudioTrack::COMMON_TIME) { 1177 if (OK != mCCHelper.commonTimeToLocalTime(transformedPTS, 1178 &headLocalPTS)) { 1179 buffer->raw = NULL; 1180 buffer->frameCount = 0; 1181 return INVALID_OPERATION; 1182 } 1183 } else { 1184 headLocalPTS = transformedPTS; 1185 } 1186 } 1187 1188 // adjust the head buffer's PTS to reflect the portion of the head buffer 1189 // that has already been consumed 1190 int64_t effectivePTS = headLocalPTS + 1191 ((head.position() / mFrameSize) * mLocalTimeFreq / sampleRate()); 1192 1193 // Calculate the delta in samples between the head of the input buffer 1194 // queue and the start of the next output buffer that will be written. 1195 // If the transformation fails because of over or underflow, it means 1196 // that the sample's position in the output stream is so far out of 1197 // whack that it should just be dropped. 1198 int64_t sampleDelta; 1199 if (llabs(effectivePTS - pts) >= (static_cast<int64_t>(1) << 31)) { 1200 ALOGV("*** head buffer is too far from PTS: dropped buffer"); 1201 trimTimedBufferQueueHead_l("getNextBuffer, buf pts too far from" 1202 " mix"); 1203 continue; 1204 } 1205 if (!mLocalTimeToSampleTransform.doForwardTransform( 1206 (effectivePTS - pts) << 32, &sampleDelta)) { 1207 ALOGV("*** too late during sample rate transform: dropped buffer"); 1208 trimTimedBufferQueueHead_l("getNextBuffer, bad local to sample"); 1209 continue; 1210 } 1211 1212 ALOGVV("*** getNextBuffer head.pts=%lld head.pos=%d pts=%lld" 1213 " sampleDelta=[%d.%08x]", 1214 head.pts(), head.position(), pts, 1215 static_cast<int32_t>((sampleDelta >= 0 ? 0 : 1) 1216 + (sampleDelta >> 32)), 1217 static_cast<uint32_t>(sampleDelta & 0xFFFFFFFF)); 1218 1219 // if the delta between the ideal placement for the next input sample and 1220 // the current output position is within this threshold, then we will 1221 // concatenate the next input samples to the previous output 1222 const int64_t kSampleContinuityThreshold = 1223 (static_cast<int64_t>(sampleRate()) << 32) / 250; 1224 1225 // if this is the first buffer of audio that we're emitting from this track 1226 // then it should be almost exactly on time. 1227 const int64_t kSampleStartupThreshold = 1LL << 32; 1228 1229 if ((mTimedAudioOutputOnTime && llabs(sampleDelta) <= kSampleContinuityThreshold) || 1230 (!mTimedAudioOutputOnTime && llabs(sampleDelta) <= kSampleStartupThreshold)) { 1231 // the next input is close enough to being on time, so concatenate it 1232 // with the last output 1233 timedYieldSamples_l(buffer); 1234 1235 ALOGVV("*** on time: head.pos=%d frameCount=%u", 1236 head.position(), buffer->frameCount); 1237 return NO_ERROR; 1238 } 1239 1240 // Looks like our output is not on time. Reset our on timed status. 1241 // Next time we mix samples from our input queue, then should be within 1242 // the StartupThreshold. 1243 mTimedAudioOutputOnTime = false; 1244 if (sampleDelta > 0) { 1245 // the gap between the current output position and the proper start of 1246 // the next input sample is too big, so fill it with silence 1247 uint32_t framesUntilNextInput = (sampleDelta + 0x80000000) >> 32; 1248 1249 timedYieldSilence_l(framesUntilNextInput, buffer); 1250 ALOGV("*** silence: frameCount=%u", buffer->frameCount); 1251 return NO_ERROR; 1252 } else { 1253 // the next input sample is late 1254 uint32_t lateFrames = static_cast<uint32_t>(-((sampleDelta + 0x80000000) >> 32)); 1255 size_t onTimeSamplePosition = 1256 head.position() + lateFrames * mFrameSize; 1257 1258 if (onTimeSamplePosition > head.buffer()->size()) { 1259 // all the remaining samples in the head are too late, so 1260 // drop it and move on 1261 ALOGV("*** too late: dropped buffer"); 1262 trimTimedBufferQueueHead_l("getNextBuffer, dropped late buffer"); 1263 continue; 1264 } else { 1265 // skip over the late samples 1266 head.setPosition(onTimeSamplePosition); 1267 1268 // yield the available samples 1269 timedYieldSamples_l(buffer); 1270 1271 ALOGV("*** late: head.pos=%d frameCount=%u", head.position(), buffer->frameCount); 1272 return NO_ERROR; 1273 } 1274 } 1275 } 1276 } 1277 1278 // Yield samples from the timed buffer queue head up to the given output 1279 // buffer's capacity. 1280 // 1281 // Caller must hold mTimedBufferQueueLock 1282 void AudioFlinger::PlaybackThread::TimedTrack::timedYieldSamples_l( 1283 AudioBufferProvider::Buffer* buffer) { 1284 1285 const TimedBuffer& head = mTimedBufferQueue[0]; 1286 1287 buffer->raw = (static_cast<uint8_t*>(head.buffer()->pointer()) + 1288 head.position()); 1289 1290 uint32_t framesLeftInHead = ((head.buffer()->size() - head.position()) / 1291 mFrameSize); 1292 size_t framesRequested = buffer->frameCount; 1293 buffer->frameCount = min(framesLeftInHead, framesRequested); 1294 1295 mQueueHeadInFlight = true; 1296 mTimedAudioOutputOnTime = true; 1297 } 1298 1299 // Yield samples of silence up to the given output buffer's capacity 1300 // 1301 // Caller must hold mTimedBufferQueueLock 1302 void AudioFlinger::PlaybackThread::TimedTrack::timedYieldSilence_l( 1303 uint32_t numFrames, AudioBufferProvider::Buffer* buffer) { 1304 1305 // lazily allocate a buffer filled with silence 1306 if (mTimedSilenceBufferSize < numFrames * mFrameSize) { 1307 delete [] mTimedSilenceBuffer; 1308 mTimedSilenceBufferSize = numFrames * mFrameSize; 1309 mTimedSilenceBuffer = new uint8_t[mTimedSilenceBufferSize]; 1310 memset(mTimedSilenceBuffer, 0, mTimedSilenceBufferSize); 1311 } 1312 1313 buffer->raw = mTimedSilenceBuffer; 1314 size_t framesRequested = buffer->frameCount; 1315 buffer->frameCount = min(numFrames, framesRequested); 1316 1317 mTimedAudioOutputOnTime = false; 1318 } 1319 1320 // AudioBufferProvider interface 1321 void AudioFlinger::PlaybackThread::TimedTrack::releaseBuffer( 1322 AudioBufferProvider::Buffer* buffer) { 1323 1324 Mutex::Autolock _l(mTimedBufferQueueLock); 1325 1326 // If the buffer which was just released is part of the buffer at the head 1327 // of the queue, be sure to update the amt of the buffer which has been 1328 // consumed. If the buffer being returned is not part of the head of the 1329 // queue, its either because the buffer is part of the silence buffer, or 1330 // because the head of the timed queue was trimmed after the mixer called 1331 // getNextBuffer but before the mixer called releaseBuffer. 1332 if (buffer->raw == mTimedSilenceBuffer) { 1333 ALOG_ASSERT(!mQueueHeadInFlight, 1334 "Queue head in flight during release of silence buffer!"); 1335 goto done; 1336 } 1337 1338 ALOG_ASSERT(mQueueHeadInFlight, 1339 "TimedTrack::releaseBuffer of non-silence buffer, but no queue" 1340 " head in flight."); 1341 1342 if (mTimedBufferQueue.size()) { 1343 TimedBuffer& head = mTimedBufferQueue.editItemAt(0); 1344 1345 void* start = head.buffer()->pointer(); 1346 void* end = reinterpret_cast<void*>( 1347 reinterpret_cast<uint8_t*>(head.buffer()->pointer()) 1348 + head.buffer()->size()); 1349 1350 ALOG_ASSERT((buffer->raw >= start) && (buffer->raw < end), 1351 "released buffer not within the head of the timed buffer" 1352 " queue; qHead = [%p, %p], released buffer = %p", 1353 start, end, buffer->raw); 1354 1355 head.setPosition(head.position() + 1356 (buffer->frameCount * mFrameSize)); 1357 mQueueHeadInFlight = false; 1358 1359 ALOG_ASSERT(mFramesPendingInQueue >= buffer->frameCount, 1360 "Bad bookkeeping during releaseBuffer! Should have at" 1361 " least %u queued frames, but we think we have only %u", 1362 buffer->frameCount, mFramesPendingInQueue); 1363 1364 mFramesPendingInQueue -= buffer->frameCount; 1365 1366 if ((static_cast<size_t>(head.position()) >= head.buffer()->size()) 1367 || mTrimQueueHeadOnRelease) { 1368 trimTimedBufferQueueHead_l("releaseBuffer"); 1369 mTrimQueueHeadOnRelease = false; 1370 } 1371 } else { 1372 LOG_FATAL("TimedTrack::releaseBuffer of non-silence buffer with no" 1373 " buffers in the timed buffer queue"); 1374 } 1375 1376 done: 1377 buffer->raw = 0; 1378 buffer->frameCount = 0; 1379 } 1380 1381 size_t AudioFlinger::PlaybackThread::TimedTrack::framesReady() const { 1382 Mutex::Autolock _l(mTimedBufferQueueLock); 1383 return mFramesPendingInQueue; 1384 } 1385 1386 AudioFlinger::PlaybackThread::TimedTrack::TimedBuffer::TimedBuffer() 1387 : mPTS(0), mPosition(0) {} 1388 1389 AudioFlinger::PlaybackThread::TimedTrack::TimedBuffer::TimedBuffer( 1390 const sp<IMemory>& buffer, int64_t pts) 1391 : mBuffer(buffer), mPTS(pts), mPosition(0) {} 1392 1393 1394 // ---------------------------------------------------------------------------- 1395 1396 AudioFlinger::PlaybackThread::OutputTrack::OutputTrack( 1397 PlaybackThread *playbackThread, 1398 DuplicatingThread *sourceThread, 1399 uint32_t sampleRate, 1400 audio_format_t format, 1401 audio_channel_mask_t channelMask, 1402 size_t frameCount) 1403 : Track(playbackThread, NULL, AUDIO_STREAM_CNT, sampleRate, format, channelMask, frameCount, 1404 NULL, 0, IAudioFlinger::TRACK_DEFAULT), 1405 mActive(false), mSourceThread(sourceThread), mClientProxy(NULL) 1406 { 1407 1408 if (mCblk != NULL) { 1409 mOutBuffer.frameCount = 0; 1410 playbackThread->mTracks.add(this); 1411 ALOGV("OutputTrack constructor mCblk %p, mBuffer %p, " 1412 "mCblk->frameCount_ %u, mChannelMask 0x%08x mBufferEnd %p", 1413 mCblk, mBuffer, 1414 mCblk->frameCount_, mChannelMask, mBufferEnd); 1415 // since client and server are in the same process, 1416 // the buffer has the same virtual address on both sides 1417 mClientProxy = new AudioTrackClientProxy(mCblk, mBuffer, mFrameCount, mFrameSize); 1418 mClientProxy->setVolumeLR((uint32_t(uint16_t(0x1000)) << 16) | uint16_t(0x1000)); 1419 mClientProxy->setSendLevel(0.0); 1420 mClientProxy->setSampleRate(sampleRate); 1421 } else { 1422 ALOGW("Error creating output track on thread %p", playbackThread); 1423 } 1424 } 1425 1426 AudioFlinger::PlaybackThread::OutputTrack::~OutputTrack() 1427 { 1428 clearBufferQueue(); 1429 delete mClientProxy; 1430 // superclass destructor will now delete the server proxy and shared memory both refer to 1431 } 1432 1433 status_t AudioFlinger::PlaybackThread::OutputTrack::start(AudioSystem::sync_event_t event, 1434 int triggerSession) 1435 { 1436 status_t status = Track::start(event, triggerSession); 1437 if (status != NO_ERROR) { 1438 return status; 1439 } 1440 1441 mActive = true; 1442 mRetryCount = 127; 1443 return status; 1444 } 1445 1446 void AudioFlinger::PlaybackThread::OutputTrack::stop() 1447 { 1448 Track::stop(); 1449 clearBufferQueue(); 1450 mOutBuffer.frameCount = 0; 1451 mActive = false; 1452 } 1453 1454 bool AudioFlinger::PlaybackThread::OutputTrack::write(int16_t* data, uint32_t frames) 1455 { 1456 Buffer *pInBuffer; 1457 Buffer inBuffer; 1458 uint32_t channelCount = mChannelCount; 1459 bool outputBufferFull = false; 1460 inBuffer.frameCount = frames; 1461 inBuffer.i16 = data; 1462 1463 uint32_t waitTimeLeftMs = mSourceThread->waitTimeMs(); 1464 1465 if (!mActive && frames != 0) { 1466 start(); 1467 sp<ThreadBase> thread = mThread.promote(); 1468 if (thread != 0) { 1469 MixerThread *mixerThread = (MixerThread *)thread.get(); 1470 if (mFrameCount > frames) { 1471 if (mBufferQueue.size() < kMaxOverFlowBuffers) { 1472 uint32_t startFrames = (mFrameCount - frames); 1473 pInBuffer = new Buffer; 1474 pInBuffer->mBuffer = new int16_t[startFrames * channelCount]; 1475 pInBuffer->frameCount = startFrames; 1476 pInBuffer->i16 = pInBuffer->mBuffer; 1477 memset(pInBuffer->raw, 0, startFrames * channelCount * sizeof(int16_t)); 1478 mBufferQueue.add(pInBuffer); 1479 } else { 1480 ALOGW ("OutputTrack::write() %p no more buffers in queue", this); 1481 } 1482 } 1483 } 1484 } 1485 1486 while (waitTimeLeftMs) { 1487 // First write pending buffers, then new data 1488 if (mBufferQueue.size()) { 1489 pInBuffer = mBufferQueue.itemAt(0); 1490 } else { 1491 pInBuffer = &inBuffer; 1492 } 1493 1494 if (pInBuffer->frameCount == 0) { 1495 break; 1496 } 1497 1498 if (mOutBuffer.frameCount == 0) { 1499 mOutBuffer.frameCount = pInBuffer->frameCount; 1500 nsecs_t startTime = systemTime(); 1501 if (obtainBuffer(&mOutBuffer, waitTimeLeftMs) == (status_t)NO_MORE_BUFFERS) { 1502 ALOGV ("OutputTrack::write() %p thread %p no more output buffers", this, 1503 mThread.unsafe_get()); 1504 outputBufferFull = true; 1505 break; 1506 } 1507 uint32_t waitTimeMs = (uint32_t)ns2ms(systemTime() - startTime); 1508 if (waitTimeLeftMs >= waitTimeMs) { 1509 waitTimeLeftMs -= waitTimeMs; 1510 } else { 1511 waitTimeLeftMs = 0; 1512 } 1513 } 1514 1515 uint32_t outFrames = pInBuffer->frameCount > mOutBuffer.frameCount ? mOutBuffer.frameCount : 1516 pInBuffer->frameCount; 1517 memcpy(mOutBuffer.raw, pInBuffer->raw, outFrames * channelCount * sizeof(int16_t)); 1518 mClientProxy->stepUser(outFrames); 1519 pInBuffer->frameCount -= outFrames; 1520 pInBuffer->i16 += outFrames * channelCount; 1521 mOutBuffer.frameCount -= outFrames; 1522 mOutBuffer.i16 += outFrames * channelCount; 1523 1524 if (pInBuffer->frameCount == 0) { 1525 if (mBufferQueue.size()) { 1526 mBufferQueue.removeAt(0); 1527 delete [] pInBuffer->mBuffer; 1528 delete pInBuffer; 1529 ALOGV("OutputTrack::write() %p thread %p released overflow buffer %d", this, 1530 mThread.unsafe_get(), mBufferQueue.size()); 1531 } else { 1532 break; 1533 } 1534 } 1535 } 1536 1537 // If we could not write all frames, allocate a buffer and queue it for next time. 1538 if (inBuffer.frameCount) { 1539 sp<ThreadBase> thread = mThread.promote(); 1540 if (thread != 0 && !thread->standby()) { 1541 if (mBufferQueue.size() < kMaxOverFlowBuffers) { 1542 pInBuffer = new Buffer; 1543 pInBuffer->mBuffer = new int16_t[inBuffer.frameCount * channelCount]; 1544 pInBuffer->frameCount = inBuffer.frameCount; 1545 pInBuffer->i16 = pInBuffer->mBuffer; 1546 memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * channelCount * 1547 sizeof(int16_t)); 1548 mBufferQueue.add(pInBuffer); 1549 ALOGV("OutputTrack::write() %p thread %p adding overflow buffer %d", this, 1550 mThread.unsafe_get(), mBufferQueue.size()); 1551 } else { 1552 ALOGW("OutputTrack::write() %p thread %p no more overflow buffers", 1553 mThread.unsafe_get(), this); 1554 } 1555 } 1556 } 1557 1558 // Calling write() with a 0 length buffer, means that no more data will be written: 1559 // If no more buffers are pending, fill output track buffer to make sure it is started 1560 // by output mixer. 1561 if (frames == 0 && mBufferQueue.size() == 0) { 1562 if (mCblk->user < mFrameCount) { 1563 frames = mFrameCount - mCblk->user; 1564 pInBuffer = new Buffer; 1565 pInBuffer->mBuffer = new int16_t[frames * channelCount]; 1566 pInBuffer->frameCount = frames; 1567 pInBuffer->i16 = pInBuffer->mBuffer; 1568 memset(pInBuffer->raw, 0, frames * channelCount * sizeof(int16_t)); 1569 mBufferQueue.add(pInBuffer); 1570 } else if (mActive) { 1571 stop(); 1572 } 1573 } 1574 1575 return outputBufferFull; 1576 } 1577 1578 status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer( 1579 AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs) 1580 { 1581 audio_track_cblk_t* cblk = mCblk; 1582 uint32_t framesReq = buffer->frameCount; 1583 1584 ALOGVV("OutputTrack::obtainBuffer user %d, server %d", cblk->user, cblk->server); 1585 buffer->frameCount = 0; 1586 1587 size_t framesAvail; 1588 { 1589 Mutex::Autolock _l(cblk->lock); 1590 1591 // read the server count again 1592 while (!(framesAvail = mClientProxy->framesAvailable_l())) { 1593 if (CC_UNLIKELY(!mActive)) { 1594 ALOGV("Not active and NO_MORE_BUFFERS"); 1595 return NO_MORE_BUFFERS; 1596 } 1597 status_t result = cblk->cv.waitRelative(cblk->lock, milliseconds(waitTimeMs)); 1598 if (result != NO_ERROR) { 1599 return NO_MORE_BUFFERS; 1600 } 1601 } 1602 } 1603 1604 if (framesReq > framesAvail) { 1605 framesReq = framesAvail; 1606 } 1607 1608 uint32_t u = cblk->user; 1609 uint32_t bufferEnd = cblk->userBase + mFrameCount; 1610 1611 if (framesReq > bufferEnd - u) { 1612 framesReq = bufferEnd - u; 1613 } 1614 1615 buffer->frameCount = framesReq; 1616 buffer->raw = mClientProxy->buffer(u); 1617 return NO_ERROR; 1618 } 1619 1620 1621 void AudioFlinger::PlaybackThread::OutputTrack::clearBufferQueue() 1622 { 1623 size_t size = mBufferQueue.size(); 1624 1625 for (size_t i = 0; i < size; i++) { 1626 Buffer *pBuffer = mBufferQueue.itemAt(i); 1627 delete [] pBuffer->mBuffer; 1628 delete pBuffer; 1629 } 1630 mBufferQueue.clear(); 1631 } 1632 1633 1634 // ---------------------------------------------------------------------------- 1635 // Record 1636 // ---------------------------------------------------------------------------- 1637 1638 AudioFlinger::RecordHandle::RecordHandle( 1639 const sp<AudioFlinger::RecordThread::RecordTrack>& recordTrack) 1640 : BnAudioRecord(), 1641 mRecordTrack(recordTrack) 1642 { 1643 } 1644 1645 AudioFlinger::RecordHandle::~RecordHandle() { 1646 stop_nonvirtual(); 1647 mRecordTrack->destroy(); 1648 } 1649 1650 sp<IMemory> AudioFlinger::RecordHandle::getCblk() const { 1651 return mRecordTrack->getCblk(); 1652 } 1653 1654 status_t AudioFlinger::RecordHandle::start(int /*AudioSystem::sync_event_t*/ event, 1655 int triggerSession) { 1656 ALOGV("RecordHandle::start()"); 1657 return mRecordTrack->start((AudioSystem::sync_event_t)event, triggerSession); 1658 } 1659 1660 void AudioFlinger::RecordHandle::stop() { 1661 stop_nonvirtual(); 1662 } 1663 1664 void AudioFlinger::RecordHandle::stop_nonvirtual() { 1665 ALOGV("RecordHandle::stop()"); 1666 mRecordTrack->stop(); 1667 } 1668 1669 status_t AudioFlinger::RecordHandle::onTransact( 1670 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1671 { 1672 return BnAudioRecord::onTransact(code, data, reply, flags); 1673 } 1674 1675 // ---------------------------------------------------------------------------- 1676 1677 // RecordTrack constructor must be called with AudioFlinger::mLock held 1678 AudioFlinger::RecordThread::RecordTrack::RecordTrack( 1679 RecordThread *thread, 1680 const sp<Client>& client, 1681 uint32_t sampleRate, 1682 audio_format_t format, 1683 audio_channel_mask_t channelMask, 1684 size_t frameCount, 1685 int sessionId) 1686 : TrackBase(thread, client, sampleRate, format, 1687 channelMask, frameCount, 0 /*sharedBuffer*/, sessionId, false /*isOut*/), 1688 mOverflow(false) 1689 { 1690 ALOGV("RecordTrack constructor, size %d", (int)mBufferEnd - (int)mBuffer); 1691 } 1692 1693 AudioFlinger::RecordThread::RecordTrack::~RecordTrack() 1694 { 1695 ALOGV("%s", __func__); 1696 } 1697 1698 // AudioBufferProvider interface 1699 status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer, 1700 int64_t pts) 1701 { 1702 audio_track_cblk_t* cblk = this->cblk(); 1703 uint32_t framesAvail; 1704 uint32_t framesReq = buffer->frameCount; 1705 1706 // Check if last stepServer failed, try to step now 1707 if (mStepServerFailed) { 1708 if (!step()) { 1709 goto getNextBuffer_exit; 1710 } 1711 ALOGV("stepServer recovered"); 1712 mStepServerFailed = false; 1713 } 1714 1715 // FIXME lock is not actually held, so overrun is possible 1716 framesAvail = mServerProxy->framesAvailableIn_l(); 1717 1718 if (CC_LIKELY(framesAvail)) { 1719 uint32_t s = cblk->server; 1720 uint32_t bufferEnd = cblk->serverBase + mFrameCount; 1721 1722 if (framesReq > framesAvail) { 1723 framesReq = framesAvail; 1724 } 1725 if (framesReq > bufferEnd - s) { 1726 framesReq = bufferEnd - s; 1727 } 1728 1729 buffer->raw = getBuffer(s, framesReq); 1730 buffer->frameCount = framesReq; 1731 return NO_ERROR; 1732 } 1733 1734 getNextBuffer_exit: 1735 buffer->raw = NULL; 1736 buffer->frameCount = 0; 1737 return NOT_ENOUGH_DATA; 1738 } 1739 1740 status_t AudioFlinger::RecordThread::RecordTrack::start(AudioSystem::sync_event_t event, 1741 int triggerSession) 1742 { 1743 sp<ThreadBase> thread = mThread.promote(); 1744 if (thread != 0) { 1745 RecordThread *recordThread = (RecordThread *)thread.get(); 1746 return recordThread->start(this, event, triggerSession); 1747 } else { 1748 return BAD_VALUE; 1749 } 1750 } 1751 1752 void AudioFlinger::RecordThread::RecordTrack::stop() 1753 { 1754 sp<ThreadBase> thread = mThread.promote(); 1755 if (thread != 0) { 1756 RecordThread *recordThread = (RecordThread *)thread.get(); 1757 recordThread->mLock.lock(); 1758 bool doStop = recordThread->stop_l(this); 1759 if (doStop) { 1760 TrackBase::reset(); 1761 // Force overrun condition to avoid false overrun callback until first data is 1762 // read from buffer 1763 android_atomic_or(CBLK_UNDERRUN, &mCblk->flags); 1764 } 1765 recordThread->mLock.unlock(); 1766 if (doStop) { 1767 AudioSystem::stopInput(recordThread->id()); 1768 } 1769 } 1770 } 1771 1772 void AudioFlinger::RecordThread::RecordTrack::destroy() 1773 { 1774 // see comments at AudioFlinger::PlaybackThread::Track::destroy() 1775 sp<RecordTrack> keep(this); 1776 { 1777 sp<ThreadBase> thread = mThread.promote(); 1778 if (thread != 0) { 1779 if (mState == ACTIVE || mState == RESUMING) { 1780 AudioSystem::stopInput(thread->id()); 1781 } 1782 AudioSystem::releaseInput(thread->id()); 1783 Mutex::Autolock _l(thread->mLock); 1784 RecordThread *recordThread = (RecordThread *) thread.get(); 1785 recordThread->destroyTrack_l(this); 1786 } 1787 } 1788 } 1789 1790 1791 /*static*/ void AudioFlinger::RecordThread::RecordTrack::appendDumpHeader(String8& result) 1792 { 1793 result.append(" Clien Fmt Chn mask Session Step S Serv User FrameCount\n"); 1794 } 1795 1796 void AudioFlinger::RecordThread::RecordTrack::dump(char* buffer, size_t size) 1797 { 1798 snprintf(buffer, size, " %05d %03u 0x%08x %05d %04u %01d %08x %08x %05d\n", 1799 (mClient == 0) ? getpid_cached : mClient->pid(), 1800 mFormat, 1801 mChannelMask, 1802 mSessionId, 1803 mStepCount, 1804 mState, 1805 mCblk->server, 1806 mCblk->user, 1807 mFrameCount); 1808 } 1809 1810 }; // namespace android 1811