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