1efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang/*
2efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
3efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *
4efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
5efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * you may not use this file except in compliance with the License.
6efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * You may obtain a copy of the License at
7efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *
8efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
9efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *
10efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Unless required by applicable law or agreed to in writing, software
11efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
12efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * See the License for the specific language governing permissions and
14efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * limitations under the License.
15efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang */
16efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
17efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_NDEBUG 1
18efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_TAG "VideoEditorPlayer"
19efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <utils/Log.h>
20efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
21efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include "VideoEditorPlayer.h"
22efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include "PreviewPlayer.h"
23efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
24efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <media/Metadata.h>
25efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <media/stagefright/MediaExtractor.h>
26c2f16b11f136bdde9d9950d34eab7633a35d157cDima Zavin
2799adfaa2e9ae69179129e2b53fe763eea476b1e2Dima Zavin#include <system/audio.h>
28efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
29efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changnamespace android {
30efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
319133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung ChangVideoEditorPlayer::VideoEditorPlayer(NativeWindowRenderer* renderer)
329133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang    : mPlayer(new PreviewPlayer(renderer)) {
33efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
34efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("VideoEditorPlayer");
35efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer->setListener(this);
36efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
37efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
38efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPlayer::~VideoEditorPlayer() {
39efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("~VideoEditorPlayer");
40efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
41efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    reset();
42efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mVeAudioSink.clear();
43efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
44efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    delete mPlayer;
45efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer = NULL;
46efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
47efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
48efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::initCheck() {
49efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("initCheck");
50efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return OK;
51efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
52efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
53efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
54efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setAudioPlayer(VideoEditorAudioPlayer *audioPlayer) {
55efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setAudioPlayer(audioPlayer);
56efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
57efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
58efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
59efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setDataSource(
60efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        const char *url, const KeyedVector<String8, String8> *headers) {
61efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGI("setDataSource('%s')", url);
62efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
63efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setDataSource(url, headers);
64efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
65efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
66efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang//We donot use this in preview, dummy implimentation as this is pure virtual
67efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setDataSource(int fd, int64_t offset,
68efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    int64_t length) {
69efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length);
70efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return (!OK);
71efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
72efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
73efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setVideoSurface(const sp<Surface> &surface) {
74efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setVideoSurface");
75efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
76efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer->setSurface(surface);
77efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return OK;
78efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
79efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
80efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
81efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setVideoSurfaceTexture");
82efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
83efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer->setSurfaceTexture(surfaceTexture);
84efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return OK;
85efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
86efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
87efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::prepare() {
88efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("prepare");
89efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->prepare();
90efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
91efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
92efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::prepareAsync() {
93efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->prepareAsync();
94efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
95efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
96efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::start() {
97efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("start");
98efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->play();
99efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
100efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
101efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::stop() {
102efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("stop");
103efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return pause();
104efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
105efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
106efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::pause() {
107efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("pause");
108efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->pause();
109efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
110efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
111efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changbool VideoEditorPlayer::isPlaying() {
112efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("isPlaying");
113efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->isPlaying();
114efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
115efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
116efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::seekTo(int msec) {
117efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("seekTo");
118efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
119efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return err;
120efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
121efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
122efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getCurrentPosition(int *msec) {
123efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("getCurrentPosition");
124efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    int64_t positionUs;
125efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    status_t err = mPlayer->getPosition(&positionUs);
126efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
127efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (err != OK) {
128efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        return err;
129efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
130efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
131efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    *msec = (positionUs + 500) / 1000;
132efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return OK;
133efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
134efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
135efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getDuration(int *msec) {
136efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("getDuration");
137efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
138efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    int64_t durationUs;
139efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    status_t err = mPlayer->getDuration(&durationUs);
140efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
141efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (err != OK) {
142efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        *msec = 0;
143efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        return OK;
144efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
145efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
146efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    *msec = (durationUs + 500) / 1000;
147efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return OK;
148efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
149efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
150efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::reset() {
151efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("reset");
152efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer->reset();
153efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return OK;
154efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
155efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
156efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setLooping(int loop) {
157efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setLooping");
158efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setLooping(loop);
159efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
160efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1618d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wangstatus_t VideoEditorPlayer::setParameter(int key, const Parcel &request) {
1628d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang    LOGV("setParameter");
1638d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang    return mPlayer->setParameter(key, request);
1648d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang}
1658d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang
1668d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wangstatus_t VideoEditorPlayer::getParameter(int key, Parcel *reply) {
1678d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang    LOGV("getParameter");
1688d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang    return mPlayer->getParameter(key, reply);
1698d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang}
1708d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang
171efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changplayer_type VideoEditorPlayer::playerType() {
172efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("playerType");
173efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return STAGEFRIGHT_PLAYER;
174efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
175efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1762d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Pallavoid VideoEditorPlayer::acquireLock() {
1772d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla    LOGV("acquireLock");
1782d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla    mPlayer->acquireLock();
1792d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla}
180efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
181efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::releaseLock() {
182efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("releaseLock");
183efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer->releaseLock();
184efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
185efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
186efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::invoke(const Parcel &request, Parcel *reply) {
187efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return INVALID_OPERATION;
188efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
189efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
190efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
191efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    MediaPlayerInterface::setAudioSink(audioSink);
192efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
193efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer->setAudioSink(audioSink);
194efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
195efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
196efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getMetadata(
197efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        const media::Metadata::Filter& ids, Parcel *records) {
198efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    using media::Metadata;
199efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
200efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    uint32_t flags = mPlayer->flags();
201efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
202efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    Metadata metadata(records);
203efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
204efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    metadata.appendBool(
205efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            Metadata::kPauseAvailable,
206efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            flags & MediaExtractor::CAN_PAUSE);
207efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
208efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    metadata.appendBool(
209efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            Metadata::kSeekBackwardAvailable,
210efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            flags & MediaExtractor::CAN_SEEK_BACKWARD);
211efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
212efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    metadata.appendBool(
213efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            Metadata::kSeekForwardAvailable,
214efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            flags & MediaExtractor::CAN_SEEK_FORWARD);
215efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
216efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    metadata.appendBool(
217efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            Metadata::kSeekAvailable,
218efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            flags & MediaExtractor::CAN_SEEK);
219efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
220efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return OK;
221efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
222efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
223efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::loadEffectsSettings(
224efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) {
225efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("loadEffectsSettings");
226efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->loadEffectsSettings(pEffectSettings, nEffects);
227efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
228efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
229efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::loadAudioMixSettings(
230efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4xVSS_AudioMixingSettings* pAudioMixSettings) {
231efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("VideoEditorPlayer: loadAudioMixSettings");
232efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->loadAudioMixSettings(pAudioMixSettings);
233efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
234efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
235efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setAudioMixPCMFileHandle(
236efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_Context pAudioMixPCMFileHandle) {
237efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
238efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("VideoEditorPlayer: loadAudioMixSettings");
239efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setAudioMixPCMFileHandle(pAudioMixPCMFileHandle);
240efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
241efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
242efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setAudioMixStoryBoardParam(
243efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 audioMixStoryBoardTS,
244efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 currentMediaBeginCutTime,
245efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 primaryTrackVolValue) {
246efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
247efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("VideoEditorPlayer: loadAudioMixSettings");
248efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setAudioMixStoryBoardParam(audioMixStoryBoardTS,
249efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang     currentMediaBeginCutTime, primaryTrackVolValue);
250efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
251efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
252efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setPlaybackBeginTime(uint32_t msec) {
253efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setPlaybackBeginTime");
254efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setPlaybackBeginTime(msec);
255efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
256efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
257efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setPlaybackEndTime(uint32_t msec) {
258efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setPlaybackEndTime");
259efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setPlaybackEndTime(msec);
260efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
261efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
262efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setStoryboardStartTime(uint32_t msec) {
263efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setStoryboardStartTime");
264efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setStoryboardStartTime(msec);
265efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
266efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
267efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setProgressCallbackInterval(uint32_t cbInterval) {
268efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setProgressCallbackInterval");
269efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setProgressCallbackInterval(cbInterval);
270efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
271efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
272efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setMediaRenderingMode(
273efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4xVSS_MediaRendering mode,
274efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
275efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
276efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setMediaRenderingMode");
277efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setMediaRenderingMode(mode, outputVideoSize);
278efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
279efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
280efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::resetJniCallbackTimeStamp() {
281efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("resetJniCallbackTimeStamp");
282efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->resetJniCallbackTimeStamp();
283efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
284efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
285efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setImageClipProperties(
286efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    uint32_t width, uint32_t height) {
287efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->setImageClipProperties(width, height);
288efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
289efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
290efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::readFirstVideoFrame() {
291efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mPlayer->readFirstVideoFrame();
292efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
293efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
294efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) {
295efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mPlayer->getLastRenderedTimeMs(lastRenderedTimeMs);
296efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return NO_ERROR;
297efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
298efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
299efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang/* Implementation of AudioSink interface */
300efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#undef LOG_TAG
301efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_TAG "VeAudioSink"
302efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
303efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changint VideoEditorPlayer::VeAudioOutput::mMinBufferCount = 4;
304efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changbool VideoEditorPlayer::VeAudioOutput::mIsOnEmulator = false;
305efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
306efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPlayer::VeAudioOutput::VeAudioOutput()
307efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    : mCallback(NULL),
308efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang      mCallbackCookie(NULL) {
309efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mTrack = 0;
310efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mStreamType = AUDIO_STREAM_MUSIC;
311efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mLeftVolume = 1.0;
312efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mRightVolume = 1.0;
313efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mLatency = 0;
314efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mMsecsPerFrame = 0;
315efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mNumFramesWritten = 0;
316efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    setMinBufferCount();
317efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
318efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
319efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPlayer::VeAudioOutput::~VeAudioOutput() {
320efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    close();
321efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
322efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
323efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setMinBufferCount() {
324efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
325efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mIsOnEmulator = false;
326efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mMinBufferCount = 4;
327efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
328efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
329efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changbool VideoEditorPlayer::VeAudioOutput::isOnEmulator() {
330efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
331efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    setMinBufferCount();
332efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mIsOnEmulator;
333efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
334efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
335efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changint VideoEditorPlayer::VeAudioOutput::getMinBufferCount() {
336efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
337efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    setMinBufferCount();
338efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mMinBufferCount;
339efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
340efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
341efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::bufferSize() const {
342efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
343efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack == 0) return NO_INIT;
344efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mTrack->frameCount() * frameSize();
345efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
346efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
347efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameCount() const {
348efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
349efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack == 0) return NO_INIT;
350efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mTrack->frameCount();
351efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
352efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
353efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::channelCount() const
354efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{
355efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack == 0) return NO_INIT;
356efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mTrack->channelCount();
357efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
358efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
359efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameSize() const
360efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{
361efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack == 0) return NO_INIT;
362efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mTrack->frameSize();
363efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
364efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
365efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changuint32_t VideoEditorPlayer::VeAudioOutput::latency () const
366efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{
367efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mLatency;
368efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
369efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
370efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changfloat VideoEditorPlayer::VeAudioOutput::msecsPerFrame() const
371efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{
372efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mMsecsPerFrame;
373efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
374efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
375efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::getPosition(uint32_t *position) {
376efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
377efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack == 0) return NO_INIT;
378efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mTrack->getPosition(position);
379efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
380efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
381efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::open(
382efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        uint32_t sampleRate, int channelCount, int format, int bufferCount,
383efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        AudioCallback cb, void *cookie) {
384efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
385efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mCallback = cb;
386efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mCallbackCookie = cookie;
387efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
388efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    // Check argument "bufferCount" against the mininum buffer count
389efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (bufferCount < mMinBufferCount) {
390efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        LOGV("bufferCount (%d) is too small and increased to %d",
391efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            bufferCount, mMinBufferCount);
392efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        bufferCount = mMinBufferCount;
393efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
394efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
395efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
396efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack) close();
397efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    int afSampleRate;
398efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    int afFrameCount;
399efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    int frameCount;
400efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
401efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) !=
402efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang     NO_ERROR) {
403efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        return NO_INIT;
404efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
405efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) !=
406efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang     NO_ERROR) {
407efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        return NO_INIT;
408efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
409efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
410efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate;
411efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
412efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    AudioTrack *t;
413efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mCallback != NULL) {
414efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        t = new AudioTrack(
415efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                mStreamType,
416efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                sampleRate,
417efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                format,
418efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                (channelCount == 2) ?
419efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                 AUDIO_CHANNEL_OUT_STEREO : AUDIO_CHANNEL_OUT_MONO,
420efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                frameCount,
421efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                0 /* flags */,
422efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                CallbackWrapper,
423efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                this);
424efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    } else {
425efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        t = new AudioTrack(
426efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                mStreamType,
427efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                sampleRate,
428efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                format,
429efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                (channelCount == 2) ?
430efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                 AUDIO_CHANNEL_OUT_STEREO : AUDIO_CHANNEL_OUT_MONO,
431efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                frameCount);
432efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
433efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
434efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if ((t == 0) || (t->initCheck() != NO_ERROR)) {
435efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        LOGE("Unable to create audio track");
436efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        delete t;
437efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        return NO_INIT;
438efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
439efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
440efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setVolume");
441efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    t->setVolume(mLeftVolume, mRightVolume);
442efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mMsecsPerFrame = 1.e3 / (float) sampleRate;
443efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mLatency = t->latency();
444efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mTrack = t;
445efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return NO_ERROR;
446efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
447efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
448efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::start() {
449efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
450efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("start");
451efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack) {
452efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        mTrack->setVolume(mLeftVolume, mRightVolume);
453efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        mTrack->start();
454efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        mTrack->getPosition(&mNumFramesWritten);
455efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
456efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
457efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
458efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::snoopWrite(
459efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    const void* buffer, size_t size) {
460efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    // Visualization buffers not supported
461efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return;
462efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
463efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
464efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
465efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::write(
466efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang     const void* buffer, size_t size) {
467efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
468efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback.");
469efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
470efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    //LOGV("write(%p, %u)", buffer, size);
471efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack) {
472efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        snoopWrite(buffer, size);
473efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        ssize_t ret = mTrack->write(buffer, size);
474efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        mNumFramesWritten += ret / 4; // assume 16 bit stereo
475efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        return ret;
476efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
477efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return NO_INIT;
478efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
479efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
480efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::stop() {
481efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
482efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("stop");
483efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack) mTrack->stop();
484efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
485efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
486efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::flush() {
487efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
488efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("flush");
489efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack) mTrack->flush();
490efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
491efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
492efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::pause() {
493efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
494efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("VeAudioOutput::pause");
495efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack) mTrack->pause();
496efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
497efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
498efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::close() {
499efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
500efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("close");
501efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    delete mTrack;
502efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mTrack = 0;
503efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
504efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
505efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) {
506efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
507efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setVolume(%f, %f)", left, right);
508efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mLeftVolume = left;
509efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mRightVolume = right;
510efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack) {
511efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        mTrack->setVolume(left, right);
512efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
513efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
514efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
515efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang// static
516efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::CallbackWrapper(
517efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int event, void *cookie, void *info) {
518efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    //LOGV("VeAudioOutput::callbackwrapper");
519efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (event != AudioTrack::EVENT_MORE_DATA) {
520efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        return;
521efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
522efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
523efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    VeAudioOutput *me = (VeAudioOutput *)cookie;
524efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
525efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
526efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    size_t actualSize = (*me->mCallback)(
527efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            me, buffer->raw, buffer->size, me->mCallbackCookie);
528efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
529efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    buffer->size = actualSize;
530efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
531efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (actualSize > 0) {
532efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        me->snoopWrite(buffer->raw, actualSize);
533efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
534efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
535efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
536efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::dump(int fd, const Vector<String16>& args) const
537efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{
538efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    const size_t SIZE = 256;
539efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    char buffer[SIZE];
540efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    String8 result;
541efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
542efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    result.append(" VeAudioOutput\n");
543efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    snprintf(buffer, SIZE-1, "  stream type(%d), left - right volume(%f, %f)\n",
544efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            mStreamType, mLeftVolume, mRightVolume);
545efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    result.append(buffer);
546efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    snprintf(buffer, SIZE-1, "  msec per frame(%f), latency (%d)\n",
547efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            mMsecsPerFrame, mLatency);
548efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    result.append(buffer);
549efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    ::write(fd, result.string(), result.size());
550efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if (mTrack != 0) {
551efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        mTrack->dump(fd, args);
552efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
553efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return NO_ERROR;
554efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
555efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
556efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changint VideoEditorPlayer::VeAudioOutput::getSessionId() {
557efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
558efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return mSessionId;
559efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
560efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
561efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}  // namespace android
562