blob: a47fc1510d6fa1b2aba8764a170f77da7a7605e7 [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
Marco Nelissen4110c102012-03-29 09:31:28 -0700379status_t VideoEditorPlayer::VeAudioOutput::getPosition(uint32_t *position) const {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800380
381 if (mTrack == 0) return NO_INIT;
382 return mTrack->getPosition(position);
383}
384
Marco Nelissen4110c102012-03-29 09:31:28 -0700385status_t VideoEditorPlayer::VeAudioOutput::getFramesWritten(uint32_t *written) const {
386
387 if (mTrack == 0) return NO_INIT;
388 *written = mNumFramesWritten;
389 return OK;
390}
391
Chih-Chung Chang99698662011-06-30 14:21:38 +0800392status_t VideoEditorPlayer::VeAudioOutput::open(
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800393 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
394 audio_format_t format, int bufferCount,
Eric Laurent1948eb32012-04-13 16:50:19 -0700395 AudioCallback cb, void *cookie, audio_output_flags_t flags) {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800396
397 mCallback = cb;
398 mCallbackCookie = cookie;
399
400 // Check argument "bufferCount" against the mininum buffer count
401 if (bufferCount < mMinBufferCount) {
Steve Block2703f232011-10-20 11:56:09 +0100402 ALOGV("bufferCount (%d) is too small and increased to %d",
Chih-Chung Chang99698662011-06-30 14:21:38 +0800403 bufferCount, mMinBufferCount);
404 bufferCount = mMinBufferCount;
405
406 }
Steve Block2703f232011-10-20 11:56:09 +0100407 ALOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800408 if (mTrack) close();
Glenn Kasten3b16c762012-11-14 08:44:39 -0800409 uint32_t afSampleRate;
Glenn Kastene33054e2012-11-14 12:54:39 -0800410 size_t afFrameCount;
Chih-Chung Chang99698662011-06-30 14:21:38 +0800411 int frameCount;
412
413 if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) !=
414 NO_ERROR) {
415 return NO_INIT;
416 }
417 if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) !=
418 NO_ERROR) {
419 return NO_INIT;
420 }
421
422 frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate;
423
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800424 if (channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER) {
425 switch(channelCount) {
426 case 1:
427 channelMask = AUDIO_CHANNEL_OUT_MONO;
428 break;
429 case 2:
430 channelMask = AUDIO_CHANNEL_OUT_STEREO;
431 break;
432 default:
433 return NO_INIT;
434 }
435 }
436
Chih-Chung Chang99698662011-06-30 14:21:38 +0800437 AudioTrack *t;
438 if (mCallback != NULL) {
439 t = new AudioTrack(
440 mStreamType,
441 sampleRate,
442 format,
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800443 channelMask,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800444 frameCount,
Eric Laurent1948eb32012-04-13 16:50:19 -0700445 flags,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800446 CallbackWrapper,
447 this);
448 } else {
449 t = new AudioTrack(
450 mStreamType,
451 sampleRate,
452 format,
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800453 channelMask,
Eric Laurent1948eb32012-04-13 16:50:19 -0700454 frameCount,
455 flags);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800456 }
457
458 if ((t == 0) || (t->initCheck() != NO_ERROR)) {
Steve Blockf8bd29c2012-01-08 10:14:44 +0000459 ALOGE("Unable to create audio track");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800460 delete t;
461 return NO_INIT;
462 }
463
Steve Block2703f232011-10-20 11:56:09 +0100464 ALOGV("setVolume");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800465 t->setVolume(mLeftVolume, mRightVolume);
466 mMsecsPerFrame = 1.e3 / (float) sampleRate;
467 mLatency = t->latency();
468 mTrack = t;
469 return NO_ERROR;
470}
471
472void VideoEditorPlayer::VeAudioOutput::start() {
473
Steve Block2703f232011-10-20 11:56:09 +0100474 ALOGV("start");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800475 if (mTrack) {
476 mTrack->setVolume(mLeftVolume, mRightVolume);
477 mTrack->start();
478 mTrack->getPosition(&mNumFramesWritten);
479 }
480}
481
482void VideoEditorPlayer::VeAudioOutput::snoopWrite(
483 const void* buffer, size_t size) {
484 // Visualization buffers not supported
485 return;
486
487}
488
489ssize_t VideoEditorPlayer::VeAudioOutput::write(
490 const void* buffer, size_t size) {
491
492 LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback.");
493
Steve Block2703f232011-10-20 11:56:09 +0100494 //ALOGV("write(%p, %u)", buffer, size);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800495 if (mTrack) {
496 snoopWrite(buffer, size);
497 ssize_t ret = mTrack->write(buffer, size);
498 mNumFramesWritten += ret / 4; // assume 16 bit stereo
499 return ret;
500 }
501 return NO_INIT;
502}
503
504void VideoEditorPlayer::VeAudioOutput::stop() {
505
Steve Block2703f232011-10-20 11:56:09 +0100506 ALOGV("stop");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800507 if (mTrack) mTrack->stop();
508}
509
510void VideoEditorPlayer::VeAudioOutput::flush() {
511
Steve Block2703f232011-10-20 11:56:09 +0100512 ALOGV("flush");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800513 if (mTrack) mTrack->flush();
514}
515
516void VideoEditorPlayer::VeAudioOutput::pause() {
517
Steve Block2703f232011-10-20 11:56:09 +0100518 ALOGV("VeAudioOutput::pause");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800519 if (mTrack) mTrack->pause();
520}
521
522void VideoEditorPlayer::VeAudioOutput::close() {
523
Steve Block2703f232011-10-20 11:56:09 +0100524 ALOGV("close");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800525 delete mTrack;
526 mTrack = 0;
527}
528
529void VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) {
530
Steve Block2703f232011-10-20 11:56:09 +0100531 ALOGV("setVolume(%f, %f)", left, right);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800532 mLeftVolume = left;
533 mRightVolume = right;
534 if (mTrack) {
535 mTrack->setVolume(left, right);
536 }
537}
538
539// static
540void VideoEditorPlayer::VeAudioOutput::CallbackWrapper(
541 int event, void *cookie, void *info) {
Steve Block2703f232011-10-20 11:56:09 +0100542 //ALOGV("VeAudioOutput::callbackwrapper");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800543 if (event != AudioTrack::EVENT_MORE_DATA) {
544 return;
545 }
546
547 VeAudioOutput *me = (VeAudioOutput *)cookie;
548 AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
549
550 size_t actualSize = (*me->mCallback)(
551 me, buffer->raw, buffer->size, me->mCallbackCookie);
552
553 buffer->size = actualSize;
554
555 if (actualSize > 0) {
556 me->snoopWrite(buffer->raw, actualSize);
557 }
558}
559
560status_t VideoEditorPlayer::VeAudioOutput::dump(int fd, const Vector<String16>& args) const
561{
562 const size_t SIZE = 256;
563 char buffer[SIZE];
564 String8 result;
565
566 result.append(" VeAudioOutput\n");
567 snprintf(buffer, SIZE-1, " stream type(%d), left - right volume(%f, %f)\n",
568 mStreamType, mLeftVolume, mRightVolume);
569 result.append(buffer);
570 snprintf(buffer, SIZE-1, " msec per frame(%f), latency (%d)\n",
571 mMsecsPerFrame, mLatency);
572 result.append(buffer);
573 ::write(fd, result.string(), result.size());
574 if (mTrack != 0) {
575 mTrack->dump(fd, args);
576 }
577 return NO_ERROR;
578}
579
Marco Nelissen4110c102012-03-29 09:31:28 -0700580int VideoEditorPlayer::VeAudioOutput::getSessionId() const {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800581
582 return mSessionId;
583}
584
585} // namespace android