NuPlayerDriver.cpp revision 1aef211b4e5dc952081727bfd2318b2cb5ca4506
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      mLooper(new ALooper),
33      mPlayer(false) {
34    mLooper->setName("NuPlayerDriver Looper");
35
36    mLooper->start(
37            false, /* runOnCallingThread */
38            true,  /* canCallJava */
39            PRIORITY_AUDIO);
40
41    mPlayer = new NuPlayer;
42    mLooper->registerHandler(mPlayer);
43
44    mPlayer->setListener(this);
45}
46
47NuPlayerDriver::~NuPlayerDriver() {
48    mLooper->stop();
49}
50
51status_t NuPlayerDriver::initCheck() {
52    return OK;
53}
54
55status_t NuPlayerDriver::setDataSource(
56        const char *url, const KeyedVector<String8, String8> *headers) {
57    mPlayer->setDataSource(url, headers);
58
59    return OK;
60}
61
62status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
63    return INVALID_OPERATION;
64}
65
66status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
67    mPlayer->setDataSource(source);
68
69    return OK;
70}
71
72status_t NuPlayerDriver::setVideoSurface(const sp<Surface> &surface) {
73    mPlayer->setVideoSurface(surface);
74
75    return OK;
76}
77
78status_t NuPlayerDriver::prepare() {
79    return OK;
80}
81
82status_t NuPlayerDriver::prepareAsync() {
83    sendEvent(MEDIA_PREPARED);
84
85    return OK;
86}
87
88status_t NuPlayerDriver::start() {
89    mPlayer->start();
90    mPlaying = true;
91
92    return OK;
93}
94
95status_t NuPlayerDriver::stop() {
96    mPlaying = false;
97    return OK;
98}
99
100status_t NuPlayerDriver::pause() {
101    mPlaying = false;
102    return OK;
103}
104
105bool NuPlayerDriver::isPlaying() {
106    return mPlaying;
107}
108
109status_t NuPlayerDriver::seekTo(int msec) {
110    return INVALID_OPERATION;
111}
112
113status_t NuPlayerDriver::getCurrentPosition(int *msec) {
114    *msec = 0;
115
116    return OK;
117}
118
119status_t NuPlayerDriver::getDuration(int *msec) {
120    *msec = 0;
121
122    return OK;
123}
124
125status_t NuPlayerDriver::reset() {
126    Mutex::Autolock autoLock(mLock);
127    mResetInProgress = true;
128
129    mPlayer->resetAsync();
130
131    while (mResetInProgress) {
132        mCondition.wait(mLock);
133    }
134
135    return OK;
136}
137
138status_t NuPlayerDriver::setLooping(int loop) {
139    return INVALID_OPERATION;
140}
141
142player_type NuPlayerDriver::playerType() {
143    return NU_PLAYER;
144}
145
146status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
147    return INVALID_OPERATION;
148}
149
150void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
151    mPlayer->setAudioSink(audioSink);
152}
153
154status_t NuPlayerDriver::getMetadata(
155        const media::Metadata::Filter& ids, Parcel *records) {
156    return INVALID_OPERATION;
157}
158
159void NuPlayerDriver::sendEvent(int msg, int ext1, int ext2) {
160    if (msg != MEDIA_RESET_COMPLETE) {
161        MediaPlayerInterface::sendEvent(msg, ext1, ext2);
162        return;
163    }
164
165    Mutex::Autolock autoLock(mLock);
166    CHECK(mResetInProgress);
167    mResetInProgress = false;
168    mCondition.broadcast();
169}
170
171}  // namespace android
172