blob: f9c3879ed1815f0bc293b640cf54bb5fb52a1300 [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(
Andreas Huber1b86fe02014-01-29 11:13:26 -080060 const sp<IMediaHTTPService> &httpService,
Chih-Chung Chang99698662011-06-30 14:21:38 +080061 const char *url, const KeyedVector<String8, String8> *headers) {
Steve Blockec9e6632012-01-04 20:06:05 +000062 ALOGI("setDataSource('%s')", url);
James Dongdaeb5b32012-01-12 12:12:40 -080063 if (headers != NULL) {
64 ALOGE("Headers parameter is not supported");
65 return INVALID_OPERATION;
66 }
Chih-Chung Chang99698662011-06-30 14:21:38 +080067
James Dongdaeb5b32012-01-12 12:12:40 -080068 return mPlayer->setDataSource(url);
Chih-Chung Chang99698662011-06-30 14:21:38 +080069}
70
71//We donot use this in preview, dummy implimentation as this is pure virtual
72status_t VideoEditorPlayer::setDataSource(int fd, int64_t offset,
73 int64_t length) {
Steve Blockf8bd29c2012-01-08 10:14:44 +000074 ALOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length);
Chih-Chung Chang99698662011-06-30 14:21:38 +080075 return (!OK);
76}
77
78status_t VideoEditorPlayer::setVideoSurface(const sp<Surface> &surface) {
Steve Block2703f232011-10-20 11:56:09 +010079 ALOGV("setVideoSurface");
Chih-Chung Chang99698662011-06-30 14:21:38 +080080
81 mPlayer->setSurface(surface);
82 return OK;
83}
84
Andy McFadden8ba01022012-12-18 09:46:54 -080085status_t VideoEditorPlayer::setVideoSurfaceTexture(const sp<IGraphicBufferProducer> &bufferProducer) {
Steve Block2703f232011-10-20 11:56:09 +010086 ALOGV("setVideoSurfaceTexture");
Chih-Chung Chang99698662011-06-30 14:21:38 +080087
Andy McFadden8ba01022012-12-18 09:46:54 -080088 mPlayer->setSurfaceTexture(bufferProducer);
Chih-Chung Chang99698662011-06-30 14:21:38 +080089 return OK;
90}
91
92status_t VideoEditorPlayer::prepare() {
Steve Block2703f232011-10-20 11:56:09 +010093 ALOGV("prepare");
Chih-Chung Chang99698662011-06-30 14:21:38 +080094 return mPlayer->prepare();
95}
96
97status_t VideoEditorPlayer::prepareAsync() {
98 return mPlayer->prepareAsync();
99}
100
101status_t VideoEditorPlayer::start() {
Steve Block2703f232011-10-20 11:56:09 +0100102 ALOGV("start");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800103 return mPlayer->play();
104}
105
106status_t VideoEditorPlayer::stop() {
Steve Block2703f232011-10-20 11:56:09 +0100107 ALOGV("stop");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800108 return pause();
109}
110
111status_t VideoEditorPlayer::pause() {
Steve Block2703f232011-10-20 11:56:09 +0100112 ALOGV("pause");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800113 return mPlayer->pause();
114}
115
116bool VideoEditorPlayer::isPlaying() {
Steve Block2703f232011-10-20 11:56:09 +0100117 ALOGV("isPlaying");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800118 return mPlayer->isPlaying();
119}
120
121status_t VideoEditorPlayer::seekTo(int msec) {
Steve Block2703f232011-10-20 11:56:09 +0100122 ALOGV("seekTo");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800123 status_t err = mPlayer->seekTo((int64_t)msec * 1000);
124 return err;
125}
126
127status_t VideoEditorPlayer::getCurrentPosition(int *msec) {
Steve Block2703f232011-10-20 11:56:09 +0100128 ALOGV("getCurrentPosition");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800129 int64_t positionUs;
130 status_t err = mPlayer->getPosition(&positionUs);
131
132 if (err != OK) {
133 return err;
134 }
135
136 *msec = (positionUs + 500) / 1000;
137 return OK;
138}
139
140status_t VideoEditorPlayer::getDuration(int *msec) {
Steve Block2703f232011-10-20 11:56:09 +0100141 ALOGV("getDuration");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800142
143 int64_t durationUs;
144 status_t err = mPlayer->getDuration(&durationUs);
145
146 if (err != OK) {
147 *msec = 0;
148 return OK;
149 }
150
151 *msec = (durationUs + 500) / 1000;
152 return OK;
153}
154
155status_t VideoEditorPlayer::reset() {
Steve Block2703f232011-10-20 11:56:09 +0100156 ALOGV("reset");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800157 mPlayer->reset();
158 return OK;
159}
160
161status_t VideoEditorPlayer::setLooping(int loop) {
Steve Block2703f232011-10-20 11:56:09 +0100162 ALOGV("setLooping");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800163 return mPlayer->setLooping(loop);
164}
165
Gloria Wangacb62af2011-04-25 17:29:16 -0700166status_t VideoEditorPlayer::setParameter(int key, const Parcel &request) {
James Dongdaeb5b32012-01-12 12:12:40 -0800167 ALOGE("setParameter not implemented");
168 return INVALID_OPERATION;
Gloria Wangacb62af2011-04-25 17:29:16 -0700169}
170
171status_t VideoEditorPlayer::getParameter(int key, Parcel *reply) {
James Dongdaeb5b32012-01-12 12:12:40 -0800172 ALOGE("getParameter not implemented");
173 return INVALID_OPERATION;
Gloria Wangacb62af2011-04-25 17:29:16 -0700174}
175
Chih-Chung Chang99698662011-06-30 14:21:38 +0800176player_type VideoEditorPlayer::playerType() {
Steve Block2703f232011-10-20 11:56:09 +0100177 ALOGV("playerType");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800178 return STAGEFRIGHT_PLAYER;
179}
180
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700181void VideoEditorPlayer::acquireLock() {
Steve Block2703f232011-10-20 11:56:09 +0100182 ALOGV("acquireLock");
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700183 mPlayer->acquireLock();
184}
Chih-Chung Chang99698662011-06-30 14:21:38 +0800185
186void VideoEditorPlayer::releaseLock() {
Steve Block2703f232011-10-20 11:56:09 +0100187 ALOGV("releaseLock");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800188 mPlayer->releaseLock();
189}
190
191status_t VideoEditorPlayer::invoke(const Parcel &request, Parcel *reply) {
192 return INVALID_OPERATION;
193}
194
195void VideoEditorPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
196 MediaPlayerInterface::setAudioSink(audioSink);
197
198 mPlayer->setAudioSink(audioSink);
199}
200
201status_t VideoEditorPlayer::getMetadata(
202 const media::Metadata::Filter& ids, Parcel *records) {
203 using media::Metadata;
204
James Dong00f742c2012-01-13 17:34:42 -0800205 uint32_t flags = mPlayer->getSourceSeekFlags();
Chih-Chung Chang99698662011-06-30 14:21:38 +0800206
207 Metadata metadata(records);
208
209 metadata.appendBool(
210 Metadata::kPauseAvailable,
211 flags & MediaExtractor::CAN_PAUSE);
212
213 metadata.appendBool(
214 Metadata::kSeekBackwardAvailable,
215 flags & MediaExtractor::CAN_SEEK_BACKWARD);
216
217 metadata.appendBool(
218 Metadata::kSeekForwardAvailable,
219 flags & MediaExtractor::CAN_SEEK_FORWARD);
220
221 metadata.appendBool(
222 Metadata::kSeekAvailable,
223 flags & MediaExtractor::CAN_SEEK);
224
225 return OK;
226}
227
228status_t VideoEditorPlayer::loadEffectsSettings(
229 M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) {
Steve Block2703f232011-10-20 11:56:09 +0100230 ALOGV("loadEffectsSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800231 return mPlayer->loadEffectsSettings(pEffectSettings, nEffects);
232}
233
234status_t VideoEditorPlayer::loadAudioMixSettings(
235 M4xVSS_AudioMixingSettings* pAudioMixSettings) {
Steve Block2703f232011-10-20 11:56:09 +0100236 ALOGV("VideoEditorPlayer: loadAudioMixSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800237 return mPlayer->loadAudioMixSettings(pAudioMixSettings);
238}
239
240status_t VideoEditorPlayer::setAudioMixPCMFileHandle(
241 M4OSA_Context pAudioMixPCMFileHandle) {
242
Steve Block2703f232011-10-20 11:56:09 +0100243 ALOGV("VideoEditorPlayer: loadAudioMixSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800244 return mPlayer->setAudioMixPCMFileHandle(pAudioMixPCMFileHandle);
245}
246
247status_t VideoEditorPlayer::setAudioMixStoryBoardParam(
248 M4OSA_UInt32 audioMixStoryBoardTS,
249 M4OSA_UInt32 currentMediaBeginCutTime,
250 M4OSA_UInt32 primaryTrackVolValue) {
251
Steve Block2703f232011-10-20 11:56:09 +0100252 ALOGV("VideoEditorPlayer: loadAudioMixSettings");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800253 return mPlayer->setAudioMixStoryBoardParam(audioMixStoryBoardTS,
254 currentMediaBeginCutTime, primaryTrackVolValue);
255}
256
257status_t VideoEditorPlayer::setPlaybackBeginTime(uint32_t msec) {
Steve Block2703f232011-10-20 11:56:09 +0100258 ALOGV("setPlaybackBeginTime");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800259 return mPlayer->setPlaybackBeginTime(msec);
260}
261
262status_t VideoEditorPlayer::setPlaybackEndTime(uint32_t msec) {
Steve Block2703f232011-10-20 11:56:09 +0100263 ALOGV("setPlaybackEndTime");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800264 return mPlayer->setPlaybackEndTime(msec);
265}
266
267status_t VideoEditorPlayer::setStoryboardStartTime(uint32_t msec) {
Steve Block2703f232011-10-20 11:56:09 +0100268 ALOGV("setStoryboardStartTime");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800269 return mPlayer->setStoryboardStartTime(msec);
270}
271
272status_t VideoEditorPlayer::setProgressCallbackInterval(uint32_t cbInterval) {
Steve Block2703f232011-10-20 11:56:09 +0100273 ALOGV("setProgressCallbackInterval");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800274 return mPlayer->setProgressCallbackInterval(cbInterval);
275}
276
277status_t VideoEditorPlayer::setMediaRenderingMode(
278 M4xVSS_MediaRendering mode,
279 M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
280
Steve Block2703f232011-10-20 11:56:09 +0100281 ALOGV("setMediaRenderingMode");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800282 return mPlayer->setMediaRenderingMode(mode, outputVideoSize);
283}
284
285status_t VideoEditorPlayer::resetJniCallbackTimeStamp() {
Steve Block2703f232011-10-20 11:56:09 +0100286 ALOGV("resetJniCallbackTimeStamp");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800287 return mPlayer->resetJniCallbackTimeStamp();
288}
289
290status_t VideoEditorPlayer::setImageClipProperties(
291 uint32_t width, uint32_t height) {
292 return mPlayer->setImageClipProperties(width, height);
293}
294
295status_t VideoEditorPlayer::readFirstVideoFrame() {
296 return mPlayer->readFirstVideoFrame();
297}
298
299status_t VideoEditorPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) {
300 mPlayer->getLastRenderedTimeMs(lastRenderedTimeMs);
301 return NO_ERROR;
302}
303
304/* Implementation of AudioSink interface */
305#undef LOG_TAG
306#define LOG_TAG "VeAudioSink"
307
308int VideoEditorPlayer::VeAudioOutput::mMinBufferCount = 4;
309bool VideoEditorPlayer::VeAudioOutput::mIsOnEmulator = false;
310
311VideoEditorPlayer::VeAudioOutput::VeAudioOutput()
312 : mCallback(NULL),
313 mCallbackCookie(NULL) {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800314 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,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000395 AudioCallback cb, void *cookie, audio_output_flags_t flags,
396 const audio_offload_info_t *offloadInfo) {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800397
398 mCallback = cb;
399 mCallbackCookie = cookie;
400
401 // Check argument "bufferCount" against the mininum buffer count
402 if (bufferCount < mMinBufferCount) {
Steve Block2703f232011-10-20 11:56:09 +0100403 ALOGV("bufferCount (%d) is too small and increased to %d",
Chih-Chung Chang99698662011-06-30 14:21:38 +0800404 bufferCount, mMinBufferCount);
405 bufferCount = mMinBufferCount;
406
407 }
Steve Block2703f232011-10-20 11:56:09 +0100408 ALOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
Glenn Kasten2799d742013-05-30 14:33:29 -0700409 if (mTrack != 0) close();
Glenn Kasten3b16c762012-11-14 08:44:39 -0800410 uint32_t afSampleRate;
Glenn Kastene33054e2012-11-14 12:54:39 -0800411 size_t afFrameCount;
Chih-Chung Chang99698662011-06-30 14:21:38 +0800412 int frameCount;
413
414 if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) !=
415 NO_ERROR) {
416 return NO_INIT;
417 }
418 if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) !=
419 NO_ERROR) {
420 return NO_INIT;
421 }
422
423 frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate;
424
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800425 if (channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER) {
426 switch(channelCount) {
427 case 1:
428 channelMask = AUDIO_CHANNEL_OUT_MONO;
429 break;
430 case 2:
431 channelMask = AUDIO_CHANNEL_OUT_STEREO;
432 break;
433 default:
434 return NO_INIT;
435 }
436 }
437
Glenn Kasten2799d742013-05-30 14:33:29 -0700438 sp<AudioTrack> t;
Chih-Chung Chang99698662011-06-30 14:21:38 +0800439 if (mCallback != NULL) {
440 t = new AudioTrack(
441 mStreamType,
442 sampleRate,
443 format,
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800444 channelMask,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800445 frameCount,
Eric Laurent1948eb32012-04-13 16:50:19 -0700446 flags,
Chih-Chung Chang99698662011-06-30 14:21:38 +0800447 CallbackWrapper,
448 this);
449 } else {
450 t = new AudioTrack(
451 mStreamType,
452 sampleRate,
453 format,
Jean-Michel Trivi8162c1a2012-03-02 14:34:10 -0800454 channelMask,
Eric Laurent1948eb32012-04-13 16:50:19 -0700455 frameCount,
456 flags);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800457 }
458
459 if ((t == 0) || (t->initCheck() != NO_ERROR)) {
Steve Blockf8bd29c2012-01-08 10:14:44 +0000460 ALOGE("Unable to create audio track");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800461 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
Richard Fitzgeraldd89532e2013-05-14 13:18:21 +0100472status_t VideoEditorPlayer::VeAudioOutput::start() {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800473
Steve Block2703f232011-10-20 11:56:09 +0100474 ALOGV("start");
Glenn Kasten2799d742013-05-30 14:33:29 -0700475 if (mTrack != 0) {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800476 mTrack->setVolume(mLeftVolume, mRightVolume);
Richard Fitzgeraldd89532e2013-05-14 13:18:21 +0100477 status_t status = mTrack->start();
478 if (status == NO_ERROR) {
479 mTrack->getPosition(&mNumFramesWritten);
480 }
481 return status;
Chih-Chung Chang99698662011-06-30 14:21:38 +0800482 }
Richard Fitzgeraldd89532e2013-05-14 13:18:21 +0100483 return NO_INIT;
Chih-Chung Chang99698662011-06-30 14:21:38 +0800484}
485
486void VideoEditorPlayer::VeAudioOutput::snoopWrite(
487 const void* buffer, size_t size) {
488 // Visualization buffers not supported
489 return;
490
491}
492
493ssize_t VideoEditorPlayer::VeAudioOutput::write(
494 const void* buffer, size_t size) {
495
496 LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback.");
497
Steve Block2703f232011-10-20 11:56:09 +0100498 //ALOGV("write(%p, %u)", buffer, size);
Glenn Kasten2799d742013-05-30 14:33:29 -0700499 if (mTrack != 0) {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800500 snoopWrite(buffer, size);
501 ssize_t ret = mTrack->write(buffer, size);
502 mNumFramesWritten += ret / 4; // assume 16 bit stereo
503 return ret;
504 }
505 return NO_INIT;
506}
507
508void VideoEditorPlayer::VeAudioOutput::stop() {
509
Steve Block2703f232011-10-20 11:56:09 +0100510 ALOGV("stop");
Glenn Kasten2799d742013-05-30 14:33:29 -0700511 if (mTrack != 0) mTrack->stop();
Chih-Chung Chang99698662011-06-30 14:21:38 +0800512}
513
514void VideoEditorPlayer::VeAudioOutput::flush() {
515
Steve Block2703f232011-10-20 11:56:09 +0100516 ALOGV("flush");
Glenn Kasten2799d742013-05-30 14:33:29 -0700517 if (mTrack != 0) mTrack->flush();
Chih-Chung Chang99698662011-06-30 14:21:38 +0800518}
519
520void VideoEditorPlayer::VeAudioOutput::pause() {
521
Steve Block2703f232011-10-20 11:56:09 +0100522 ALOGV("VeAudioOutput::pause");
Glenn Kasten2799d742013-05-30 14:33:29 -0700523 if (mTrack != 0) mTrack->pause();
Chih-Chung Chang99698662011-06-30 14:21:38 +0800524}
525
526void VideoEditorPlayer::VeAudioOutput::close() {
527
Steve Block2703f232011-10-20 11:56:09 +0100528 ALOGV("close");
Glenn Kasten2799d742013-05-30 14:33:29 -0700529 mTrack.clear();
Chih-Chung Chang99698662011-06-30 14:21:38 +0800530}
531
532void VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) {
533
Steve Block2703f232011-10-20 11:56:09 +0100534 ALOGV("setVolume(%f, %f)", left, right);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800535 mLeftVolume = left;
536 mRightVolume = right;
Glenn Kasten2799d742013-05-30 14:33:29 -0700537 if (mTrack != 0) {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800538 mTrack->setVolume(left, right);
539 }
540}
541
542// static
543void VideoEditorPlayer::VeAudioOutput::CallbackWrapper(
544 int event, void *cookie, void *info) {
Steve Block2703f232011-10-20 11:56:09 +0100545 //ALOGV("VeAudioOutput::callbackwrapper");
Chih-Chung Chang99698662011-06-30 14:21:38 +0800546 if (event != AudioTrack::EVENT_MORE_DATA) {
547 return;
548 }
549
550 VeAudioOutput *me = (VeAudioOutput *)cookie;
551 AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
552
553 size_t actualSize = (*me->mCallback)(
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000554 me, buffer->raw, buffer->size, me->mCallbackCookie,
555 MediaPlayerBase::AudioSink::CB_EVENT_FILL_BUFFER);
Chih-Chung Chang99698662011-06-30 14:21:38 +0800556
557 buffer->size = actualSize;
558
559 if (actualSize > 0) {
560 me->snoopWrite(buffer->raw, actualSize);
561 }
562}
563
564status_t VideoEditorPlayer::VeAudioOutput::dump(int fd, const Vector<String16>& args) const
565{
566 const size_t SIZE = 256;
567 char buffer[SIZE];
568 String8 result;
569
570 result.append(" VeAudioOutput\n");
571 snprintf(buffer, SIZE-1, " stream type(%d), left - right volume(%f, %f)\n",
572 mStreamType, mLeftVolume, mRightVolume);
573 result.append(buffer);
574 snprintf(buffer, SIZE-1, " msec per frame(%f), latency (%d)\n",
575 mMsecsPerFrame, mLatency);
576 result.append(buffer);
577 ::write(fd, result.string(), result.size());
578 if (mTrack != 0) {
579 mTrack->dump(fd, args);
580 }
581 return NO_ERROR;
582}
583
Marco Nelissen4110c102012-03-29 09:31:28 -0700584int VideoEditorPlayer::VeAudioOutput::getSessionId() const {
Chih-Chung Chang99698662011-06-30 14:21:38 +0800585
586 return mSessionId;
587}
588
Eric Laurent6f59db12013-07-26 17:16:50 -0700589uint32_t VideoEditorPlayer::VeAudioOutput::getSampleRate() const {
590 if (mMsecsPerFrame == 0) {
591 return 0;
592 }
593 return (uint32_t)(1.e3 / mMsecsPerFrame);
594}
595
Chih-Chung Chang99698662011-06-30 14:21:38 +0800596} // namespace android