1 /* 2 ** 3 ** Copyright 2008, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #ifndef _PLAYERDRIVER_H 19 #define _PLAYERDRIVER_H 20 21 #include <cstring> 22 #include <surfaceflinger/ISurface.h> 23 #include <utils/Errors.h> // for android::status_t 24 #include <utils/RefBase.h> // for android::sp 25 #include <media/MediaPlayerInterface.h> 26 27 typedef void (*media_completion_f)(android::status_t status, void *cookie, bool cancelled); 28 29 // Commands that MediaPlayer sends to the PlayerDriver 30 // TODO: Move this class and subclass in their own .h 31 // TODO: Write a class comment. 32 class PlayerCommand 33 { 34 public: 35 // TODO: Explain these codes. 36 enum Code { 37 // Stops the scheduler. Does not free any resources in the player. 38 PLAYER_QUIT = 1, 39 // Load the player capabilities. 40 PLAYER_SETUP = 2, 41 // Reset must be called before set data source. 42 PLAYER_SET_DATA_SOURCE = 3, 43 // TODO: Rename to PLAYER_SET_VIDEO_SINK. 44 PLAYER_SET_VIDEO_SURFACE = 4, 45 PLAYER_SET_AUDIO_SINK = 5, 46 // Must be called after a data source has been set or modified. 47 PLAYER_INIT = 6, 48 // PLAYER_PREPARE must be called after the source(s) and sink(s) have 49 // been set or after a PLAYER_STOP command. 50 PLAYER_PREPARE = 7, 51 PLAYER_START = 8, 52 // After a PLAYER_STOP you must issue a PLAYER_PREPARE to replay the 53 // same source/sink combination. 54 PLAYER_STOP = 9, 55 PLAYER_PAUSE = 10, 56 // Discard the sinks. Does not cancel all pending and running 57 // commands. Does not remove the data source. 58 PLAYER_RESET = 11, 59 // TODO: What is that? Loop on the data source? 60 PLAYER_SET_LOOP = 12, 61 // TODO: When can this happen? in prepared started and pause? 62 PLAYER_SEEK = 13, 63 // TODO: When can this happend? in prepared started and pause? 64 PLAYER_GET_POSITION = 14, 65 PLAYER_GET_DURATION = 15, 66 // TODO: Can this command be issued anytime? 67 PLAYER_GET_STATUS = 16, 68 // TODO: How is that different from reset? Does it leave the sink 69 // untouched? 70 PLAYER_REMOVE_DATA_SOURCE = 17, 71 // TODO: clarify the scope of PLAYER_CANCEL_ALL_COMMANDS, does it work 72 // for asynchronous commands only or for synchronous as well? 73 PLAYER_CANCEL_ALL_COMMANDS = 18, 74 PLAYER_CHECK_LIVE_STREAMING = 19, 75 }; 76 77 virtual ~PlayerCommand() {} 78 Code code() const { return mCode; } 79 media_completion_f callback() { return mCallback; } 80 void* cookie() { return mCookie; } 81 82 // If no callback was supplied, the command runs in synchronous mode. 83 bool hasCallback() const { return NULL != mCallback; } 84 void complete(android::status_t status, bool cancelled) { mCallback(status, mCookie, cancelled); } 85 void set(media_completion_f cbf, void* cookie) { mCallback = cbf; mCookie = cookie; } 86 87 // @return the command code as a string. 88 const char* toString() const; 89 protected: 90 PlayerCommand(Code code, media_completion_f cbf, void* cookie) : 91 mCode(code), mCallback(cbf), mCookie(cookie) {} 92 private: 93 PlayerCommand(); 94 Code mCode; 95 media_completion_f mCallback; 96 void* mCookie; 97 }; 98 99 class PlayerQuit : public PlayerCommand 100 { 101 public: 102 PlayerQuit(media_completion_f cbf, void* cookie) : 103 PlayerCommand(PLAYER_QUIT, cbf, cookie) {} 104 private: 105 PlayerQuit(); 106 }; 107 108 class PlayerSetup : public PlayerCommand 109 { 110 public: 111 PlayerSetup(media_completion_f cbf, void* cookie) : 112 PlayerCommand(PLAYER_SETUP, cbf, cookie) {} 113 private: 114 PlayerSetup(); 115 }; 116 117 class PlayerInit : public PlayerCommand 118 { 119 public: 120 PlayerInit(media_completion_f cbf, void* cookie) : 121 PlayerCommand(PLAYER_INIT, cbf, cookie) {} 122 private: 123 PlayerInit(); 124 }; 125 126 class PlayerPrepare: public PlayerCommand 127 { 128 public: 129 PlayerPrepare(media_completion_f cbf, void* cookie) : 130 PlayerCommand(PLAYER_PREPARE, cbf, cookie) {} 131 private: 132 PlayerPrepare(); 133 }; 134 135 class PlayerStart: public PlayerCommand 136 { 137 public: 138 PlayerStart(media_completion_f cbf, void* cookie) : 139 PlayerCommand(PLAYER_START, cbf, cookie) {} 140 private: 141 PlayerStart(); 142 }; 143 144 class PlayerStop: public PlayerCommand 145 { 146 public: 147 PlayerStop(media_completion_f cbf, void* cookie) : 148 PlayerCommand(PLAYER_STOP, cbf, cookie) {} 149 private: 150 PlayerStop(); 151 }; 152 153 class PlayerPause: public PlayerCommand 154 { 155 public: 156 PlayerPause(media_completion_f cbf, void* cookie) : 157 PlayerCommand(PLAYER_PAUSE, cbf, cookie) {} 158 private: 159 PlayerPause(); 160 }; 161 162 class PlayerReset: public PlayerCommand 163 { 164 public: 165 PlayerReset(media_completion_f cbf, void* cookie) : 166 PlayerCommand(PLAYER_RESET, cbf, cookie) {} 167 private: 168 PlayerReset(); 169 }; 170 171 class PlayerSetDataSource : public PlayerCommand 172 { 173 public: 174 PlayerSetDataSource(const char* url, media_completion_f cbf, void* cookie) : 175 PlayerCommand(PLAYER_SET_DATA_SOURCE, cbf, cookie), mUrl(0) { 176 if (url) mUrl = strdup(url); } 177 ~PlayerSetDataSource() { if (mUrl) free(mUrl); } 178 const char* url() const { return mUrl; } 179 private: 180 PlayerSetDataSource(); 181 char* mUrl; 182 }; 183 184 class PlayerSetVideoSurface : public PlayerCommand 185 { 186 public: 187 PlayerSetVideoSurface(const android::sp<android::ISurface>& surface, media_completion_f cbf, void* cookie) : 188 PlayerCommand(PLAYER_SET_VIDEO_SURFACE, cbf, cookie), mSurface(surface) {} 189 ~PlayerSetVideoSurface() { mSurface.clear(); } 190 android::sp<android::ISurface> surface() const { return mSurface; } 191 private: 192 PlayerSetVideoSurface(); 193 android::sp<android::ISurface> mSurface; 194 }; 195 196 class PlayerSetAudioSink : public PlayerCommand 197 { 198 public: 199 PlayerSetAudioSink(const android::sp<android::MediaPlayerInterface::AudioSink>& audioSink, 200 media_completion_f cbf, void* cookie) : 201 PlayerCommand(PLAYER_SET_AUDIO_SINK, cbf, cookie), mAudioSink(audioSink) {} 202 ~PlayerSetAudioSink() { mAudioSink.clear(); } 203 android::sp<android::MediaPlayerInterface::AudioSink> audioSink() { return mAudioSink; } 204 private: 205 PlayerSetAudioSink(); 206 android::sp<android::MediaPlayerInterface::AudioSink> mAudioSink; 207 }; 208 209 class PlayerSetLoop: public PlayerCommand 210 { 211 public: 212 PlayerSetLoop(int loop, media_completion_f cbf, void* cookie) : 213 PlayerCommand(PLAYER_SET_LOOP, cbf, cookie), mLoop(loop) {} 214 int loop() { return mLoop; } 215 private: 216 PlayerSetLoop(); 217 int mLoop; 218 }; 219 220 class PlayerSeek : public PlayerCommand 221 { 222 public: 223 PlayerSeek(int msec, media_completion_f cbf, void* cookie) : 224 PlayerCommand(PLAYER_SEEK, cbf, cookie), mMsec(msec) {} 225 int msec() { return mMsec; } 226 private: 227 PlayerSeek(); 228 int mMsec; 229 }; 230 231 class PlayerGetPosition: public PlayerCommand 232 { 233 public: 234 PlayerGetPosition(int* msec, media_completion_f cbf, void* cookie) : 235 PlayerCommand(PLAYER_GET_POSITION, cbf, cookie), mMsec(msec) {} 236 void set(int msecs) { if (mMsec) *mMsec = msecs; } 237 private: 238 PlayerGetPosition(); 239 int* mMsec; 240 }; 241 242 class PlayerGetDuration: public PlayerCommand 243 { 244 public: 245 PlayerGetDuration(int* msec, media_completion_f cbf, void* cookie) : 246 PlayerCommand(PLAYER_GET_DURATION, cbf, cookie), mMsec(msec) {} 247 void set(int msecs) { if (mMsec) *mMsec = msecs; } 248 private: 249 PlayerGetDuration(); 250 int* mMsec; 251 }; 252 253 class PlayerCheckLiveStreaming: public PlayerCommand 254 { 255 public: 256 PlayerCheckLiveStreaming(media_completion_f cbf, void* cookie) : 257 PlayerCommand(PLAYER_CHECK_LIVE_STREAMING, cbf, cookie) {} 258 private: 259 PlayerCheckLiveStreaming(); 260 }; 261 262 class PlayerGetStatus: public PlayerCommand 263 { 264 public: 265 PlayerGetStatus(int *status, media_completion_f cbf, void* cookie) : 266 PlayerCommand(PLAYER_GET_STATUS, cbf, cookie), mStatus(status) {} 267 void set(int status) { *mStatus = status; } 268 private: 269 PlayerGetStatus(); 270 int* mStatus; 271 }; 272 273 class PlayerRemoveDataSource: public PlayerCommand 274 { 275 public: 276 PlayerRemoveDataSource(media_completion_f cbf, void* cookie) : 277 PlayerCommand(PLAYER_REMOVE_DATA_SOURCE, cbf, cookie) {} 278 private: 279 PlayerRemoveDataSource(); 280 }; 281 282 class PlayerCancelAllCommands: public PlayerCommand 283 { 284 public: 285 PlayerCancelAllCommands(media_completion_f cbf, void* cookie) : 286 PlayerCommand(PLAYER_CANCEL_ALL_COMMANDS, cbf, cookie) {} 287 private: 288 PlayerCancelAllCommands(); 289 }; 290 291 292 #endif // _PLAYERDRIVER_H 293