blob: 7cd8b6cc7f5545b01de277c20cf63069464ea964 [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) {
121 mPlayer->seekToAsync(mStartupSeekTimeUs);
122 mStartupSeekTimeUs = -1;
123 }
124 break;
125 }
126 case PLAYING:
127 return OK;
128 default:
129 {
130 CHECK_EQ((int)mState, (int)PAUSED);
131
132 mPlayer->resume();
133 break;
134 }
135 }
136
137 mState = PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800138
139 return OK;
140}
141
142status_t NuPlayerDriver::stop() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800143 return pause();
Andreas Huberf9334412010-12-15 15:17:42 -0800144}
145
146status_t NuPlayerDriver::pause() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800147 switch (mState) {
148 case UNINITIALIZED:
149 return INVALID_OPERATION;
150 case STOPPED:
151 return OK;
152 case PLAYING:
153 mPlayer->pause();
154 break;
155 default:
156 {
157 CHECK_EQ((int)mState, (int)PAUSED);
158 return OK;
159 }
160 }
161
162 mState = PAUSED;
163
Andreas Huberf9334412010-12-15 15:17:42 -0800164 return OK;
165}
166
167bool NuPlayerDriver::isPlaying() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800168 return mState == PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800169}
170
171status_t NuPlayerDriver::seekTo(int msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800172 int64_t seekTimeUs = msec * 1000ll;
173
174 switch (mState) {
175 case UNINITIALIZED:
176 return INVALID_OPERATION;
177 case STOPPED:
178 {
179 mStartupSeekTimeUs = seekTimeUs;
180 break;
181 }
182 case PLAYING:
183 case PAUSED:
184 {
185 mPlayer->seekToAsync(seekTimeUs);
186 break;
187 }
188
189 default:
190 TRESPASS();
191 break;
192 }
193
194 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800195}
196
197status_t NuPlayerDriver::getCurrentPosition(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800198 Mutex::Autolock autoLock(mLock);
199
200 if (mPositionUs < 0) {
201 *msec = 0;
202 } else {
203 *msec = (mPositionUs + 500ll) / 1000;
204 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800205
206 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800207}
208
209status_t NuPlayerDriver::getDuration(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800210 Mutex::Autolock autoLock(mLock);
211
212 if (mDurationUs < 0) {
213 *msec = 0;
214 } else {
215 *msec = (mDurationUs + 500ll) / 1000;
216 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800217
218 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800219}
220
221status_t NuPlayerDriver::reset() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800222 Mutex::Autolock autoLock(mLock);
223 mResetInProgress = true;
224
225 mPlayer->resetAsync();
226
227 while (mResetInProgress) {
228 mCondition.wait(mLock);
229 }
230
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800231 mDurationUs = -1;
232 mPositionUs = -1;
233 mState = UNINITIALIZED;
234 mStartupSeekTimeUs = -1;
235
Andreas Huberf9334412010-12-15 15:17:42 -0800236 return OK;
237}
238
239status_t NuPlayerDriver::setLooping(int loop) {
240 return INVALID_OPERATION;
241}
242
243player_type NuPlayerDriver::playerType() {
244 return NU_PLAYER;
245}
246
247status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
248 return INVALID_OPERATION;
249}
250
251void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
252 mPlayer->setAudioSink(audioSink);
253}
254
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700255status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
256 return INVALID_OPERATION;
257}
258
259status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
260 return INVALID_OPERATION;
261}
262
Andreas Huberf9334412010-12-15 15:17:42 -0800263status_t NuPlayerDriver::getMetadata(
264 const media::Metadata::Filter& ids, Parcel *records) {
265 return INVALID_OPERATION;
266}
267
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800268void NuPlayerDriver::notifyResetComplete() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800269 Mutex::Autolock autoLock(mLock);
270 CHECK(mResetInProgress);
271 mResetInProgress = false;
272 mCondition.broadcast();
273}
274
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800275void NuPlayerDriver::notifyDuration(int64_t durationUs) {
276 Mutex::Autolock autoLock(mLock);
277 mDurationUs = durationUs;
278}
279
280void NuPlayerDriver::notifyPosition(int64_t positionUs) {
281 Mutex::Autolock autoLock(mLock);
282 mPositionUs = positionUs;
283}
284
285void NuPlayerDriver::notifySeekComplete() {
286 sendEvent(MEDIA_SEEK_COMPLETE);
287}
288
Andreas Huberf9334412010-12-15 15:17:42 -0800289} // namespace android