1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 //#define LOG_NDEBUG 0 18 #define LOG_TAG "AudioPlayer" 19 #include <utils/Log.h> 20 21 #include <binder/IPCThreadState.h> 22 #include <media/AudioTrack.h> 23 #include <media/stagefright/foundation/ADebug.h> 24 #include <media/stagefright/foundation/ALooper.h> 25 #include <media/stagefright/AudioPlayer.h> 26 #include <media/stagefright/MediaDefs.h> 27 #include <media/stagefright/MediaErrors.h> 28 #include <media/stagefright/MediaSource.h> 29 #include <media/stagefright/MetaData.h> 30 31 #include "include/AwesomePlayer.h" 32 33 namespace android { 34 35 AudioPlayer::AudioPlayer( 36 const sp<MediaPlayerBase::AudioSink> &audioSink, 37 bool allowDeepBuffering, 38 AwesomePlayer *observer) 39 : mAudioTrack(NULL), 40 mInputBuffer(NULL), 41 mSampleRate(0), 42 mLatencyUs(0), 43 mFrameSize(0), 44 mNumFramesPlayed(0), 45 mNumFramesPlayedSysTimeUs(ALooper::GetNowUs()), 46 mPositionTimeMediaUs(-1), 47 mPositionTimeRealUs(-1), 48 mSeeking(false), 49 mReachedEOS(false), 50 mFinalStatus(OK), 51 mStarted(false), 52 mIsFirstBuffer(false), 53 mFirstBufferResult(OK), 54 mFirstBuffer(NULL), 55 mAudioSink(audioSink), 56 mAllowDeepBuffering(allowDeepBuffering), 57 mObserver(observer), 58 mPinnedTimeUs(-1ll) { 59 } 60 61 AudioPlayer::~AudioPlayer() { 62 if (mStarted) { 63 reset(); 64 } 65 } 66 67 void AudioPlayer::setSource(const sp<MediaSource> &source) { 68 CHECK(mSource == NULL); 69 mSource = source; 70 } 71 72 status_t AudioPlayer::start(bool sourceAlreadyStarted) { 73 CHECK(!mStarted); 74 CHECK(mSource != NULL); 75 76 status_t err; 77 if (!sourceAlreadyStarted) { 78 err = mSource->start(); 79 80 if (err != OK) { 81 return err; 82 } 83 } 84 85 // We allow an optional INFO_FORMAT_CHANGED at the very beginning 86 // of playback, if there is one, getFormat below will retrieve the 87 // updated format, if there isn't, we'll stash away the valid buffer 88 // of data to be used on the first audio callback. 89 90 CHECK(mFirstBuffer == NULL); 91 92 MediaSource::ReadOptions options; 93 if (mSeeking) { 94 options.setSeekTo(mSeekTimeUs); 95 mSeeking = false; 96 } 97 98 mFirstBufferResult = mSource->read(&mFirstBuffer, &options); 99 if (mFirstBufferResult == INFO_FORMAT_CHANGED) { 100 ALOGV("INFO_FORMAT_CHANGED!!!"); 101 102 CHECK(mFirstBuffer == NULL); 103 mFirstBufferResult = OK; 104 mIsFirstBuffer = false; 105 } else { 106 mIsFirstBuffer = true; 107 } 108 109 sp<MetaData> format = mSource->getFormat(); 110 const char *mime; 111 bool success = format->findCString(kKeyMIMEType, &mime); 112 CHECK(success); 113 CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)); 114 115 success = format->findInt32(kKeySampleRate, &mSampleRate); 116 CHECK(success); 117 118 int32_t numChannels, channelMask; 119 success = format->findInt32(kKeyChannelCount, &numChannels); 120 CHECK(success); 121 122 if(!format->findInt32(kKeyChannelMask, &channelMask)) { 123 // log only when there's a risk of ambiguity of channel mask selection 124 ALOGI_IF(numChannels > 2, 125 "source format didn't specify channel mask, using (%d) channel order", numChannels); 126 channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER; 127 } 128 129 if (mAudioSink.get() != NULL) { 130 131 status_t err = mAudioSink->open( 132 mSampleRate, numChannels, channelMask, AUDIO_FORMAT_PCM_16_BIT, 133 DEFAULT_AUDIOSINK_BUFFERCOUNT, 134 &AudioPlayer::AudioSinkCallback, 135 this, 136 (mAllowDeepBuffering ? 137 AUDIO_OUTPUT_FLAG_DEEP_BUFFER : 138 AUDIO_OUTPUT_FLAG_NONE)); 139 if (err != OK) { 140 if (mFirstBuffer != NULL) { 141 mFirstBuffer->release(); 142 mFirstBuffer = NULL; 143 } 144 145 if (!sourceAlreadyStarted) { 146 mSource->stop(); 147 } 148 149 return err; 150 } 151 152 mLatencyUs = (int64_t)mAudioSink->latency() * 1000; 153 mFrameSize = mAudioSink->frameSize(); 154 155 mAudioSink->start(); 156 } else { 157 // playing to an AudioTrack, set up mask if necessary 158 audio_channel_mask_t audioMask = channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER ? 159 audio_channel_out_mask_from_count(numChannels) : channelMask; 160 if (0 == audioMask) { 161 return BAD_VALUE; 162 } 163 164 mAudioTrack = new AudioTrack( 165 AUDIO_STREAM_MUSIC, mSampleRate, AUDIO_FORMAT_PCM_16_BIT, audioMask, 166 0, AUDIO_OUTPUT_FLAG_NONE, &AudioCallback, this, 0); 167 168 if ((err = mAudioTrack->initCheck()) != OK) { 169 delete mAudioTrack; 170 mAudioTrack = NULL; 171 172 if (mFirstBuffer != NULL) { 173 mFirstBuffer->release(); 174 mFirstBuffer = NULL; 175 } 176 177 if (!sourceAlreadyStarted) { 178 mSource->stop(); 179 } 180 181 return err; 182 } 183 184 mLatencyUs = (int64_t)mAudioTrack->latency() * 1000; 185 mFrameSize = mAudioTrack->frameSize(); 186 187 mAudioTrack->start(); 188 } 189 190 mStarted = true; 191 mPinnedTimeUs = -1ll; 192 193 return OK; 194 } 195 196 void AudioPlayer::pause(bool playPendingSamples) { 197 CHECK(mStarted); 198 199 if (playPendingSamples) { 200 if (mAudioSink.get() != NULL) { 201 mAudioSink->stop(); 202 } else { 203 mAudioTrack->stop(); 204 } 205 206 mNumFramesPlayed = 0; 207 mNumFramesPlayedSysTimeUs = ALooper::GetNowUs(); 208 } else { 209 if (mAudioSink.get() != NULL) { 210 mAudioSink->pause(); 211 } else { 212 mAudioTrack->pause(); 213 } 214 215 mPinnedTimeUs = ALooper::GetNowUs(); 216 } 217 } 218 219 void AudioPlayer::resume() { 220 CHECK(mStarted); 221 222 if (mAudioSink.get() != NULL) { 223 mAudioSink->start(); 224 } else { 225 mAudioTrack->start(); 226 } 227 } 228 229 void AudioPlayer::reset() { 230 CHECK(mStarted); 231 232 if (mAudioSink.get() != NULL) { 233 mAudioSink->stop(); 234 mAudioSink->close(); 235 } else { 236 mAudioTrack->stop(); 237 238 delete mAudioTrack; 239 mAudioTrack = NULL; 240 } 241 242 // Make sure to release any buffer we hold onto so that the 243 // source is able to stop(). 244 245 if (mFirstBuffer != NULL) { 246 mFirstBuffer->release(); 247 mFirstBuffer = NULL; 248 } 249 250 if (mInputBuffer != NULL) { 251 ALOGV("AudioPlayer releasing input buffer."); 252 253 mInputBuffer->release(); 254 mInputBuffer = NULL; 255 } 256 257 mSource->stop(); 258 259 // The following hack is necessary to ensure that the OMX 260 // component is completely released by the time we may try 261 // to instantiate it again. 262 wp<MediaSource> tmp = mSource; 263 mSource.clear(); 264 while (tmp.promote() != NULL) { 265 usleep(1000); 266 } 267 IPCThreadState::self()->flushCommands(); 268 269 mNumFramesPlayed = 0; 270 mNumFramesPlayedSysTimeUs = ALooper::GetNowUs(); 271 mPositionTimeMediaUs = -1; 272 mPositionTimeRealUs = -1; 273 mSeeking = false; 274 mReachedEOS = false; 275 mFinalStatus = OK; 276 mStarted = false; 277 } 278 279 // static 280 void AudioPlayer::AudioCallback(int event, void *user, void *info) { 281 static_cast<AudioPlayer *>(user)->AudioCallback(event, info); 282 } 283 284 bool AudioPlayer::isSeeking() { 285 Mutex::Autolock autoLock(mLock); 286 return mSeeking; 287 } 288 289 bool AudioPlayer::reachedEOS(status_t *finalStatus) { 290 *finalStatus = OK; 291 292 Mutex::Autolock autoLock(mLock); 293 *finalStatus = mFinalStatus; 294 return mReachedEOS; 295 } 296 297 status_t AudioPlayer::setPlaybackRatePermille(int32_t ratePermille) { 298 if (mAudioSink.get() != NULL) { 299 return mAudioSink->setPlaybackRatePermille(ratePermille); 300 } else if (mAudioTrack != NULL){ 301 return mAudioTrack->setSampleRate(ratePermille * mSampleRate / 1000); 302 } else { 303 return NO_INIT; 304 } 305 } 306 307 // static 308 size_t AudioPlayer::AudioSinkCallback( 309 MediaPlayerBase::AudioSink *audioSink, 310 void *buffer, size_t size, void *cookie) { 311 AudioPlayer *me = (AudioPlayer *)cookie; 312 313 return me->fillBuffer(buffer, size); 314 } 315 316 void AudioPlayer::AudioCallback(int event, void *info) { 317 if (event != AudioTrack::EVENT_MORE_DATA) { 318 return; 319 } 320 321 AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; 322 size_t numBytesWritten = fillBuffer(buffer->raw, buffer->size); 323 324 buffer->size = numBytesWritten; 325 } 326 327 uint32_t AudioPlayer::getNumFramesPendingPlayout() const { 328 uint32_t numFramesPlayedOut; 329 status_t err; 330 331 if (mAudioSink != NULL) { 332 err = mAudioSink->getPosition(&numFramesPlayedOut); 333 } else { 334 err = mAudioTrack->getPosition(&numFramesPlayedOut); 335 } 336 337 if (err != OK || mNumFramesPlayed < numFramesPlayedOut) { 338 return 0; 339 } 340 341 // mNumFramesPlayed is the number of frames submitted 342 // to the audio sink for playback, but not all of them 343 // may have played out by now. 344 return mNumFramesPlayed - numFramesPlayedOut; 345 } 346 347 size_t AudioPlayer::fillBuffer(void *data, size_t size) { 348 if (mNumFramesPlayed == 0) { 349 ALOGV("AudioCallback"); 350 } 351 352 if (mReachedEOS) { 353 return 0; 354 } 355 356 bool postSeekComplete = false; 357 bool postEOS = false; 358 int64_t postEOSDelayUs = 0; 359 360 size_t size_done = 0; 361 size_t size_remaining = size; 362 while (size_remaining > 0) { 363 MediaSource::ReadOptions options; 364 365 { 366 Mutex::Autolock autoLock(mLock); 367 368 if (mSeeking) { 369 if (mIsFirstBuffer) { 370 if (mFirstBuffer != NULL) { 371 mFirstBuffer->release(); 372 mFirstBuffer = NULL; 373 } 374 mIsFirstBuffer = false; 375 } 376 377 options.setSeekTo(mSeekTimeUs); 378 379 if (mInputBuffer != NULL) { 380 mInputBuffer->release(); 381 mInputBuffer = NULL; 382 } 383 384 mSeeking = false; 385 if (mObserver) { 386 postSeekComplete = true; 387 } 388 } 389 } 390 391 if (mInputBuffer == NULL) { 392 status_t err; 393 394 if (mIsFirstBuffer) { 395 mInputBuffer = mFirstBuffer; 396 mFirstBuffer = NULL; 397 err = mFirstBufferResult; 398 399 mIsFirstBuffer = false; 400 } else { 401 err = mSource->read(&mInputBuffer, &options); 402 } 403 404 CHECK((err == OK && mInputBuffer != NULL) 405 || (err != OK && mInputBuffer == NULL)); 406 407 Mutex::Autolock autoLock(mLock); 408 409 if (err != OK) { 410 if (mObserver && !mReachedEOS) { 411 // We don't want to post EOS right away but only 412 // after all frames have actually been played out. 413 414 // These are the number of frames submitted to the 415 // AudioTrack that you haven't heard yet. 416 uint32_t numFramesPendingPlayout = 417 getNumFramesPendingPlayout(); 418 419 // These are the number of frames we're going to 420 // submit to the AudioTrack by returning from this 421 // callback. 422 uint32_t numAdditionalFrames = size_done / mFrameSize; 423 424 numFramesPendingPlayout += numAdditionalFrames; 425 426 int64_t timeToCompletionUs = 427 (1000000ll * numFramesPendingPlayout) / mSampleRate; 428 429 ALOGV("total number of frames played: %lld (%lld us)", 430 (mNumFramesPlayed + numAdditionalFrames), 431 1000000ll * (mNumFramesPlayed + numAdditionalFrames) 432 / mSampleRate); 433 434 ALOGV("%d frames left to play, %lld us (%.2f secs)", 435 numFramesPendingPlayout, 436 timeToCompletionUs, timeToCompletionUs / 1E6); 437 438 postEOS = true; 439 if (mAudioSink->needsTrailingPadding()) { 440 postEOSDelayUs = timeToCompletionUs + mLatencyUs; 441 } else { 442 postEOSDelayUs = 0; 443 } 444 } 445 446 mReachedEOS = true; 447 mFinalStatus = err; 448 break; 449 } 450 451 if (mAudioSink != NULL) { 452 mLatencyUs = (int64_t)mAudioSink->latency() * 1000; 453 } else { 454 mLatencyUs = (int64_t)mAudioTrack->latency() * 1000; 455 } 456 457 CHECK(mInputBuffer->meta_data()->findInt64( 458 kKeyTime, &mPositionTimeMediaUs)); 459 460 mPositionTimeRealUs = 461 ((mNumFramesPlayed + size_done / mFrameSize) * 1000000) 462 / mSampleRate; 463 464 ALOGV("buffer->size() = %d, " 465 "mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f", 466 mInputBuffer->range_length(), 467 mPositionTimeMediaUs / 1E6, mPositionTimeRealUs / 1E6); 468 } 469 470 if (mInputBuffer->range_length() == 0) { 471 mInputBuffer->release(); 472 mInputBuffer = NULL; 473 474 continue; 475 } 476 477 size_t copy = size_remaining; 478 if (copy > mInputBuffer->range_length()) { 479 copy = mInputBuffer->range_length(); 480 } 481 482 memcpy((char *)data + size_done, 483 (const char *)mInputBuffer->data() + mInputBuffer->range_offset(), 484 copy); 485 486 mInputBuffer->set_range(mInputBuffer->range_offset() + copy, 487 mInputBuffer->range_length() - copy); 488 489 size_done += copy; 490 size_remaining -= copy; 491 } 492 493 { 494 Mutex::Autolock autoLock(mLock); 495 mNumFramesPlayed += size_done / mFrameSize; 496 mNumFramesPlayedSysTimeUs = ALooper::GetNowUs(); 497 498 if (mReachedEOS) { 499 mPinnedTimeUs = mNumFramesPlayedSysTimeUs; 500 } else { 501 mPinnedTimeUs = -1ll; 502 } 503 } 504 505 if (postEOS) { 506 mObserver->postAudioEOS(postEOSDelayUs); 507 } 508 509 if (postSeekComplete) { 510 mObserver->postAudioSeekComplete(); 511 } 512 513 return size_done; 514 } 515 516 int64_t AudioPlayer::getRealTimeUs() { 517 Mutex::Autolock autoLock(mLock); 518 return getRealTimeUsLocked(); 519 } 520 521 int64_t AudioPlayer::getRealTimeUsLocked() const { 522 CHECK(mStarted); 523 CHECK_NE(mSampleRate, 0); 524 int64_t result = -mLatencyUs + (mNumFramesPlayed * 1000000) / mSampleRate; 525 526 // Compensate for large audio buffers, updates of mNumFramesPlayed 527 // are less frequent, therefore to get a "smoother" notion of time we 528 // compensate using system time. 529 int64_t diffUs; 530 if (mPinnedTimeUs >= 0ll) { 531 diffUs = mPinnedTimeUs; 532 } else { 533 diffUs = ALooper::GetNowUs(); 534 } 535 536 diffUs -= mNumFramesPlayedSysTimeUs; 537 538 return result + diffUs; 539 } 540 541 int64_t AudioPlayer::getMediaTimeUs() { 542 Mutex::Autolock autoLock(mLock); 543 544 if (mPositionTimeMediaUs < 0 || mPositionTimeRealUs < 0) { 545 if (mSeeking) { 546 return mSeekTimeUs; 547 } 548 549 return 0; 550 } 551 552 int64_t realTimeOffset = getRealTimeUsLocked() - mPositionTimeRealUs; 553 if (realTimeOffset < 0) { 554 realTimeOffset = 0; 555 } 556 557 return mPositionTimeMediaUs + realTimeOffset; 558 } 559 560 bool AudioPlayer::getMediaTimeMapping( 561 int64_t *realtime_us, int64_t *mediatime_us) { 562 Mutex::Autolock autoLock(mLock); 563 564 *realtime_us = mPositionTimeRealUs; 565 *mediatime_us = mPositionTimeMediaUs; 566 567 return mPositionTimeRealUs != -1 && mPositionTimeMediaUs != -1; 568 } 569 570 status_t AudioPlayer::seekTo(int64_t time_us) { 571 Mutex::Autolock autoLock(mLock); 572 573 mSeeking = true; 574 mPositionTimeRealUs = mPositionTimeMediaUs = -1; 575 mReachedEOS = false; 576 mSeekTimeUs = time_us; 577 578 // Flush resets the number of played frames 579 mNumFramesPlayed = 0; 580 mNumFramesPlayedSysTimeUs = ALooper::GetNowUs(); 581 582 if (mAudioSink != NULL) { 583 mAudioSink->flush(); 584 } else { 585 mAudioTrack->flush(); 586 } 587 588 return OK; 589 } 590 591 } 592