19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*
29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License.
69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at
79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and
149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License.
159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */
169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_NDEBUG 1
189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_TAG "VideoEditorPlayer"
199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <utils/Log.h>
209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorPlayer.h"
229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "PreviewPlayer.h"
239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/Metadata.h>
259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaExtractor.h>
266859837b0bdea82be855ab50bd69c5ac9b62acf2Dima Zavin
27272eb55a3855d8455bc0a12e5359d51f4010332aDima Zavin#include <system/audio.h>
289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android {
309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung ChangVideoEditorPlayer::VideoEditorPlayer(NativeWindowRenderer* renderer)
3243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    : mPlayer(new PreviewPlayer(renderer)) {
339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
342703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorPlayer");
359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer->setListener(this);
369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPlayer::~VideoEditorPlayer() {
392703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("~VideoEditorPlayer");
409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    reset();
429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mVeAudioSink.clear();
439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    delete mPlayer;
459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer = NULL;
469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::initCheck() {
492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("initCheck");
509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return OK;
519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setAudioPlayer(VideoEditorAudioPlayer *audioPlayer) {
559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setAudioPlayer(audioPlayer);
569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setDataSource(
609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        const char *url, const KeyedVector<String8, String8> *headers) {
61ec9e663f697df4254dacc79f52cdb633179c92abSteve Block    ALOGI("setDataSource('%s')", url);
62daeb5b33861147fda0096f9c794be6f341d884c2James Dong    if (headers != NULL) {
63daeb5b33861147fda0096f9c794be6f341d884c2James Dong        ALOGE("Headers parameter is not supported");
64daeb5b33861147fda0096f9c794be6f341d884c2James Dong        return INVALID_OPERATION;
65daeb5b33861147fda0096f9c794be6f341d884c2James Dong    }
669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
67daeb5b33861147fda0096f9c794be6f341d884c2James Dong    return mPlayer->setDataSource(url);
689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang//We donot use this in preview, dummy implimentation as this is pure virtual
719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setDataSource(int fd, int64_t offset,
729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t length) {
73f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block    ALOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length);
749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return (!OK);
759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setVideoSurface(const sp<Surface> &surface) {
782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setVideoSurface");
799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer->setSurface(surface);
819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return OK;
829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setVideoSurfaceTexture");
869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer->setSurfaceTexture(surfaceTexture);
889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return OK;
899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::prepare() {
922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("prepare");
939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->prepare();
949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::prepareAsync() {
979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->prepareAsync();
989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::start() {
1012703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("start");
1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->play();
1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::stop() {
1062703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("stop");
1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return pause();
1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::pause() {
1112703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("pause");
1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->pause();
1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changbool VideoEditorPlayer::isPlaying() {
1162703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("isPlaying");
1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->isPlaying();
1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::seekTo(int msec) {
1212703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("seekTo");
1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return err;
1249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getCurrentPosition(int *msec) {
1272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("getCurrentPosition");
1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t positionUs;
1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    status_t err = mPlayer->getPosition(&positionUs);
1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (err != OK) {
1329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return err;
1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    *msec = (positionUs + 500) / 1000;
1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return OK;
1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getDuration(int *msec) {
1402703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("getDuration");
1419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t durationUs;
1439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    status_t err = mPlayer->getDuration(&durationUs);
1449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (err != OK) {
1469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        *msec = 0;
1479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return OK;
1489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    *msec = (durationUs + 500) / 1000;
1519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return OK;
1529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::reset() {
1552703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("reset");
1569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer->reset();
1579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return OK;
1589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setLooping(int loop) {
1612703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setLooping");
1629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setLooping(loop);
1639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
165acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wangstatus_t VideoEditorPlayer::setParameter(int key, const Parcel &request) {
166daeb5b33861147fda0096f9c794be6f341d884c2James Dong    ALOGE("setParameter not implemented");
167daeb5b33861147fda0096f9c794be6f341d884c2James Dong    return INVALID_OPERATION;
168acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang}
169acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang
170acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wangstatus_t VideoEditorPlayer::getParameter(int key, Parcel *reply) {
171daeb5b33861147fda0096f9c794be6f341d884c2James Dong    ALOGE("getParameter not implemented");
172daeb5b33861147fda0096f9c794be6f341d884c2James Dong    return INVALID_OPERATION;
173acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang}
174acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang
1759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changplayer_type VideoEditorPlayer::playerType() {
1762703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("playerType");
1779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return STAGEFRIGHT_PLAYER;
1789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
180fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid VideoEditorPlayer::acquireLock() {
1812703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("acquireLock");
182fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    mPlayer->acquireLock();
183fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla}
1849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::releaseLock() {
1862703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("releaseLock");
1879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer->releaseLock();
1889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::invoke(const Parcel &request, Parcel *reply) {
1919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return INVALID_OPERATION;
1929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
1959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    MediaPlayerInterface::setAudioSink(audioSink);
1969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer->setAudioSink(audioSink);
1989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getMetadata(
2019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        const media::Metadata::Filter& ids, Parcel *records) {
2029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    using media::Metadata;
2039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
20400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    uint32_t flags = mPlayer->getSourceSeekFlags();
2059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    Metadata metadata(records);
2079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    metadata.appendBool(
2099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            Metadata::kPauseAvailable,
2109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            flags & MediaExtractor::CAN_PAUSE);
2119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    metadata.appendBool(
2139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            Metadata::kSeekBackwardAvailable,
2149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            flags & MediaExtractor::CAN_SEEK_BACKWARD);
2159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    metadata.appendBool(
2179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            Metadata::kSeekForwardAvailable,
2189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            flags & MediaExtractor::CAN_SEEK_FORWARD);
2199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    metadata.appendBool(
2219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            Metadata::kSeekAvailable,
2229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            flags & MediaExtractor::CAN_SEEK);
2239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return OK;
2259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::loadEffectsSettings(
2289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) {
2292703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("loadEffectsSettings");
2309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->loadEffectsSettings(pEffectSettings, nEffects);
2319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::loadAudioMixSettings(
2349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_AudioMixingSettings* pAudioMixSettings) {
2352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorPlayer: loadAudioMixSettings");
2369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->loadAudioMixSettings(pAudioMixSettings);
2379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setAudioMixPCMFileHandle(
2409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Context pAudioMixPCMFileHandle) {
2419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorPlayer: loadAudioMixSettings");
2439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setAudioMixPCMFileHandle(pAudioMixPCMFileHandle);
2449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setAudioMixStoryBoardParam(
2479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 audioMixStoryBoardTS,
2489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 currentMediaBeginCutTime,
2499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 primaryTrackVolValue) {
2509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2512703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorPlayer: loadAudioMixSettings");
2529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setAudioMixStoryBoardParam(audioMixStoryBoardTS,
2539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     currentMediaBeginCutTime, primaryTrackVolValue);
2549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setPlaybackBeginTime(uint32_t msec) {
2572703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setPlaybackBeginTime");
2589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setPlaybackBeginTime(msec);
2599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setPlaybackEndTime(uint32_t msec) {
2622703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setPlaybackEndTime");
2639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setPlaybackEndTime(msec);
2649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setStoryboardStartTime(uint32_t msec) {
2672703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setStoryboardStartTime");
2689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setStoryboardStartTime(msec);
2699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setProgressCallbackInterval(uint32_t cbInterval) {
2722703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setProgressCallbackInterval");
2739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setProgressCallbackInterval(cbInterval);
2749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setMediaRenderingMode(
2779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_MediaRendering mode,
2789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
2799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setMediaRenderingMode");
2819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setMediaRenderingMode(mode, outputVideoSize);
2829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::resetJniCallbackTimeStamp() {
2852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("resetJniCallbackTimeStamp");
2869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->resetJniCallbackTimeStamp();
2879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setImageClipProperties(
2909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint32_t width, uint32_t height) {
2919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->setImageClipProperties(width, height);
2929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::readFirstVideoFrame() {
2959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mPlayer->readFirstVideoFrame();
2969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) {
2999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayer->getLastRenderedTimeMs(lastRenderedTimeMs);
3009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return NO_ERROR;
3019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* Implementation of AudioSink interface */
3049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#undef LOG_TAG
3059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_TAG "VeAudioSink"
3069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changint VideoEditorPlayer::VeAudioOutput::mMinBufferCount = 4;
3089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changbool VideoEditorPlayer::VeAudioOutput::mIsOnEmulator = false;
3099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPlayer::VeAudioOutput::VeAudioOutput()
3119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    : mCallback(NULL),
3129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mCallbackCookie(NULL) {
3139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTrack = 0;
3149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mStreamType = AUDIO_STREAM_MUSIC;
3159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mLeftVolume = 1.0;
3169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mRightVolume = 1.0;
3179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mLatency = 0;
3189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mMsecsPerFrame = 0;
3199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mNumFramesWritten = 0;
3209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    setMinBufferCount();
3219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPlayer::VeAudioOutput::~VeAudioOutput() {
3249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    close();
3259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setMinBufferCount() {
3289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mIsOnEmulator = false;
3309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mMinBufferCount = 4;
3319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changbool VideoEditorPlayer::VeAudioOutput::isOnEmulator() {
3349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    setMinBufferCount();
3369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mIsOnEmulator;
3379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changint VideoEditorPlayer::VeAudioOutput::getMinBufferCount() {
3409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    setMinBufferCount();
3429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mMinBufferCount;
3439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::bufferSize() const {
3469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack == 0) return NO_INIT;
3489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mTrack->frameCount() * frameSize();
3499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameCount() const {
3529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack == 0) return NO_INIT;
3549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mTrack->frameCount();
3559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::channelCount() const
3589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{
3599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack == 0) return NO_INIT;
3609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mTrack->channelCount();
3619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameSize() const
3649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{
3659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack == 0) return NO_INIT;
3669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mTrack->frameSize();
3679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changuint32_t VideoEditorPlayer::VeAudioOutput::latency () const
3709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{
3719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mLatency;
3729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changfloat VideoEditorPlayer::VeAudioOutput::msecsPerFrame() const
3759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{
3769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mMsecsPerFrame;
3779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3794110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t VideoEditorPlayer::VeAudioOutput::getPosition(uint32_t *position) const {
3809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack == 0) return NO_INIT;
3829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mTrack->getPosition(position);
3839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
3849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3854110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t VideoEditorPlayer::VeAudioOutput::getFramesWritten(uint32_t *written) const {
3864110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen
3874110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen    if (mTrack == 0) return NO_INIT;
3884110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen    *written = mNumFramesWritten;
3894110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen    return OK;
3904110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen}
3914110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen
3929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::open(
3938162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi        uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
3948162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi        audio_format_t format, int bufferCount,
3951948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent        AudioCallback cb, void *cookie, audio_output_flags_t flags) {
3969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mCallback = cb;
3989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mCallbackCookie = cookie;
3999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Check argument "bufferCount" against the mininum buffer count
4019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (bufferCount < mMinBufferCount) {
4022703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("bufferCount (%d) is too small and increased to %d",
4039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            bufferCount, mMinBufferCount);
4049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        bufferCount = mMinBufferCount;
4059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4072703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
4089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack) close();
4099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int afSampleRate;
4109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int afFrameCount;
4119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int frameCount;
4129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) !=
4149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     NO_ERROR) {
4159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return NO_INIT;
4169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) !=
4189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     NO_ERROR) {
4199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return NO_INIT;
4209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate;
4239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4248162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi    if (channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER) {
4258162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi        switch(channelCount) {
4268162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi          case 1:
4278162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi            channelMask = AUDIO_CHANNEL_OUT_MONO;
4288162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi            break;
4298162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi          case 2:
4308162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi            channelMask = AUDIO_CHANNEL_OUT_STEREO;
4318162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi            break;
4328162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi          default:
4338162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi            return NO_INIT;
4348162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi        }
4358162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi    }
4368162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi
4379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    AudioTrack *t;
4389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mCallback != NULL) {
4399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        t = new AudioTrack(
4409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mStreamType,
4419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                sampleRate,
4429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                format,
4438162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi                channelMask,
4449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                frameCount,
4451948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                flags,
4469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                CallbackWrapper,
4479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                this);
4489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else {
4499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        t = new AudioTrack(
4509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mStreamType,
4519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                sampleRate,
4529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                format,
4538162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi                channelMask,
4541948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                frameCount,
4551948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                flags);
4569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if ((t == 0) || (t->initCheck() != NO_ERROR)) {
459f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("Unable to create audio track");
4609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        delete t;
4619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return NO_INIT;
4629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setVolume");
4659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    t->setVolume(mLeftVolume, mRightVolume);
4669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mMsecsPerFrame = 1.e3 / (float) sampleRate;
4679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mLatency = t->latency();
4689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTrack = t;
4699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return NO_ERROR;
4709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
4719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::start() {
4739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4742703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("start");
4759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack) {
4769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTrack->setVolume(mLeftVolume, mRightVolume);
4779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTrack->start();
4789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTrack->getPosition(&mNumFramesWritten);
4799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
4819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::snoopWrite(
4839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    const void* buffer, size_t size) {
4849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Visualization buffers not supported
4859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return;
4869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
4889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::write(
4909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     const void* buffer, size_t size) {
4919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback.");
4939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    //ALOGV("write(%p, %u)", buffer, size);
4959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack) {
4969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        snoopWrite(buffer, size);
4979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        ssize_t ret = mTrack->write(buffer, size);
4989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mNumFramesWritten += ret / 4; // assume 16 bit stereo
4999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return ret;
5009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return NO_INIT;
5029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::stop() {
5059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5062703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("stop");
5079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack) mTrack->stop();
5089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::flush() {
5119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("flush");
5139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack) mTrack->flush();
5149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::pause() {
5179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5182703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VeAudioOutput::pause");
5199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack) mTrack->pause();
5209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::close() {
5239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5242703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("close");
5259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    delete mTrack;
5269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTrack = 0;
5279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) {
5309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5312703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setVolume(%f, %f)", left, right);
5329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mLeftVolume = left;
5339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mRightVolume = right;
5349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack) {
5359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTrack->setVolume(left, right);
5369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// static
5409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::CallbackWrapper(
5419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        int event, void *cookie, void *info) {
5422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    //ALOGV("VeAudioOutput::callbackwrapper");
5439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (event != AudioTrack::EVENT_MORE_DATA) {
5449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return;
5459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VeAudioOutput *me = (VeAudioOutput *)cookie;
5489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
5499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    size_t actualSize = (*me->mCallback)(
5519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            me, buffer->raw, buffer->size, me->mCallbackCookie);
5529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    buffer->size = actualSize;
5549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (actualSize > 0) {
5569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        me->snoopWrite(buffer->raw, actualSize);
5579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::dump(int fd, const Vector<String16>& args) const
5619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{
5629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    const size_t SIZE = 256;
5639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    char buffer[SIZE];
5649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    String8 result;
5659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    result.append(" VeAudioOutput\n");
5679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    snprintf(buffer, SIZE-1, "  stream type(%d), left - right volume(%f, %f)\n",
5689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mStreamType, mLeftVolume, mRightVolume);
5699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    result.append(buffer);
5709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    snprintf(buffer, SIZE-1, "  msec per frame(%f), latency (%d)\n",
5719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mMsecsPerFrame, mLatency);
5729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    result.append(buffer);
5739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    ::write(fd, result.string(), result.size());
5749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mTrack != 0) {
5759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTrack->dump(fd, args);
5769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return NO_ERROR;
5789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5804110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenint VideoEditorPlayer::VeAudioOutput::getSessionId() const {
5819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return mSessionId;
5839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
5849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}  // namespace android
586