blob: 57cab0868c4f72ed9c7c17b2d6b96b3715d851cb [file] [log] [blame]
Chih-Chung Chang99698662011-06-30 14:21:38 +08001/*
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 "VideoEditorPlayer"
19#include <utils/Log.h>
20
21#include "VideoEditorPlayer.h"
22#include "PreviewPlayer.h"
23
24#include <media/Metadata.h>
25#include <media/stagefright/MediaExtractor.h>
Dima Zavin68598372011-04-05 16:13:49 -070026
Dima Zavin272eb552011-05-11 14:15:37 -070027#include <system/audio.h>
Chih-Chung Chang99698662011-06-30 14:21:38 +080028
29namespace android {
30
Chih-Chung Chang43fcc392011-08-02 16:17:39 +080031VideoEditorPlayer::VideoEditorPlayer(NativeWindowRenderer* renderer)
32 : mPlayer(new PreviewPlayer(renderer)) {
Chih-Chung Chang99698662011-06-30 14:21:38 +080033
Steve Block2703f232011-10-20 11:56:09 +010034 ALOGV("VideoEditorPlayer");
Chih-Chung Chang99698662011-06-30 14:21:38 +080035 mPlayer->setListener(this);
36}
37
38VideoEditorPlayer::~VideoEditorPlayer() {
Steve Block2703f232011-10-20 11:56:09 +010039 ALOGV("~VideoEditorPlayer");
Chih-Chung Chang99698662011-06-30 14:21:38 +080040
41 reset();
42 mVeAudioSink.clear();
43
44 delete mPlayer;
45 mPlayer = NULL;
46}
47
48status_t VideoEditorPlayer::initCheck() {
Steve Block2703f232011-10-20 11:56:09 +010049 ALOGV("initCheck");
Chih-Chung Chang99698662011-06-30 14:21:38 +080050 return OK;
51}
52
53
54status_t VideoEditorPlayer::setAudioPlayer(VideoEditorAudioPlayer *audioPlayer) {
55 return mPlayer->setAudioPlayer(audioPlayer);
56}
57
58
59status_t VideoEditorPlayer::setDataSource(
60 const char *url, const KeyedVector<String8, String8> *headers) {
Steve Blockec9e6632012-01-04 20:06:05 +000061 ALOGI("setDataSource('%s')", url);
James Dongdaeb5b32012-01-12 12:12:40 -080062 if (headers != NULL) {
63 ALOGE("Headers parameter is not supported");
64 return INVALID_OPERATION;
65 }
Chih-Chung Chang99698662011-06-30 14:21:38 +080066
James Dongdaeb5b32012-01-12 12:12:40 -080067 return mPlayer->setDataSource(url);
Chih-Chung Chang99698662011-06-30 14:21:38 +080068}
69
70//We donot use this in preview, dummy implimentation as this is pure virtual
71status_t VideoEditorPlayer::setDataSource(int fd, int64_t offset,
72 int64_t length) {
Steve Blockf8bd29c2012-01-08 10:14:44 +000073 ALOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length);
Chih-Chung Chang99698662011-06-30 14:21:38 +080074 return (!OK);
75}
76
77status_t VideoEditorPlayer::setVideoSurface(const sp<Surface> &surface) {
Steve Block2703f232011-10-20 11:56:09 +010078 ALOGV("setVideoSurface");
Chih-Chung Chang99698662011-06-30 14:21:38 +080079
80 mPlayer->setSurface(surface);
81 return OK;
82}
83
84status_t VideoEditorPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
Steve Block2703f232011-10-20 11:56:09 +010085 ALOGV("setVideoSurfaceTexture");
Chih-Chung Chang99698662011-06-30 14:21:38 +080086
87 mPlayer->setSurfaceTexture(surfaceTexture);
88 return OK;
89}
90
91status_t VideoEditorPlayer::prepare() {
Steve Block2703f232011-10-20 11:56:09 +010092 ALOGV("prepare");
Chih-Chung Chang99698662011-06-30 14:21:38 +080093 return mPlayer->prepare();
94}
95
96status_t VideoEditorPlayer::prepareAsync() {
97 return mPlayer->prepareAsync();
98}
99
100status_t VideoEditorPlayer::start() {
Steve Block2703f232011-10-20 11:56:09 +0100101 ALOGV("start");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800102 return mPlayer->play();
103}
104
105status_t VideoEditorPlayer::stop() {
Steve Block2703f232011-10-20 11:56:09 +0100106 ALOGV("stop");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800107 return pause();
108}
109
110status_t VideoEditorPlayer::pause() {
Steve Block2703f232011-10-20 11:56:09 +0100111 ALOGV("pause");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800112 return mPlayer->pause();
113}
114
115bool VideoEditorPlayer::isPlaying() {
Steve Block2703f232011-10-20 11:56:09 +0100116 ALOGV("isPlaying");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800117 return mPlayer->isPlaying();
118}
119
120status_t VideoEditorPlayer::seekTo(int msec) {
Steve Block2703f232011-10-20 11:56:09 +0100121 ALOGV("seekTo");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800122 status_t err = mPlayer->seekTo((int64_t)msec * 1000);
123 return err;
124}
125
126status_t VideoEditorPlayer::getCurrentPosition(int *msec) {
Steve Block2703f232011-10-20 11:56:09 +0100127 ALOGV("getCurrentPosition");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800128 int64_t positionUs;
129 status_t err = mPlayer->getPosition(&positionUs);
130
131 if (err != OK) {
132 return err;
133 }
134
135 *msec = (positionUs + 500) / 1000;
136 return OK;
137}
138
139status_t VideoEditorPlayer::getDuration(int *msec) {
Steve Block2703f232011-10-20 11:56:09 +0100140 ALOGV("getDuration");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800141
142 int64_t durationUs;
143 status_t err = mPlayer->getDuration(&durationUs);
144
145 if (err != OK) {
146 *msec = 0;
147 return OK;
148 }
149
150 *msec = (durationUs + 500) / 1000;
151 return OK;
152}
153
154status_t VideoEditorPlayer::reset() {
Steve Block2703f232011-10-20 11:56:09 +0100155 ALOGV("reset");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800156 mPlayer->reset();
157 return OK;
158}
159
160status_t VideoEditorPlayer::setLooping(int loop) {
Steve Block2703f232011-10-20 11:56:09 +0100161 ALOGV("setLooping");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800162 return mPlayer->setLooping(loop);
163}
164
Gloria Wangacb62af2011-04-25 17:29:16 -0700165status_t VideoEditorPlayer::setParameter(int key, const Parcel &request) {
James Dongdaeb5b32012-01-12 12:12:40 -0800166 ALOGE("setParameter not implemented");
167 return INVALID_OPERATION;
Gloria Wangacb62af2011-04-25 17:29:16 -0700168}
169
170status_t VideoEditorPlayer::getParameter(int key, Parcel *reply) {
James Dongdaeb5b32012-01-12 12:12:40 -0800171 ALOGE("getParameter not implemented");
172 return INVALID_OPERATION;
Gloria Wangacb62af2011-04-25 17:29:16 -0700173}
174
Chih-Chung Chang99698662011-06-30 14:21:38 +0800175player_type VideoEditorPlayer::playerType() {
Steve Block2703f232011-10-20 11:56:09 +0100176 ALOGV("playerType");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800177 return STAGEFRIGHT_PLAYER;
178}
179
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700180void VideoEditorPlayer::acquireLock() {
Steve Block2703f232011-10-20 11:56:09 +0100181 ALOGV("acquireLock");
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700182 mPlayer->acquireLock();
183}
Chih-Chung Chang99698662011-06-30 14:21:38 +0800184
185void VideoEditorPlayer::releaseLock() {
Steve Block2703f232011-10-20 11:56:09 +0100186 ALOGV("releaseLock");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800187 mPlayer->releaseLock();
188}
189
190status_t VideoEditorPlayer::invoke(const Parcel &request, Parcel *reply) {
191 return INVALID_OPERATION;
192}
193
194void VideoEditorPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
195 MediaPlayerInterface::setAudioSink(audioSink);
196
197 mPlayer->setAudioSink(audioSink);
198}
199
200status_t VideoEditorPlayer::getMetadata(
201 const media::Metadata::Filter& ids, Parcel *records) {
202 using media::Metadata;
203
James Dong00f742c2012-01-13 17:34:42 -0800204 uint32_t flags = mPlayer->getSourceSeekFlags();
Chih-Chung Chang99698662011-06-30 14:21:38 +0800205
206 Metadata metadata(records);
207
208 metadata.appendBool(
209 Metadata::kPauseAvailable,
210 flags & MediaExtractor::CAN_PAUSE);
211
212 metadata.appendBool(
213 Metadata::kSeekBackwardAvailable,
214 flags & MediaExtractor::CAN_SEEK_BACKWARD);
215
216 metadata.appendBool(
217 Metadata::kSeekForwardAvailable,
218 flags & MediaExtractor::CAN_SEEK_FORWARD);
219
220 metadata.appendBool(
221 Metadata::kSeekAvailable,
222 flags & MediaExtractor::CAN_SEEK);
223
224 return OK;
225}
226
227status_t VideoEditorPlayer::loadEffectsSettings(
228 M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) {
Steve Block2703f232011-10-20 11:56:09 +0100229 ALOGV("loadEffectsSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800230 return mPlayer->loadEffectsSettings(pEffectSettings, nEffects);
231}
232
233status_t VideoEditorPlayer::loadAudioMixSettings(
234 M4xVSS_AudioMixingSettings* pAudioMixSettings) {
Steve Block2703f232011-10-20 11:56:09 +0100235 ALOGV("VideoEditorPlayer: loadAudioMixSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800236 return mPlayer->loadAudioMixSettings(pAudioMixSettings);
237}
238
239status_t VideoEditorPlayer::setAudioMixPCMFileHandle(
240 M4OSA_Context pAudioMixPCMFileHandle) {
241
Steve Block2703f232011-10-20 11:56:09 +0100242 ALOGV("VideoEditorPlayer: loadAudioMixSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800243 return mPlayer->setAudioMixPCMFileHandle(pAudioMixPCMFileHandle);
244}
245
246status_t VideoEditorPlayer::setAudioMixStoryBoardParam(
247 M4OSA_UInt32 audioMixStoryBoardTS,
248 M4OSA_UInt32 currentMediaBeginCutTime,
249 M4OSA_UInt32 primaryTrackVolValue) {
250
Steve Block2703f232011-10-20 11:56:09 +0100251 ALOGV("VideoEditorPlayer: loadAudioMixSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800252 return mPlayer->setAudioMixStoryBoardParam(audioMixStoryBoardTS,
253 currentMediaBeginCutTime, primaryTrackVolValue);
254}
255
256status_t VideoEditorPlayer::setPlaybackBeginTime(uint32_t msec) {
Steve Block2703f232011-10-20 11:56:09 +0100257 ALOGV("setPlaybackBeginTime");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800258 return mPlayer->setPlaybackBeginTime(msec);
259}
260
261status_t VideoEditorPlayer::setPlaybackEndTime(uint32_t msec) {
Steve Block2703f232011-10-20 11:56:09 +0100262 ALOGV("setPlaybackEndTime");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800263 return mPlayer->setPlaybackEndTime(msec);
264}
265
266status_t VideoEditorPlayer::setStoryboardStartTime(uint32_t msec) {
Steve Block2703f232011-10-20 11:56:09 +0100267 ALOGV("setStoryboardStartTime");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800268 return mPlayer->setStoryboardStartTime(msec);
269}
270
271status_t VideoEditorPlayer::setProgressCallbackInterval(uint32_t cbInterval) {
Steve Block2703f232011-10-20 11:56:09 +0100272 ALOGV("setProgressCallbackInterval");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800273 return mPlayer->setProgressCallbackInterval(cbInterval);
274}
275
276status_t VideoEditorPlayer::setMediaRenderingMode(
277 M4xVSS_MediaRendering mode,
278 M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
279
Steve Block2703f232011-10-20 11:56:09 +0100280 ALOGV("setMediaRenderingMode");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800281 return mPlayer->setMediaRenderingMode(mode, outputVideoSize);
282}
283
284status_t VideoEditorPlayer::resetJniCallbackTimeStamp() {
Steve Block2703f232011-10-20 11:56:09 +0100285 ALOGV("resetJniCallbackTimeStamp");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800286 return mPlayer->resetJniCallbackTimeStamp();
287}
288
289status_t VideoEditorPlayer::setImageClipProperties(
290 uint32_t width, uint32_t height) {
291 return mPlayer->setImageClipProperties(width, height);
292}
293
294status_t VideoEditorPlayer::readFirstVideoFrame() {
295 return mPlayer->readFirstVideoFrame();
296}
297
298status_t VideoEditorPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) {
299 mPlayer->getLastRenderedTimeMs(lastRenderedTimeMs);
300 return NO_ERROR;
301}
302
303/* Implementation of AudioSink interface */
304#undef LOG_TAG
305#define LOG_TAG "VeAudioSink"
306
307int VideoEditorPlayer::VeAudioOutput::mMinBufferCount = 4;
308bool VideoEditorPlayer::VeAudioOutput::mIsOnEmulator = false;
309
310VideoEditorPlayer::VeAudioOutput::VeAudioOutput()
311 : mCallback(NULL),
312 mCallbackCookie(NULL) {
313 mTrack = 0;
314 mStreamType = AUDIO_STREAM_MUSIC;
315 mLeftVolume = 1.0;
316 mRightVolume = 1.0;
317 mLatency = 0;
318 mMsecsPerFrame = 0;
319 mNumFramesWritten = 0;
320 setMinBufferCount();
321}
322
323VideoEditorPlayer::VeAudioOutput::~VeAudioOutput() {
324 close();
325}
326
327void VideoEditorPlayer::VeAudioOutput::setMinBufferCount() {
328
329 mIsOnEmulator = false;
330 mMinBufferCount = 4;
331}
332
333bool VideoEditorPlayer::VeAudioOutput::isOnEmulator() {
334
335 setMinBufferCount();
336 return mIsOnEmulator;
337}
338
339int VideoEditorPlayer::VeAudioOutput::getMinBufferCount() {
340
341 setMinBufferCount();
342 return mMinBufferCount;
343}
344
345ssize_t VideoEditorPlayer::VeAudioOutput::bufferSize() const {
346
347 if (mTrack == 0) return NO_INIT;
348 return mTrack->frameCount() * frameSize();
349}
350
351ssize_t VideoEditorPlayer::VeAudioOutput::frameCount() const {
352
353 if (mTrack == 0) return NO_INIT;
354 return mTrack->frameCount();
355}
356
357ssize_t VideoEditorPlayer::VeAudioOutput::channelCount() const
358{
359 if (mTrack == 0) return NO_INIT;
360 return mTrack->channelCount();
361}
362
363ssize_t VideoEditorPlayer::VeAudioOutput::frameSize() const
364{
365 if (mTrack == 0) return NO_INIT;
366 return mTrack->frameSize();
367}
368
369uint32_t VideoEditorPlayer::VeAudioOutput::latency () const
370{
371 return mLatency;
372}
373
374float VideoEditorPlayer::VeAudioOutput::msecsPerFrame() const
375{
376 return mMsecsPerFrame;
377}
378
379status_t VideoEditorPlayer::VeAudioOutput::getPosition(uint32_t *position) {
380
381 if (mTrack == 0) return NO_INIT;
382 return mTrack->getPosition(position);
383}
384
385status_t VideoEditorPlayer::VeAudioOutput::open(
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800386 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
387 audio_format_t format, int bufferCount,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800388 AudioCallback cb, void *cookie) {
389
390 mCallback = cb;
391 mCallbackCookie = cookie;
392
393 // Check argument "bufferCount" against the mininum buffer count
394 if (bufferCount < mMinBufferCount) {
Steve Block2703f232011-10-20 11:56:09 +0100395 ALOGV("bufferCount (%d) is too small and increased to %d",
Chih-Chung Chang99698662011-06-30 14:21:38 +0800396 bufferCount, mMinBufferCount);
397 bufferCount = mMinBufferCount;
398
399 }
Steve Block2703f232011-10-20 11:56:09 +0100400 ALOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800401 if (mTrack) close();
402 int afSampleRate;
403 int afFrameCount;
404 int frameCount;
405
406 if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) !=
407 NO_ERROR) {
408 return NO_INIT;
409 }
410 if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) !=
411 NO_ERROR) {
412 return NO_INIT;
413 }
414
415 frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate;
416
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800417 if (channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER) {
418 switch(channelCount) {
419 case 1:
420 channelMask = AUDIO_CHANNEL_OUT_MONO;
421 break;
422 case 2:
423 channelMask = AUDIO_CHANNEL_OUT_STEREO;
424 break;
425 default:
426 return NO_INIT;
427 }
428 }
429
Chih-Chung Chang99698662011-06-30 14:21:38 +0800430 AudioTrack *t;
431 if (mCallback != NULL) {
432 t = new AudioTrack(
433 mStreamType,
434 sampleRate,
435 format,
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800436 channelMask,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800437 frameCount,
Glenn Kasten09e1ef22012-03-06 18:55:35 -0800438 AUDIO_POLICY_OUTPUT_FLAG_NONE,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800439 CallbackWrapper,
440 this);
441 } else {
442 t = new AudioTrack(
443 mStreamType,
444 sampleRate,
445 format,
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800446 channelMask,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800447 frameCount);
448 }
449
450 if ((t == 0) || (t->initCheck() != NO_ERROR)) {
Steve Blockf8bd29c2012-01-08 10:14:44 +0000451 ALOGE("Unable to create audio track");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800452 delete t;
453 return NO_INIT;
454 }
455
Steve Block2703f232011-10-20 11:56:09 +0100456 ALOGV("setVolume");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800457 t->setVolume(mLeftVolume, mRightVolume);
458 mMsecsPerFrame = 1.e3 / (float) sampleRate;
459 mLatency = t->latency();
460 mTrack = t;
461 return NO_ERROR;
462}
463
464void VideoEditorPlayer::VeAudioOutput::start() {
465
Steve Block2703f232011-10-20 11:56:09 +0100466 ALOGV("start");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800467 if (mTrack) {
468 mTrack->setVolume(mLeftVolume, mRightVolume);
469 mTrack->start();
470 mTrack->getPosition(&mNumFramesWritten);
471 }
472}
473
474void VideoEditorPlayer::VeAudioOutput::snoopWrite(
475 const void* buffer, size_t size) {
476 // Visualization buffers not supported
477 return;
478
479}
480
481ssize_t VideoEditorPlayer::VeAudioOutput::write(
482 const void* buffer, size_t size) {
483
484 LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback.");
485
Steve Block2703f232011-10-20 11:56:09 +0100486 //ALOGV("write(%p, %u)", buffer, size);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800487 if (mTrack) {
488 snoopWrite(buffer, size);
489 ssize_t ret = mTrack->write(buffer, size);
490 mNumFramesWritten += ret / 4; // assume 16 bit stereo
491 return ret;
492 }
493 return NO_INIT;
494}
495
496void VideoEditorPlayer::VeAudioOutput::stop() {
497
Steve Block2703f232011-10-20 11:56:09 +0100498 ALOGV("stop");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800499 if (mTrack) mTrack->stop();
500}
501
502void VideoEditorPlayer::VeAudioOutput::flush() {
503
Steve Block2703f232011-10-20 11:56:09 +0100504 ALOGV("flush");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800505 if (mTrack) mTrack->flush();
506}
507
508void VideoEditorPlayer::VeAudioOutput::pause() {
509
Steve Block2703f232011-10-20 11:56:09 +0100510 ALOGV("VeAudioOutput::pause");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800511 if (mTrack) mTrack->pause();
512}
513
514void VideoEditorPlayer::VeAudioOutput::close() {
515
Steve Block2703f232011-10-20 11:56:09 +0100516 ALOGV("close");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800517 delete mTrack;
518 mTrack = 0;
519}
520
521void VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) {
522
Steve Block2703f232011-10-20 11:56:09 +0100523 ALOGV("setVolume(%f, %f)", left, right);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800524 mLeftVolume = left;
525 mRightVolume = right;
526 if (mTrack) {
527 mTrack->setVolume(left, right);
528 }
529}
530
531// static
532void VideoEditorPlayer::VeAudioOutput::CallbackWrapper(
533 int event, void *cookie, void *info) {
Steve Block2703f232011-10-20 11:56:09 +0100534 //ALOGV("VeAudioOutput::callbackwrapper");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800535 if (event != AudioTrack::EVENT_MORE_DATA) {
536 return;
537 }
538
539 VeAudioOutput *me = (VeAudioOutput *)cookie;
540 AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
541
542 size_t actualSize = (*me->mCallback)(
543 me, buffer->raw, buffer->size, me->mCallbackCookie);
544
545 buffer->size = actualSize;
546
547 if (actualSize > 0) {
548 me->snoopWrite(buffer->raw, actualSize);
549 }
550}
551
552status_t VideoEditorPlayer::VeAudioOutput::dump(int fd, const Vector<String16>& args) const
553{
554 const size_t SIZE = 256;
555 char buffer[SIZE];
556 String8 result;
557
558 result.append(" VeAudioOutput\n");
559 snprintf(buffer, SIZE-1, " stream type(%d), left - right volume(%f, %f)\n",
560 mStreamType, mLeftVolume, mRightVolume);
561 result.append(buffer);
562 snprintf(buffer, SIZE-1, " msec per frame(%f), latency (%d)\n",
563 mMsecsPerFrame, mLatency);
564 result.append(buffer);
565 ::write(fd, result.string(), result.size());
566 if (mTrack != 0) {
567 mTrack->dump(fd, args);
568 }
569 return NO_ERROR;
570}
571
572int VideoEditorPlayer::VeAudioOutput::getSessionId() {
573
574 return mSessionId;
575}
576
577} // namespace android