VideoEditorAudioPlayer.cpp revision b5c7784c96a606890eb8a8b560153ef4a5d1a0d9
1/* 2 * Copyright (C) 2011 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 1 18#define LOG_TAG "VideoEditorAudioPlayer" 19#include <utils/Log.h> 20 21#include <binder/IPCThreadState.h> 22#include <media/AudioTrack.h> 23#include <VideoEditorAudioPlayer.h> 24#include <media/stagefright/MediaDebug.h> 25#include <media/stagefright/MediaDefs.h> 26#include <media/stagefright/MediaErrors.h> 27#include <media/stagefright/MediaSource.h> 28#include <media/stagefright/MetaData.h> 29 30#include <system/audio.h> 31 32#include "PreviewPlayer.h" 33namespace android { 34 35VideoEditorAudioPlayer::VideoEditorAudioPlayer( 36 const sp<MediaPlayerBase::AudioSink> &audioSink, 37 PreviewPlayerBase *observer) 38 : AudioPlayerBase(audioSink, observer) { 39 40 LOGV("VideoEditorAudioPlayer"); 41 mBGAudioPCMFileHandle = NULL; 42 mAudioProcess = NULL; 43 mBGAudioPCMFileLength = 0; 44 mBGAudioPCMFileTrimmedLength = 0; 45 mBGAudioPCMFileDuration = 0; 46 mBGAudioPCMFileSeekPoint = 0; 47 mBGAudioPCMFileOriginalSeekPoint = 0; 48 mBGAudioStoryBoardSkimTimeStamp = 0; 49 mBGAudioStoryBoardCurrentMediaBeginCutTS = 0; 50 mBGAudioStoryBoardCurrentMediaVolumeVal = 0; 51 mSeekTimeUs = 0; 52 mSource = NULL; 53} 54 55VideoEditorAudioPlayer::~VideoEditorAudioPlayer() { 56 57 LOGV("~VideoEditorAudioPlayer"); 58 if (mStarted) { 59 reset(); 60 } 61 if (mAudioProcess != NULL) { 62 delete mAudioProcess; 63 mAudioProcess = NULL; 64 } 65} 66void VideoEditorAudioPlayer::setSource(const sp<MediaSource> &source) { 67 Mutex::Autolock autoLock(mLock); 68 69 // Before setting source, stop any existing source. 70 // Make sure to release any buffer we hold onto so that the 71 // source is able to stop(). 72 73 if (mFirstBuffer != NULL) { 74 mFirstBuffer->release(); 75 mFirstBuffer = NULL; 76 } 77 78 if (mInputBuffer != NULL) { 79 LOGV("VideoEditorAudioPlayer releasing input buffer."); 80 81 mInputBuffer->release(); 82 mInputBuffer = NULL; 83 } 84 85 if (mSource != NULL) { 86 mSource->stop(); 87 mSource.clear(); 88 } 89 90 mSource = source; 91 mReachedEOS = false; 92} 93 94sp<MediaSource> VideoEditorAudioPlayer::getSource() { 95 Mutex::Autolock autoLock(mLock); 96 return mSource; 97} 98 99void VideoEditorAudioPlayer::setObserver(PreviewPlayerBase *observer) { 100 LOGV("setObserver"); 101 //CHECK(!mStarted); 102 mObserver = observer; 103} 104 105bool VideoEditorAudioPlayer::isStarted() { 106 return mStarted; 107} 108 109status_t VideoEditorAudioPlayer::start(bool sourceAlreadyStarted) { 110 Mutex::Autolock autoLock(mLock); 111 CHECK(!mStarted); 112 CHECK(mSource != NULL); 113 LOGV("Start"); 114 status_t err; 115 M4OSA_ERR result = M4NO_ERROR; 116 M4OSA_UInt32 startTime = 0; 117 M4OSA_UInt32 seekTimeStamp = 0; 118 M4OSA_Bool bStoryBoardTSBeyondBTEndCutTime = M4OSA_FALSE; 119 120 if (!sourceAlreadyStarted) { 121 err = mSource->start(); 122 if (err != OK) { 123 return err; 124 } 125 } 126 127 // Create the BG Audio handler 128 mAudioProcess = new VideoEditorBGAudioProcessing(); 129 veAudMixSettings audioMixSettings; 130 131 // Pass on the audio ducking parameters 132 audioMixSettings.lvInDucking_threshold = 133 mAudioMixSettings->uiInDucking_threshold; 134 audioMixSettings.lvInDucking_lowVolume = 135 ((M4OSA_Float)mAudioMixSettings->uiInDucking_lowVolume) / 100.0; 136 audioMixSettings.lvInDucking_enable = 137 mAudioMixSettings->bInDucking_enable; 138 audioMixSettings.lvPTVolLevel = 139 ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal) / 100.0; 140 audioMixSettings.lvBTVolLevel = 141 ((M4OSA_Float)mAudioMixSettings->uiAddVolume) / 100.0; 142 audioMixSettings.lvBTChannelCount = mAudioMixSettings->uiBTChannelCount; 143 audioMixSettings.lvPTChannelCount = mAudioMixSettings->uiNbChannels; 144 145 // Call to Audio mix param setting 146 mAudioProcess->veSetAudioProcessingParams(audioMixSettings); 147 148 // Get the BG Audio PCM file details 149 if ( mBGAudioPCMFileHandle ) { 150 151 // TODO : 32bits required for OSAL, to be updated once OSAL is updated 152 M4OSA_UInt32 tmp32 = 0; 153 result = M4OSA_fileReadGetOption(mBGAudioPCMFileHandle, 154 M4OSA_kFileReadGetFileSize, 155 (M4OSA_Void**)&tmp32); 156 mBGAudioPCMFileLength = tmp32; 157 mBGAudioPCMFileTrimmedLength = mBGAudioPCMFileLength; 158 159 160 LOGV("VideoEditorAudioPlayer::start M4OSA_kFileReadGetFileSize = %lld", 161 mBGAudioPCMFileLength); 162 163 // Get the duration in time of the audio BT 164 if ( result == M4NO_ERROR ) { 165 LOGV("VEAP: channels = %d freq = %d", 166 mAudioMixSettings->uiNbChannels, mAudioMixSettings->uiSamplingFrequency); 167 168 // No trim 169 mBGAudioPCMFileDuration = (( 170 (int64_t)(mBGAudioPCMFileLength/sizeof(M4OSA_UInt16)/ 171 mAudioMixSettings->uiNbChannels))*1000 ) / 172 mAudioMixSettings->uiSamplingFrequency; 173 174 LOGV("VideoEditorAudioPlayer:: beginCutMs %d , endCutMs %d", 175 (unsigned int) mAudioMixSettings->beginCutMs, 176 (unsigned int) mAudioMixSettings->endCutMs); 177 178 // Remove the trim part 179 if ((mAudioMixSettings->beginCutMs == 0) && 180 (mAudioMixSettings->endCutMs != 0)) { 181 // End time itself the file duration 182 mBGAudioPCMFileDuration = mAudioMixSettings->endCutMs; 183 // Limit the file length also 184 mBGAudioPCMFileTrimmedLength = (( 185 (int64_t)(mBGAudioPCMFileDuration * 186 mAudioMixSettings->uiSamplingFrequency) * 187 mAudioMixSettings->uiNbChannels) * 188 sizeof(M4OSA_UInt16)) / 1000; 189 } 190 else if ((mAudioMixSettings->beginCutMs != 0) && 191 (mAudioMixSettings->endCutMs == mBGAudioPCMFileDuration)) { 192 // End time itself the file duration 193 mBGAudioPCMFileDuration = mBGAudioPCMFileDuration - 194 mAudioMixSettings->beginCutMs; 195 // Limit the file length also 196 mBGAudioPCMFileTrimmedLength = (( 197 (int64_t)(mBGAudioPCMFileDuration * 198 mAudioMixSettings->uiSamplingFrequency) * 199 mAudioMixSettings->uiNbChannels) * 200 sizeof(M4OSA_UInt16)) / 1000; 201 } 202 else if ((mAudioMixSettings->beginCutMs != 0) && 203 (mAudioMixSettings->endCutMs != 0)) { 204 // End time itself the file duration 205 mBGAudioPCMFileDuration = mAudioMixSettings->endCutMs - 206 mAudioMixSettings->beginCutMs; 207 // Limit the file length also 208 mBGAudioPCMFileTrimmedLength = (( 209 (int64_t)(mBGAudioPCMFileDuration * 210 mAudioMixSettings->uiSamplingFrequency) * 211 mAudioMixSettings->uiNbChannels) * 212 sizeof(M4OSA_UInt16)) / 1000; /*make to sec from ms*/ 213 } 214 215 LOGV("VideoEditorAudioPlayer: file duration recorded : %lld", 216 mBGAudioPCMFileDuration); 217 } 218 219 // Last played location to be seeked at for next media item 220 if ( result == M4NO_ERROR ) { 221 LOGV("VideoEditorAudioPlayer::mBGAudioStoryBoardSkimTimeStamp %lld", 222 mBGAudioStoryBoardSkimTimeStamp); 223 LOGV("VideoEditorAudioPlayer::uiAddCts %d", 224 mAudioMixSettings->uiAddCts); 225 if (mBGAudioStoryBoardSkimTimeStamp >= mAudioMixSettings->uiAddCts) { 226 startTime = (mBGAudioStoryBoardSkimTimeStamp - 227 mAudioMixSettings->uiAddCts); 228 } 229 else { 230 // do nothing 231 } 232 233 LOGV("VideoEditorAudioPlayer::startTime %d", startTime); 234 seekTimeStamp = 0; 235 if (startTime) { 236 if (startTime >= mBGAudioPCMFileDuration) { 237 // The BG track should be looped and started again 238 if (mAudioMixSettings->bLoop) { 239 // Add begin cut time to the mod value 240 seekTimeStamp = ((startTime%mBGAudioPCMFileDuration) + 241 mAudioMixSettings->beginCutMs); 242 }else { 243 // Looping disabled, donot do BT Mix , set to file end 244 seekTimeStamp = (mBGAudioPCMFileDuration + 245 mAudioMixSettings->beginCutMs); 246 } 247 }else { 248 // BT still present , just seek to story board time 249 seekTimeStamp = startTime + mAudioMixSettings->beginCutMs; 250 } 251 } 252 else { 253 seekTimeStamp = mAudioMixSettings->beginCutMs; 254 } 255 256 // Convert the seekTimeStamp to file location 257 mBGAudioPCMFileOriginalSeekPoint = ( 258 (int64_t)(mAudioMixSettings->beginCutMs) 259 * mAudioMixSettings->uiSamplingFrequency 260 * mAudioMixSettings->uiNbChannels 261 * sizeof(M4OSA_UInt16))/ 1000 ; /*make to sec from ms*/ 262 263 mBGAudioPCMFileSeekPoint = ((int64_t)(seekTimeStamp) 264 * mAudioMixSettings->uiSamplingFrequency 265 * mAudioMixSettings->uiNbChannels 266 * sizeof(M4OSA_UInt16))/ 1000 ; 267 } 268 } 269 270 // We allow an optional INFO_FORMAT_CHANGED at the very beginning 271 // of playback, if there is one, getFormat below will retrieve the 272 // updated format, if there isn't, we'll stash away the valid buffer 273 // of data to be used on the first audio callback. 274 275 CHECK(mFirstBuffer == NULL); 276 277 mFirstBufferResult = mSource->read(&mFirstBuffer); 278 if (mFirstBufferResult == INFO_FORMAT_CHANGED) { 279 LOGV("INFO_FORMAT_CHANGED!!!"); 280 281 CHECK(mFirstBuffer == NULL); 282 mFirstBufferResult = OK; 283 mIsFirstBuffer = false; 284 } else { 285 mIsFirstBuffer = true; 286 } 287 288 sp<MetaData> format = mSource->getFormat(); 289 const char *mime; 290 bool success = format->findCString(kKeyMIMEType, &mime); 291 CHECK(success); 292 CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)); 293 294 success = format->findInt32(kKeySampleRate, &mSampleRate); 295 CHECK(success); 296 297 int32_t numChannels; 298 success = format->findInt32(kKeyChannelCount, &numChannels); 299 CHECK(success); 300 301 if (mAudioSink.get() != NULL) { 302 status_t err = mAudioSink->open( 303 mSampleRate, numChannels, AUDIO_FORMAT_PCM_16_BIT, 304 DEFAULT_AUDIOSINK_BUFFERCOUNT, 305 &VideoEditorAudioPlayer::AudioSinkCallback, this); 306 if (err != OK) { 307 if (mFirstBuffer != NULL) { 308 mFirstBuffer->release(); 309 mFirstBuffer = NULL; 310 } 311 312 if (!sourceAlreadyStarted) { 313 mSource->stop(); 314 } 315 316 return err; 317 } 318 319 mLatencyUs = (int64_t)mAudioSink->latency() * 1000; 320 mFrameSize = mAudioSink->frameSize(); 321 322 mAudioSink->start(); 323 } else { 324 mAudioTrack = new AudioTrack( 325 AUDIO_STREAM_MUSIC, mSampleRate, AUDIO_FORMAT_PCM_16_BIT, 326 (numChannels == 2) 327 ? AUDIO_CHANNEL_OUT_STEREO 328 : AUDIO_CHANNEL_OUT_MONO, 329 0, 0, &AudioCallback, this, 0); 330 331 if ((err = mAudioTrack->initCheck()) != OK) { 332 delete mAudioTrack; 333 mAudioTrack = NULL; 334 335 if (mFirstBuffer != NULL) { 336 mFirstBuffer->release(); 337 mFirstBuffer = NULL; 338 } 339 340 if (!sourceAlreadyStarted) { 341 mSource->stop(); 342 } 343 344 return err; 345 } 346 347 mLatencyUs = (int64_t)mAudioTrack->latency() * 1000; 348 mFrameSize = mAudioTrack->frameSize(); 349 350 mAudioTrack->start(); 351 } 352 353 mStarted = true; 354 355 return OK; 356} 357 358void VideoEditorAudioPlayer::resume() { 359 360 veAudMixSettings audioMixSettings; 361 362 // Single audio player is used; 363 // Pass on the audio ducking parameters 364 // which might have changed with new audio source 365 audioMixSettings.lvInDucking_threshold = 366 mAudioMixSettings->uiInDucking_threshold; 367 audioMixSettings.lvInDucking_lowVolume = 368 ((M4OSA_Float)mAudioMixSettings->uiInDucking_lowVolume) / 100.0; 369 audioMixSettings.lvInDucking_enable = 370 mAudioMixSettings->bInDucking_enable; 371 audioMixSettings.lvPTVolLevel = 372 ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal) / 100.0; 373 audioMixSettings.lvBTVolLevel = 374 ((M4OSA_Float)mAudioMixSettings->uiAddVolume) / 100.0; 375 audioMixSettings.lvBTChannelCount = mAudioMixSettings->uiBTChannelCount; 376 audioMixSettings.lvPTChannelCount = mAudioMixSettings->uiNbChannels; 377 378 // Call to Audio mix param setting 379 mAudioProcess->veSetAudioProcessingParams(audioMixSettings); 380 381 //Call the base class 382 AudioPlayerBase::resume(); 383} 384 385void VideoEditorAudioPlayer::reset() { 386 387 LOGV("reset"); 388 AudioPlayerBase::reset(); 389 390 // Capture the current seek point 391 mBGAudioPCMFileSeekPoint = 0; 392 mBGAudioStoryBoardSkimTimeStamp =0; 393 mBGAudioStoryBoardCurrentMediaBeginCutTS=0; 394} 395 396size_t VideoEditorAudioPlayer::AudioSinkCallback( 397 MediaPlayerBase::AudioSink *audioSink, 398 void *buffer, size_t size, void *cookie) { 399 VideoEditorAudioPlayer *me = (VideoEditorAudioPlayer *)cookie; 400 401 return me->fillBuffer(buffer, size); 402} 403 404 405size_t VideoEditorAudioPlayer::fillBuffer(void *data, size_t size) { 406 407 if (mReachedEOS) { 408 return 0; 409 } 410 411 size_t size_done = 0; 412 size_t size_remaining = size; 413 414 M4OSA_ERR err = M4NO_ERROR; 415 M4AM_Buffer16 bgFrame = {NULL, 0}; 416 M4AM_Buffer16 mixFrame = {NULL, 0}; 417 M4AM_Buffer16 ptFrame = {NULL, 0}; 418 int64_t currentSteamTS = 0; 419 int64_t startTimeForBT = 0; 420 M4OSA_Float fPTVolLevel = 421 ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal)/100; 422 M4OSA_Int16 *pPTMdata=NULL; 423 M4OSA_UInt32 uiPCMsize = 0; 424 425 bool postSeekComplete = false; 426 bool postEOS = false; 427 428 while ((size_remaining > 0)&&(err==M4NO_ERROR)) { 429 MediaSource::ReadOptions options; 430 431 { 432 Mutex::Autolock autoLock(mLock); 433 if (mSeeking) { 434 if (mIsFirstBuffer) { 435 if (mFirstBuffer != NULL) { 436 mFirstBuffer->release(); 437 mFirstBuffer = NULL; 438 } 439 mIsFirstBuffer = false; 440 } 441 442 options.setSeekTo(mSeekTimeUs); 443 444 if (mInputBuffer != NULL) { 445 mInputBuffer->release(); 446 mInputBuffer = NULL; 447 } 448 449 mSeeking = false; 450 451 if (mObserver) { 452 postSeekComplete = true; 453 } 454 } 455 } 456 457 if (mInputBuffer == NULL) { 458 status_t status = OK; 459 460 if (mIsFirstBuffer) { 461 mInputBuffer = mFirstBuffer; 462 mFirstBuffer = NULL; 463 status = mFirstBufferResult; 464 465 mIsFirstBuffer = false; 466 } else { 467 468 { 469 Mutex::Autolock autoLock(mLock); 470 status = mSource->read(&mInputBuffer, &options); 471 } 472 // Data is Primary Track, mix with background track 473 // after reading same size from Background track PCM file 474 if (status == OK) 475 { 476 // Mix only when skim point is after startTime of BT 477 if (((mBGAudioStoryBoardSkimTimeStamp* 1000) + 478 (mPositionTimeMediaUs - mSeekTimeUs)) >= 479 (int64_t)(mAudioMixSettings->uiAddCts * 1000)) { 480 481 LOGV("VideoEditorAudioPlayer::INSIDE MIXING"); 482 LOGV("Checking %lld <= %lld", 483 mBGAudioPCMFileSeekPoint-mBGAudioPCMFileOriginalSeekPoint, 484 mBGAudioPCMFileTrimmedLength); 485 486 487 M4OSA_Void* ptr; 488 ptr = (M4OSA_Void*)((unsigned int)mInputBuffer->data() + 489 mInputBuffer->range_offset()); 490 491 M4OSA_UInt32 len = mInputBuffer->range_length(); 492 M4OSA_Context fp = M4OSA_NULL; 493 494 uiPCMsize = (mInputBuffer->range_length())/2; 495 pPTMdata = (M4OSA_Int16*) ((uint8_t*) mInputBuffer->data() 496 + mInputBuffer->range_offset()); 497 498 LOGV("mix with background malloc to do len %d", len); 499 500 bgFrame.m_dataAddress = (M4OSA_UInt16*)M4OSA_32bitAlignedMalloc( len, 1, 501 (M4OSA_Char*)"bgFrame"); 502 if (NULL == bgFrame.m_dataAddress) { 503 LOGE("mBackgroundAudioSetting Malloc failed"); 504 } 505 506 bgFrame.m_bufferSize = len; 507 508 mixFrame.m_dataAddress = (M4OSA_UInt16*)M4OSA_32bitAlignedMalloc(len, 1, 509 (M4OSA_Char*)"mixFrame"); 510 if (NULL == mixFrame.m_dataAddress) { 511 LOGE("mBackgroundAudioSetting Malloc failed"); 512 } 513 514 mixFrame.m_bufferSize = len; 515 516 LOGV("mix with bgm with size %lld", mBGAudioPCMFileLength); 517 518 CHECK(mInputBuffer->meta_data()->findInt64(kKeyTime, 519 &mPositionTimeMediaUs)); 520 521 if (mBGAudioPCMFileSeekPoint - 522 mBGAudioPCMFileOriginalSeekPoint <= 523 (mBGAudioPCMFileTrimmedLength - len)) { 524 525 LOGV("Checking mBGAudioPCMFileHandle %d", 526 (unsigned int)mBGAudioPCMFileHandle); 527 528 if (mBGAudioPCMFileHandle != M4OSA_NULL) { 529 LOGV("fillBuffer seeking file to %lld", 530 mBGAudioPCMFileSeekPoint); 531 532 // TODO : 32bits required for OSAL 533 M4OSA_UInt32 tmp32 = 534 (M4OSA_UInt32)mBGAudioPCMFileSeekPoint; 535 err = M4OSA_fileReadSeek(mBGAudioPCMFileHandle, 536 M4OSA_kFileSeekBeginning, 537 (M4OSA_FilePosition*)&tmp32); 538 539 mBGAudioPCMFileSeekPoint = tmp32; 540 541 if (err != M4NO_ERROR){ 542 LOGE("M4OSA_fileReadSeek err %d",(int)err); 543 } 544 545 err = M4OSA_fileReadData(mBGAudioPCMFileHandle, 546 (M4OSA_Int8*)bgFrame.m_dataAddress, 547 (M4OSA_UInt32*)&len); 548 if (err == M4WAR_NO_DATA_YET ) { 549 550 LOGV("fillBuffer End of file reached"); 551 err = M4NO_ERROR; 552 553 // We reached the end of file 554 // move to begin cut time equal value 555 if (mAudioMixSettings->bLoop) { 556 mBGAudioPCMFileSeekPoint = 557 (((int64_t)(mAudioMixSettings->beginCutMs) * 558 mAudioMixSettings->uiSamplingFrequency) * 559 mAudioMixSettings->uiNbChannels * 560 sizeof(M4OSA_UInt16)) / 1000; 561 LOGV("fillBuffer Looping \ 562 to mBGAudioPCMFileSeekPoint %lld", 563 mBGAudioPCMFileSeekPoint); 564 } 565 else { 566 // No mixing; 567 // take care of volume of primary track 568 if (fPTVolLevel < 1.0) { 569 setPrimaryTrackVolume(pPTMdata, 570 uiPCMsize, fPTVolLevel); 571 } 572 } 573 } else if (err != M4NO_ERROR ) { 574 LOGV("fileReadData for audio err %d", err); 575 } else { 576 mBGAudioPCMFileSeekPoint += len; 577 LOGV("fillBuffer mBGAudioPCMFileSeekPoint \ 578 %lld", mBGAudioPCMFileSeekPoint); 579 580 // Assign the ptr data to primary track 581 ptFrame.m_dataAddress = (M4OSA_UInt16*)ptr; 582 ptFrame.m_bufferSize = len; 583 584 // Call to mix and duck 585 mAudioProcess->veProcessAudioMixNDuck( 586 &ptFrame, &bgFrame, &mixFrame); 587 588 // Overwrite the decoded buffer 589 memcpy((void *)ptr, 590 (void *)mixFrame.m_dataAddress, len); 591 } 592 } 593 } else if (mAudioMixSettings->bLoop){ 594 // Move to begin cut time equal value 595 mBGAudioPCMFileSeekPoint = 596 mBGAudioPCMFileOriginalSeekPoint; 597 } else { 598 // No mixing; 599 // take care of volume level of primary track 600 if(fPTVolLevel < 1.0) { 601 setPrimaryTrackVolume( 602 pPTMdata, uiPCMsize, fPTVolLevel); 603 } 604 } 605 if (bgFrame.m_dataAddress) { 606 free(bgFrame.m_dataAddress); 607 } 608 if (mixFrame.m_dataAddress) { 609 free(mixFrame.m_dataAddress); 610 } 611 } else { 612 // No mixing; 613 // take care of volume level of primary track 614 if(fPTVolLevel < 1.0) { 615 setPrimaryTrackVolume(pPTMdata, uiPCMsize, 616 fPTVolLevel); 617 } 618 } 619 } 620 } 621 622 CHECK((status == OK && mInputBuffer != NULL) 623 || (status != OK && mInputBuffer == NULL)); 624 625 Mutex::Autolock autoLock(mLock); 626 627 if (status != OK) { 628 LOGV("fillBuffer: mSource->read returned err %d", status); 629 if (mObserver && !mReachedEOS) { 630 postEOS = true; 631 } 632 633 mReachedEOS = true; 634 mFinalStatus = status; 635 break; 636 } 637 638 CHECK(mInputBuffer->meta_data()->findInt64( 639 kKeyTime, &mPositionTimeMediaUs)); 640 641 mPositionTimeRealUs = 642 ((mNumFramesPlayed + size_done / mFrameSize) * 1000000) 643 / mSampleRate; 644 645 LOGV("buffer->size() = %d, " 646 "mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f", 647 mInputBuffer->range_length(), 648 mPositionTimeMediaUs / 1E6, mPositionTimeRealUs / 1E6); 649 } 650 651 if (mInputBuffer->range_length() == 0) { 652 mInputBuffer->release(); 653 mInputBuffer = NULL; 654 655 continue; 656 } 657 658 size_t copy = size_remaining; 659 if (copy > mInputBuffer->range_length()) { 660 copy = mInputBuffer->range_length(); 661 } 662 663 memcpy((char *)data + size_done, 664 (const char *)mInputBuffer->data() + mInputBuffer->range_offset(), 665 copy); 666 667 mInputBuffer->set_range(mInputBuffer->range_offset() + copy, 668 mInputBuffer->range_length() - copy); 669 670 size_done += copy; 671 size_remaining -= copy; 672 } 673 674 { 675 Mutex::Autolock autoLock(mLock); 676 mNumFramesPlayed += size_done / mFrameSize; 677 } 678 679 if (postEOS) { 680 mObserver->postAudioEOS(); 681 } 682 683 if (postSeekComplete) { 684 mObserver->postAudioSeekComplete(); 685 } 686 687 return size_done; 688} 689 690void VideoEditorAudioPlayer::setAudioMixSettings( 691 M4xVSS_AudioMixingSettings* pAudioMixSettings) { 692 mAudioMixSettings = pAudioMixSettings; 693} 694 695void VideoEditorAudioPlayer::setAudioMixPCMFileHandle( 696 M4OSA_Context pBGAudioPCMFileHandle){ 697 mBGAudioPCMFileHandle = pBGAudioPCMFileHandle; 698} 699 700void VideoEditorAudioPlayer::setAudioMixStoryBoardSkimTimeStamp( 701 M4OSA_UInt32 pBGAudioStoryBoardSkimTimeStamp, 702 M4OSA_UInt32 pBGAudioCurrentMediaBeginCutTS, 703 M4OSA_UInt32 pBGAudioCurrentMediaVolumeVal) { 704 705 mBGAudioStoryBoardSkimTimeStamp = pBGAudioStoryBoardSkimTimeStamp; 706 mBGAudioStoryBoardCurrentMediaBeginCutTS = pBGAudioCurrentMediaBeginCutTS; 707 mBGAudioStoryBoardCurrentMediaVolumeVal = pBGAudioCurrentMediaVolumeVal; 708} 709 710void VideoEditorAudioPlayer::setPrimaryTrackVolume( 711 M4OSA_Int16 *data, M4OSA_UInt32 size, M4OSA_Float volLevel) { 712 713 while(size-- > 0) { 714 *data = (M4OSA_Int16)((*data)*volLevel); 715 data++; 716 } 717} 718 719} 720