107ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi/* 2e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 307ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * 407ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 507ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * you may not use this file except in compliance with the License. 607ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * You may obtain a copy of the License at 707ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * 807ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 907ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * 1007ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1107ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1207ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1307ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * See the License for the specific language governing permissions and 1407ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi * limitations under the License. 1507ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi */ 1607ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 17d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#ifndef __ANDROID_GENERICMEDIAPLAYER_H__ 18d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#define __ANDROID_GENERICMEDIAPLAYER_H__ 1907ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 20c6941c3f417cc80983f2a4d84688bf3a15af0ac0Jean-Michel Trivi#include "android_GenericPlayer.h" 218ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi 2207ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi#include <binder/IServiceManager.h> 2313a07de046bce3663b905a892dbaf770a54d982dGlenn Kasten#include <surfaceflinger/Surface.h> 2413a07de046bce3663b905a892dbaf770a54d982dGlenn Kasten#include <gui/ISurfaceTexture.h> 2507ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 2607ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 2707ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2807ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivinamespace android { 2907ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 30fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Triviclass GenericMediaPlayer; 3107ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Triviclass MediaPlayerNotificationClient : public BnMediaPlayerClient 3207ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi{ 3307ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivipublic: 34fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi MediaPlayerNotificationClient(GenericMediaPlayer* gmp); 3507ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 3607ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi // IMediaPlayerClient implementation 37cd422d88f508397adf8f6b492a82f0d9baee5b88Gloria Wang virtual void notify(int msg, int ext1, int ext2, const Parcel *obj); 3807ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 39e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten // Call before enqueuing a prepare event 40e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten void beforePrepare(); 41e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten 42e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten // Call after enqueueing the prepare event; returns true if the prepare 43e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten // completed successfully, or false if it completed unsuccessfully 44e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten bool blockUntilPlayerPrepared(); 4507ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 4642d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kastenprotected: 4742d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten virtual ~MediaPlayerNotificationClient(); 4842d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten 4907ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Triviprivate: 5051627b879ac8c1ef34028801d9d6b697f362c405Glenn Kasten const wp<GenericMediaPlayer> mGenericMediaPlayer; 5151627b879ac8c1ef34028801d9d6b697f362c405Glenn Kasten Mutex mLock; // protects mPlayerPrepared 5251627b879ac8c1ef34028801d9d6b697f362c405Glenn Kasten Condition mPlayerPreparedCondition; // signalled when mPlayerPrepared is changed 53e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten enum { 54e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten PREPARE_NOT_STARTED, 55e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten PREPARE_IN_PROGRESS, 56e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten PREPARE_COMPLETED_SUCCESSFULLY, 57e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten PREPARE_COMPLETED_UNSUCCESSFULLY 58e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten } mPlayerPrepared; 5907ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi}; 6007ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 61e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi 6242d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kastenclass MediaPlayerDeathNotifier : public IMediaDeathNotifier { 6342d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kastenpublic: 6442d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten MediaPlayerDeathNotifier(const sp<MediaPlayerNotificationClient> playerClient) : 6542d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten mPlayerClient(playerClient) { 6642d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten } 6742d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten 6842d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten void died() { 6942d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten mPlayerClient->notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, 0, NULL); 7042d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten } 7142d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten 7242d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kastenprotected: 7342d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten virtual ~MediaPlayerDeathNotifier() { } 7442d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten 7542d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kastenprivate: 7642d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten const sp<MediaPlayerNotificationClient> mPlayerClient; 7742d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten}; 7842d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten 7942d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten 8007ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 81e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Triviclass GenericMediaPlayer : public GenericPlayer 8207ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi{ 8307ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivipublic: 8427a8821eb36f002b81f368a0049f511cfa465d16Jean-Michel Trivi 85e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo); 86e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi virtual ~GenericMediaPlayer(); 8707ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 881b3d049fdaa0dfb601e5b7f482e04e84d38d2f93Jean-Michel Trivi virtual void preDestroy(); 891b3d049fdaa0dfb601e5b7f482e04e84d38d2f93Jean-Michel Trivi 901b3d049fdaa0dfb601e5b7f482e04e84d38d2f93Jean-Michel Trivi // overridden from GenericPlayer 911b3d049fdaa0dfb601e5b7f482e04e84d38d2f93Jean-Michel Trivi virtual void getPositionMsec(int* msec); // ANDROID_UNKNOWN_TIME if unknown 921b3d049fdaa0dfb601e5b7f482e04e84d38d2f93Jean-Michel Trivi 9313a07de046bce3663b905a892dbaf770a54d982dGlenn Kasten virtual void setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture); 9407ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 9507ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Triviprotected: 96fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi friend class MediaPlayerNotificationClient; 9707ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 98e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi // Async event handlers (called from GenericPlayer's event loop) 9927a8821eb36f002b81f368a0049f511cfa465d16Jean-Michel Trivi virtual void onPrepare(); 10027a8821eb36f002b81f368a0049f511cfa465d16Jean-Michel Trivi virtual void onPlay(); 10127a8821eb36f002b81f368a0049f511cfa465d16Jean-Michel Trivi virtual void onPause(); 1028ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi virtual void onSeek(const sp<AMessage> &msg); 1038ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi virtual void onLoop(const sp<AMessage> &msg); 1040b02ad8c6715ac9d8526e4229a6030ef436704bcGlenn Kasten virtual void onSeekComplete(); 105fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi virtual void onVolumeUpdate(); 1068ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi virtual void onBufferingUpdate(const sp<AMessage> &msg); 10741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten virtual void onAttachAuxEffect(const sp<AMessage> &msg); 10841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg); 10927a8821eb36f002b81f368a0049f511cfa465d16Jean-Michel Trivi 11051627b879ac8c1ef34028801d9d6b697f362c405Glenn Kasten const bool mHasVideo; // const allows MediaPlayerNotificationClient::notify to safely access 111f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi int32_t mSeekTimeMsec; 11227a8821eb36f002b81f368a0049f511cfa465d16Jean-Michel Trivi 11313a07de046bce3663b905a892dbaf770a54d982dGlenn Kasten sp<ISurfaceTexture> mVideoSurfaceTexture; 11407ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 1153adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten // only safe to access from within Realize and looper 11607ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi sp<IMediaPlayer> mPlayer; 11727a8821eb36f002b81f368a0049f511cfa465d16Jean-Michel Trivi // Receives Android MediaPlayer events from mPlayer 11851627b879ac8c1ef34028801d9d6b697f362c405Glenn Kasten const sp<MediaPlayerNotificationClient> mPlayerClient; 11907ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 12042d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten // Receives notifications about death of media.player service 12142d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten const sp<MediaPlayerDeathNotifier> mPlayerDeathNotifier; 12242d2daefb2508a4f8f05ce8fe4c6b7da9f3d896dGlenn Kasten 1236bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten // Return a reference to the media player service, or LOGE and return NULL after retries fail 1246bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten static const sp<IMediaPlayerService> getMediaPlayerService() { 1256bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten return IMediaDeathNotifier::getMediaPlayerService(); 1266bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten } 1278ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi 128e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Triviprivate: 129e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi DISALLOW_EVIL_CONSTRUCTORS(GenericMediaPlayer); 130f037e5965c0a0e6a918344753dc59bf4e8149d10Glenn Kasten void afterMediaPlayerPreparedSuccessfully(); 131a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten 1323adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kastenprotected: // FIXME temporary 1333adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten Mutex mPreparedPlayerLock; // protects mPreparedPlayer 1343adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten sp<IMediaPlayer> mPreparedPlayer; // non-NULL if MediaPlayer exists and prepared, write once 1353adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kastenprivate: 1363adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten void getPreparedPlayer(sp<IMediaPlayer> &preparedPlayer); // safely read mPreparedPlayer 137a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten 13807ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi}; 13907ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi 14007ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi} // namespace android 141d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi 142d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten// is the specified URI a known distant protocol? 143d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kastenbool isDistantProtocol(const char *uri); 144d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten 145d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#endif /* __ANDROID_GENERICMEDIAPLAYER_H__ */ 146