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