blob: c6fca2c0aff01b4a0ffadd49974557274db660f4 [file] [log] [blame]
Andreas Huberf9334412010-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 Huber1aef2112011-01-04 14:01:29 -080025#include <media/stagefright/foundation/ADebug.h>
Andreas Huberf9334412010-12-15 15:17:42 -080026#include <media/stagefright/foundation/ALooper.h>
27
28namespace android {
29
30NuPlayerDriver::NuPlayerDriver()
Andreas Huber1aef2112011-01-04 14:01:29 -080031 : mResetInProgress(false),
Andreas Huber43c3e6c2011-01-05 12:17:08 -080032 mDurationUs(-1),
33 mPositionUs(-1),
Andreas Huber1aef2112011-01-04 14:01:29 -080034 mLooper(new ALooper),
Andreas Huber43c3e6c2011-01-05 12:17:08 -080035 mState(UNINITIALIZED),
36 mStartupSeekTimeUs(-1) {
Andreas Huberf9334412010-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 Huber43c3e6c2011-01-05 12:17:08 -080047 mPlayer->setDriver(this);
Andreas Huberf9334412010-12-15 15:17:42 -080048}
49
50NuPlayerDriver::~NuPlayerDriver() {
51 mLooper->stop();
52}
53
54status_t NuPlayerDriver::initCheck() {
55 return OK;
56}
57
Andreas Huber9b80c2b2011-06-30 15:47:02 -070058status_t NuPlayerDriver::setUID(uid_t uid) {
59 mPlayer->setUID(uid);
60
61 return OK;
62}
63
Andreas Huberf9334412010-12-15 15:17:42 -080064status_t NuPlayerDriver::setDataSource(
65 const char *url, const KeyedVector<String8, String8> *headers) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -080066 CHECK_EQ((int)mState, (int)UNINITIALIZED);
67
Andreas Huber5bc087c2010-12-23 10:27:40 -080068 mPlayer->setDataSource(url, headers);
69
Andreas Huber43c3e6c2011-01-05 12:17:08 -080070 mState = STOPPED;
71
Andreas Huber5bc087c2010-12-23 10:27:40 -080072 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -080073}
74
75status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
76 return INVALID_OPERATION;
77}
78
79status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -080080 CHECK_EQ((int)mState, (int)UNINITIALIZED);
81
Andreas Huberf9334412010-12-15 15:17:42 -080082 mPlayer->setDataSource(source);
83
Andreas Huber43c3e6c2011-01-05 12:17:08 -080084 mState = STOPPED;
85
Andreas Huberf9334412010-12-15 15:17:42 -080086 return OK;
87}
88
89status_t NuPlayerDriver::setVideoSurface(const sp<Surface> &surface) {
90 mPlayer->setVideoSurface(surface);
91
92 return OK;
93}
94
Glenn Kasten11731182011-02-08 17:26:17 -080095status_t NuPlayerDriver::setVideoSurfaceTexture(
96 const sp<ISurfaceTexture> &surfaceTexture) {
97 mPlayer->setVideoSurfaceTexture(surfaceTexture);
98
99 return OK;
100}
101
Andreas Huberf9334412010-12-15 15:17:42 -0800102status_t NuPlayerDriver::prepare() {
103 return OK;
104}
105
106status_t NuPlayerDriver::prepareAsync() {
Andreas Huber5bc087c2010-12-23 10:27:40 -0800107 sendEvent(MEDIA_PREPARED);
108
Andreas Huberf9334412010-12-15 15:17:42 -0800109 return OK;
110}
111
112status_t NuPlayerDriver::start() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800113 switch (mState) {
114 case UNINITIALIZED:
115 return INVALID_OPERATION;
116 case STOPPED:
117 {
118 mPlayer->start();
119
120 if (mStartupSeekTimeUs >= 0) {
Andreas Huber2048d0c2011-07-15 16:25:41 -0700121 if (mStartupSeekTimeUs == 0) {
122 notifySeekComplete();
123 } else {
124 mPlayer->seekToAsync(mStartupSeekTimeUs);
125 }
126
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800127 mStartupSeekTimeUs = -1;
128 }
Andreas Huber2048d0c2011-07-15 16:25:41 -0700129
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800130 break;
131 }
132 case PLAYING:
133 return OK;
134 default:
135 {
136 CHECK_EQ((int)mState, (int)PAUSED);
137
138 mPlayer->resume();
139 break;
140 }
141 }
142
143 mState = PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800144
145 return OK;
146}
147
148status_t NuPlayerDriver::stop() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800149 return pause();
Andreas Huberf9334412010-12-15 15:17:42 -0800150}
151
152status_t NuPlayerDriver::pause() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800153 switch (mState) {
154 case UNINITIALIZED:
155 return INVALID_OPERATION;
156 case STOPPED:
157 return OK;
158 case PLAYING:
159 mPlayer->pause();
160 break;
161 default:
162 {
163 CHECK_EQ((int)mState, (int)PAUSED);
164 return OK;
165 }
166 }
167
168 mState = PAUSED;
169
Andreas Huberf9334412010-12-15 15:17:42 -0800170 return OK;
171}
172
173bool NuPlayerDriver::isPlaying() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800174 return mState == PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800175}
176
177status_t NuPlayerDriver::seekTo(int msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800178 int64_t seekTimeUs = msec * 1000ll;
179
180 switch (mState) {
181 case UNINITIALIZED:
182 return INVALID_OPERATION;
183 case STOPPED:
184 {
185 mStartupSeekTimeUs = seekTimeUs;
186 break;
187 }
188 case PLAYING:
189 case PAUSED:
190 {
191 mPlayer->seekToAsync(seekTimeUs);
192 break;
193 }
194
195 default:
196 TRESPASS();
197 break;
198 }
199
200 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800201}
202
203status_t NuPlayerDriver::getCurrentPosition(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800204 Mutex::Autolock autoLock(mLock);
205
206 if (mPositionUs < 0) {
207 *msec = 0;
208 } else {
209 *msec = (mPositionUs + 500ll) / 1000;
210 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800211
212 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800213}
214
215status_t NuPlayerDriver::getDuration(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800216 Mutex::Autolock autoLock(mLock);
217
218 if (mDurationUs < 0) {
219 *msec = 0;
220 } else {
221 *msec = (mDurationUs + 500ll) / 1000;
222 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800223
224 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800225}
226
227status_t NuPlayerDriver::reset() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800228 Mutex::Autolock autoLock(mLock);
229 mResetInProgress = true;
230
231 mPlayer->resetAsync();
232
233 while (mResetInProgress) {
234 mCondition.wait(mLock);
235 }
236
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800237 mDurationUs = -1;
238 mPositionUs = -1;
239 mState = UNINITIALIZED;
240 mStartupSeekTimeUs = -1;
241
Andreas Huberf9334412010-12-15 15:17:42 -0800242 return OK;
243}
244
245status_t NuPlayerDriver::setLooping(int loop) {
246 return INVALID_OPERATION;
247}
248
249player_type NuPlayerDriver::playerType() {
250 return NU_PLAYER;
251}
252
253status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
254 return INVALID_OPERATION;
255}
256
257void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
258 mPlayer->setAudioSink(audioSink);
259}
260
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700261status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
262 return INVALID_OPERATION;
263}
264
265status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
266 return INVALID_OPERATION;
267}
268
Andreas Huberf9334412010-12-15 15:17:42 -0800269status_t NuPlayerDriver::getMetadata(
270 const media::Metadata::Filter& ids, Parcel *records) {
271 return INVALID_OPERATION;
272}
273
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800274void NuPlayerDriver::notifyResetComplete() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800275 Mutex::Autolock autoLock(mLock);
276 CHECK(mResetInProgress);
277 mResetInProgress = false;
278 mCondition.broadcast();
279}
280
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800281void NuPlayerDriver::notifyDuration(int64_t durationUs) {
282 Mutex::Autolock autoLock(mLock);
283 mDurationUs = durationUs;
284}
285
286void NuPlayerDriver::notifyPosition(int64_t positionUs) {
287 Mutex::Autolock autoLock(mLock);
288 mPositionUs = positionUs;
289}
290
291void NuPlayerDriver::notifySeekComplete() {
292 sendEvent(MEDIA_SEEK_COMPLETE);
293}
294
Andreas Huberf9334412010-12-15 15:17:42 -0800295} // namespace android