NuPlayerDriver.cpp revision 9b80c2bdb205bc143104f54d0743b6eedd67b14e
1/*
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
25#include <media/stagefright/foundation/ADebug.h>
26#include <media/stagefright/foundation/ALooper.h>
27
28namespace android {
29
30NuPlayerDriver::NuPlayerDriver()
31    : mResetInProgress(false),
32      mDurationUs(-1),
33      mPositionUs(-1),
34      mLooper(new ALooper),
35      mState(UNINITIALIZED),
36      mStartupSeekTimeUs(-1) {
37    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
47    mPlayer->setDriver(this);
48}
49
50NuPlayerDriver::~NuPlayerDriver() {
51    mLooper->stop();
52}
53
54status_t NuPlayerDriver::initCheck() {
55    return OK;
56}
57
58status_t NuPlayerDriver::setUID(uid_t uid) {
59    mPlayer->setUID(uid);
60
61    return OK;
62}
63
64status_t NuPlayerDriver::setDataSource(
65        const char *url, const KeyedVector<String8, String8> *headers) {
66    CHECK_EQ((int)mState, (int)UNINITIALIZED);
67
68    mPlayer->setDataSource(url, headers);
69
70    mState = STOPPED;
71
72    return OK;
73}
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) {
80    CHECK_EQ((int)mState, (int)UNINITIALIZED);
81
82    mPlayer->setDataSource(source);
83
84    mState = STOPPED;
85
86    return OK;
87}
88
89status_t NuPlayerDriver::setVideoSurface(const sp<Surface> &surface) {
90    mPlayer->setVideoSurface(surface);
91
92    return OK;
93}
94
95status_t NuPlayerDriver::setVideoSurfaceTexture(
96        const sp<ISurfaceTexture> &surfaceTexture) {
97    mPlayer->setVideoSurfaceTexture(surfaceTexture);
98
99    return OK;
100}
101
102status_t NuPlayerDriver::prepare() {
103    return OK;
104}
105
106status_t NuPlayerDriver::prepareAsync() {
107    sendEvent(MEDIA_PREPARED);
108
109    return OK;
110}
111
112status_t NuPlayerDriver::start() {
113    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;
138
139    return OK;
140}
141
142status_t NuPlayerDriver::stop() {
143    return pause();
144}
145
146status_t NuPlayerDriver::pause() {
147    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
164    return OK;
165}
166
167bool NuPlayerDriver::isPlaying() {
168    return mState == PLAYING;
169}
170
171status_t NuPlayerDriver::seekTo(int msec) {
172    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;
195}
196
197status_t NuPlayerDriver::getCurrentPosition(int *msec) {
198    Mutex::Autolock autoLock(mLock);
199
200    if (mPositionUs < 0) {
201        *msec = 0;
202    } else {
203        *msec = (mPositionUs + 500ll) / 1000;
204    }
205
206    return OK;
207}
208
209status_t NuPlayerDriver::getDuration(int *msec) {
210    Mutex::Autolock autoLock(mLock);
211
212    if (mDurationUs < 0) {
213        *msec = 0;
214    } else {
215        *msec = (mDurationUs + 500ll) / 1000;
216    }
217
218    return OK;
219}
220
221status_t NuPlayerDriver::reset() {
222    Mutex::Autolock autoLock(mLock);
223    mResetInProgress = true;
224
225    mPlayer->resetAsync();
226
227    while (mResetInProgress) {
228        mCondition.wait(mLock);
229    }
230
231    mDurationUs = -1;
232    mPositionUs = -1;
233    mState = UNINITIALIZED;
234    mStartupSeekTimeUs = -1;
235
236    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
255status_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
263status_t NuPlayerDriver::getMetadata(
264        const media::Metadata::Filter& ids, Parcel *records) {
265    return INVALID_OPERATION;
266}
267
268void NuPlayerDriver::notifyResetComplete() {
269    Mutex::Autolock autoLock(mLock);
270    CHECK(mResetInProgress);
271    mResetInProgress = false;
272    mCondition.broadcast();
273}
274
275void 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
289}  // namespace android
290