blob: c9ff6906a500f4632e0295493fff6faaa8a20b8e [file] [log] [blame]
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001/*
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;
Dheeraj Sharma5bc7fb42011-02-13 20:31:27 -080041 mAudioProcess = NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080042 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;
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -080051 mSource = NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080052}
53
54VideoEditorAudioPlayer::~VideoEditorAudioPlayer() {
55
56 LOGV("~VideoEditorAudioPlayer");
57 if (mStarted) {
58 reset();
59 }
Santosh Madhava5df81852011-02-11 00:43:26 -080060 if (mAudioProcess != NULL) {
61 delete mAudioProcess;
62 mAudioProcess = NULL;
63 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080064}
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -080065void VideoEditorAudioPlayer::setSource(const sp<MediaSource> &source) {
66 Mutex::Autolock autoLock(mLock);
Rajneesh Chowduryb6e2b5c2011-02-25 22:59:46 -080067
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
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -080089 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
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800104bool VideoEditorAudioPlayer::isStarted() {
105 return mStarted;
106}
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800107
108status_t VideoEditorAudioPlayer::start(bool sourceAlreadyStarted) {
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800109 Mutex::Autolock autoLock(mLock);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800110 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
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800131 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;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800141 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
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800357void 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
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800384void 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;
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800414 M4AM_Buffer16 bgFrame = {NULL, 0};
415 M4AM_Buffer16 mixFrame = {NULL, 0};
416 M4AM_Buffer16 ptFrame = {NULL, 0};
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800417 int64_t currentSteamTS = 0;
418 int64_t startTimeForBT = 0;
419 M4OSA_Float fPTVolLevel =
420 ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal)/100;
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800421 M4OSA_Int16 *pPTMdata=NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800422 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 {
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800462
463 {
464 Mutex::Autolock autoLock(mLock);
465 status = mSource->read(&mInputBuffer, &options);
466 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800467 // 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");
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800477 LOGV("Checking %lld <= %lld",
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800478 mBGAudioPCMFileSeekPoint-mBGAudioPCMFileOriginalSeekPoint,
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800479 mBGAudioPCMFileTrimmedLength);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800480
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;
Kenny Rooteb5b2652011-02-08 11:13:19 -0800490 pPTMdata = (M4OSA_Int16*) ((uint8_t*) mInputBuffer->data()
491 + mInputBuffer->range_offset());
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800492
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){
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800537 LOGE("M4OSA_fileReadSeek err %d",(int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800538 }
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}