blob: e1213f41c345e60f4fe403468a8dd20191c50ae1 [file] [log] [blame]
Andreas Hubera1587462010-12-15 15:17:42 -08001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "NuPlayerDriver"
19#include <utils/Log.h>
20
21#include "NuPlayerDriver.h"
22
23#include "NuPlayer.h"
24
Andreas Hubercbeaca72011-01-04 14:01:29 -080025#include <media/stagefright/foundation/ADebug.h>
Andreas Hubera1587462010-12-15 15:17:42 -080026#include <media/stagefright/foundation/ALooper.h>
27
28namespace android {
29
30NuPlayerDriver::NuPlayerDriver()
Andreas Hubercbeaca72011-01-04 14:01:29 -080031 : mResetInProgress(false),
Andreas Huber08e10cb2011-01-05 12:17:08 -080032 mDurationUs(-1),
33 mPositionUs(-1),
Andreas Hubercbeaca72011-01-04 14:01:29 -080034 mLooper(new ALooper),
Andreas Huber08e10cb2011-01-05 12:17:08 -080035 mState(UNINITIALIZED),
36 mStartupSeekTimeUs(-1) {
Andreas Hubera1587462010-12-15 15:17:42 -080037 mLooper->setName("NuPlayerDriver Looper");
38
39 mLooper->start(
40 false, /* runOnCallingThread */
41 true, /* canCallJava */
42 PRIORITY_AUDIO);
43
44 mPlayer = new NuPlayer;
45 mLooper->registerHandler(mPlayer);
46
Andreas Huber08e10cb2011-01-05 12:17:08 -080047 mPlayer->setDriver(this);
Andreas Hubera1587462010-12-15 15:17:42 -080048}
49
50NuPlayerDriver::~NuPlayerDriver() {
51 mLooper->stop();
52}
53
54status_t NuPlayerDriver::initCheck() {
55 return OK;
56}
57
58status_t NuPlayerDriver::setDataSource(
59 const char *url, const KeyedVector<String8, String8> *headers) {
Andreas Huber08e10cb2011-01-05 12:17:08 -080060 CHECK_EQ((int)mState, (int)UNINITIALIZED);
61
Andreas Huber54e66492010-12-23 10:27:40 -080062 mPlayer->setDataSource(url, headers);
63
Andreas Huber08e10cb2011-01-05 12:17:08 -080064 mState = STOPPED;
65
Andreas Huber54e66492010-12-23 10:27:40 -080066 return OK;
Andreas Hubera1587462010-12-15 15:17:42 -080067}
68
69status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
70 return INVALID_OPERATION;
71}
72
73status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
Andreas Huber08e10cb2011-01-05 12:17:08 -080074 CHECK_EQ((int)mState, (int)UNINITIALIZED);
75
Andreas Hubera1587462010-12-15 15:17:42 -080076 mPlayer->setDataSource(source);
77
Andreas Huber08e10cb2011-01-05 12:17:08 -080078 mState = STOPPED;
79
Andreas Hubera1587462010-12-15 15:17:42 -080080 return OK;
81}
82
83status_t NuPlayerDriver::setVideoSurface(const sp<Surface> &surface) {
84 mPlayer->setVideoSurface(surface);
85
86 return OK;
87}
88
Glenn Kastencc562a32011-02-08 17:26:17 -080089status_t NuPlayerDriver::setVideoSurfaceTexture(
90 const sp<ISurfaceTexture> &surfaceTexture) {
91 mPlayer->setVideoSurfaceTexture(surfaceTexture);
92
93 return OK;
94}
95
Andreas Hubera1587462010-12-15 15:17:42 -080096status_t NuPlayerDriver::prepare() {
97 return OK;
98}
99
100status_t NuPlayerDriver::prepareAsync() {
Andreas Huber54e66492010-12-23 10:27:40 -0800101 sendEvent(MEDIA_PREPARED);
102
Andreas Hubera1587462010-12-15 15:17:42 -0800103 return OK;
104}
105
106status_t NuPlayerDriver::start() {
Andreas Huber08e10cb2011-01-05 12:17:08 -0800107 switch (mState) {
108 case UNINITIALIZED:
109 return INVALID_OPERATION;
110 case STOPPED:
111 {
112 mPlayer->start();
113
114 if (mStartupSeekTimeUs >= 0) {
115 mPlayer->seekToAsync(mStartupSeekTimeUs);
116 mStartupSeekTimeUs = -1;
117 }
118 break;
119 }
120 case PLAYING:
121 return OK;
122 default:
123 {
124 CHECK_EQ((int)mState, (int)PAUSED);
125
126 mPlayer->resume();
127 break;
128 }
129 }
130
131 mState = PLAYING;
Andreas Hubera1587462010-12-15 15:17:42 -0800132
133 return OK;
134}
135
136status_t NuPlayerDriver::stop() {
Andreas Huber08e10cb2011-01-05 12:17:08 -0800137 return pause();
Andreas Hubera1587462010-12-15 15:17:42 -0800138}
139
140status_t NuPlayerDriver::pause() {
Andreas Huber08e10cb2011-01-05 12:17:08 -0800141 switch (mState) {
142 case UNINITIALIZED:
143 return INVALID_OPERATION;
144 case STOPPED:
145 return OK;
146 case PLAYING:
147 mPlayer->pause();
148 break;
149 default:
150 {
151 CHECK_EQ((int)mState, (int)PAUSED);
152 return OK;
153 }
154 }
155
156 mState = PAUSED;
157
Andreas Hubera1587462010-12-15 15:17:42 -0800158 return OK;
159}
160
161bool NuPlayerDriver::isPlaying() {
Andreas Huber08e10cb2011-01-05 12:17:08 -0800162 return mState == PLAYING;
Andreas Hubera1587462010-12-15 15:17:42 -0800163}
164
165status_t NuPlayerDriver::seekTo(int msec) {
Andreas Huber08e10cb2011-01-05 12:17:08 -0800166 int64_t seekTimeUs = msec * 1000ll;
167
168 switch (mState) {
169 case UNINITIALIZED:
170 return INVALID_OPERATION;
171 case STOPPED:
172 {
173 mStartupSeekTimeUs = seekTimeUs;
174 break;
175 }
176 case PLAYING:
177 case PAUSED:
178 {
179 mPlayer->seekToAsync(seekTimeUs);
180 break;
181 }
182
183 default:
184 TRESPASS();
185 break;
186 }
187
188 return OK;
Andreas Hubera1587462010-12-15 15:17:42 -0800189}
190
191status_t NuPlayerDriver::getCurrentPosition(int *msec) {
Andreas Huber08e10cb2011-01-05 12:17:08 -0800192 Mutex::Autolock autoLock(mLock);
193
194 if (mPositionUs < 0) {
195 *msec = 0;
196 } else {
197 *msec = (mPositionUs + 500ll) / 1000;
198 }
Andreas Huber54e66492010-12-23 10:27:40 -0800199
200 return OK;
Andreas Hubera1587462010-12-15 15:17:42 -0800201}
202
203status_t NuPlayerDriver::getDuration(int *msec) {
Andreas Huber08e10cb2011-01-05 12:17:08 -0800204 Mutex::Autolock autoLock(mLock);
205
206 if (mDurationUs < 0) {
207 *msec = 0;
208 } else {
209 *msec = (mDurationUs + 500ll) / 1000;
210 }
Andreas Huber54e66492010-12-23 10:27:40 -0800211
212 return OK;
Andreas Hubera1587462010-12-15 15:17:42 -0800213}
214
215status_t NuPlayerDriver::reset() {
Andreas Hubercbeaca72011-01-04 14:01:29 -0800216 Mutex::Autolock autoLock(mLock);
217 mResetInProgress = true;
218
219 mPlayer->resetAsync();
220
221 while (mResetInProgress) {
222 mCondition.wait(mLock);
223 }
224
Andreas Huber08e10cb2011-01-05 12:17:08 -0800225 mDurationUs = -1;
226 mPositionUs = -1;
227 mState = UNINITIALIZED;
228 mStartupSeekTimeUs = -1;
229
Andreas Hubera1587462010-12-15 15:17:42 -0800230 return OK;
231}
232
233status_t NuPlayerDriver::setLooping(int loop) {
234 return INVALID_OPERATION;
235}
236
237player_type NuPlayerDriver::playerType() {
238 return NU_PLAYER;
239}
240
241status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
242 return INVALID_OPERATION;
243}
244
245void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
246 mPlayer->setAudioSink(audioSink);
247}
248
Gloria Wangd01ec6e2011-04-25 17:28:22 -0700249status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
250 return INVALID_OPERATION;
251}
252
253status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
254 return INVALID_OPERATION;
255}
256
Andreas Hubera1587462010-12-15 15:17:42 -0800257status_t NuPlayerDriver::getMetadata(
258 const media::Metadata::Filter& ids, Parcel *records) {
259 return INVALID_OPERATION;
260}
261
Andreas Huber08e10cb2011-01-05 12:17:08 -0800262void NuPlayerDriver::notifyResetComplete() {
Andreas Hubercbeaca72011-01-04 14:01:29 -0800263 Mutex::Autolock autoLock(mLock);
264 CHECK(mResetInProgress);
265 mResetInProgress = false;
266 mCondition.broadcast();
267}
268
Andreas Huber08e10cb2011-01-05 12:17:08 -0800269void NuPlayerDriver::notifyDuration(int64_t durationUs) {
270 Mutex::Autolock autoLock(mLock);
271 mDurationUs = durationUs;
272}
273
274void NuPlayerDriver::notifyPosition(int64_t positionUs) {
275 Mutex::Autolock autoLock(mLock);
276 mPositionUs = positionUs;
277}
278
279void NuPlayerDriver::notifySeekComplete() {
280 sendEvent(MEDIA_SEEK_COMPLETE);
281}
282
Andreas Hubera1587462010-12-15 15:17:42 -0800283} // namespace android