1*bebae9c0SAndroid Build Coastguard Worker /* 2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project 3*bebae9c0SAndroid Build Coastguard Worker * 4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*bebae9c0SAndroid Build Coastguard Worker * 8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*bebae9c0SAndroid Build Coastguard Worker * 10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License. 15*bebae9c0SAndroid Build Coastguard Worker */ 16*bebae9c0SAndroid Build Coastguard Worker 17*bebae9c0SAndroid Build Coastguard Worker #ifndef __ANDROID_GENERICMEDIAPLAYER_H__ 18*bebae9c0SAndroid Build Coastguard Worker #define __ANDROID_GENERICMEDIAPLAYER_H__ 19*bebae9c0SAndroid Build Coastguard Worker 20*bebae9c0SAndroid Build Coastguard Worker #include "android_GenericPlayer.h" 21*bebae9c0SAndroid Build Coastguard Worker 22*bebae9c0SAndroid Build Coastguard Worker #include <binder/IServiceManager.h> 23*bebae9c0SAndroid Build Coastguard Worker #include <gui/IGraphicBufferProducer.h> 24*bebae9c0SAndroid Build Coastguard Worker 25*bebae9c0SAndroid Build Coastguard Worker 26*bebae9c0SAndroid Build Coastguard Worker //-------------------------------------------------------------------------------------------------- 27*bebae9c0SAndroid Build Coastguard Worker namespace android { 28*bebae9c0SAndroid Build Coastguard Worker 29*bebae9c0SAndroid Build Coastguard Worker class GenericMediaPlayer; 30*bebae9c0SAndroid Build Coastguard Worker class MediaPlayerNotificationClient : public BnMediaPlayerClient 31*bebae9c0SAndroid Build Coastguard Worker { 32*bebae9c0SAndroid Build Coastguard Worker public: 33*bebae9c0SAndroid Build Coastguard Worker explicit MediaPlayerNotificationClient(GenericMediaPlayer* gmp); 34*bebae9c0SAndroid Build Coastguard Worker 35*bebae9c0SAndroid Build Coastguard Worker // IMediaPlayerClient implementation 36*bebae9c0SAndroid Build Coastguard Worker virtual void notify(int msg, int ext1, int ext2, const Parcel *obj); 37*bebae9c0SAndroid Build Coastguard Worker 38*bebae9c0SAndroid Build Coastguard Worker // Call before enqueuing a prepare event 39*bebae9c0SAndroid Build Coastguard Worker void beforePrepare(); 40*bebae9c0SAndroid Build Coastguard Worker 41*bebae9c0SAndroid Build Coastguard Worker // Call after enqueueing the prepare event; returns true if the prepare 42*bebae9c0SAndroid Build Coastguard Worker // completed successfully, or false if it completed unsuccessfully 43*bebae9c0SAndroid Build Coastguard Worker bool blockUntilPlayerPrepared(); 44*bebae9c0SAndroid Build Coastguard Worker 45*bebae9c0SAndroid Build Coastguard Worker protected: 46*bebae9c0SAndroid Build Coastguard Worker virtual ~MediaPlayerNotificationClient(); 47*bebae9c0SAndroid Build Coastguard Worker 48*bebae9c0SAndroid Build Coastguard Worker private: 49*bebae9c0SAndroid Build Coastguard Worker const wp<GenericMediaPlayer> mGenericMediaPlayer; 50*bebae9c0SAndroid Build Coastguard Worker Mutex mLock; // protects mPlayerPrepared 51*bebae9c0SAndroid Build Coastguard Worker Condition mPlayerPreparedCondition; // signalled when mPlayerPrepared is changed 52*bebae9c0SAndroid Build Coastguard Worker enum { 53*bebae9c0SAndroid Build Coastguard Worker PREPARE_NOT_STARTED, 54*bebae9c0SAndroid Build Coastguard Worker PREPARE_IN_PROGRESS, 55*bebae9c0SAndroid Build Coastguard Worker PREPARE_COMPLETED_SUCCESSFULLY, 56*bebae9c0SAndroid Build Coastguard Worker PREPARE_COMPLETED_UNSUCCESSFULLY 57*bebae9c0SAndroid Build Coastguard Worker } mPlayerPrepared; 58*bebae9c0SAndroid Build Coastguard Worker }; 59*bebae9c0SAndroid Build Coastguard Worker 60*bebae9c0SAndroid Build Coastguard Worker 61*bebae9c0SAndroid Build Coastguard Worker class MediaPlayerDeathNotifier : public IMediaDeathNotifier { 62*bebae9c0SAndroid Build Coastguard Worker public: MediaPlayerDeathNotifier(const sp<MediaPlayerNotificationClient> & playerClient)63*bebae9c0SAndroid Build Coastguard Worker explicit MediaPlayerDeathNotifier(const sp<MediaPlayerNotificationClient>& playerClient) : 64*bebae9c0SAndroid Build Coastguard Worker mPlayerClient(playerClient) { 65*bebae9c0SAndroid Build Coastguard Worker } 66*bebae9c0SAndroid Build Coastguard Worker died()67*bebae9c0SAndroid Build Coastguard Worker void died() { 68*bebae9c0SAndroid Build Coastguard Worker mPlayerClient->notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, 0, NULL); 69*bebae9c0SAndroid Build Coastguard Worker } 70*bebae9c0SAndroid Build Coastguard Worker 71*bebae9c0SAndroid Build Coastguard Worker protected: ~MediaPlayerDeathNotifier()72*bebae9c0SAndroid Build Coastguard Worker virtual ~MediaPlayerDeathNotifier() { } 73*bebae9c0SAndroid Build Coastguard Worker 74*bebae9c0SAndroid Build Coastguard Worker private: 75*bebae9c0SAndroid Build Coastguard Worker const sp<MediaPlayerNotificationClient> mPlayerClient; 76*bebae9c0SAndroid Build Coastguard Worker }; 77*bebae9c0SAndroid Build Coastguard Worker 78*bebae9c0SAndroid Build Coastguard Worker 79*bebae9c0SAndroid Build Coastguard Worker //-------------------------------------------------------------------------------------------------- 80*bebae9c0SAndroid Build Coastguard Worker class GenericMediaPlayer : public GenericPlayer 81*bebae9c0SAndroid Build Coastguard Worker { 82*bebae9c0SAndroid Build Coastguard Worker public: 83*bebae9c0SAndroid Build Coastguard Worker 84*bebae9c0SAndroid Build Coastguard Worker GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo); 85*bebae9c0SAndroid Build Coastguard Worker virtual ~GenericMediaPlayer(); 86*bebae9c0SAndroid Build Coastguard Worker 87*bebae9c0SAndroid Build Coastguard Worker virtual void preDestroy(); 88*bebae9c0SAndroid Build Coastguard Worker 89*bebae9c0SAndroid Build Coastguard Worker // overridden from GenericPlayer 90*bebae9c0SAndroid Build Coastguard Worker virtual void getPositionMsec(int* msec); // ANDROID_UNKNOWN_TIME if unknown 91*bebae9c0SAndroid Build Coastguard Worker 92*bebae9c0SAndroid Build Coastguard Worker virtual void setVideoSurfaceTexture(const sp<IGraphicBufferProducer> &bufferProducer); 93*bebae9c0SAndroid Build Coastguard Worker 94*bebae9c0SAndroid Build Coastguard Worker virtual void setPlaybackRate(int32_t ratePermille); 95*bebae9c0SAndroid Build Coastguard Worker 96*bebae9c0SAndroid Build Coastguard Worker protected: 97*bebae9c0SAndroid Build Coastguard Worker friend class MediaPlayerNotificationClient; 98*bebae9c0SAndroid Build Coastguard Worker 99*bebae9c0SAndroid Build Coastguard Worker // Async event handlers (called from GenericPlayer's event loop) 100*bebae9c0SAndroid Build Coastguard Worker virtual void onPrepare(); 101*bebae9c0SAndroid Build Coastguard Worker virtual void onPlay(); 102*bebae9c0SAndroid Build Coastguard Worker virtual void onPause(); 103*bebae9c0SAndroid Build Coastguard Worker virtual void onSeek(const sp<AMessage> &msg); 104*bebae9c0SAndroid Build Coastguard Worker virtual void onLoop(const sp<AMessage> &msg); 105*bebae9c0SAndroid Build Coastguard Worker virtual void onSeekComplete(); 106*bebae9c0SAndroid Build Coastguard Worker virtual void onVolumeUpdate(); 107*bebae9c0SAndroid Build Coastguard Worker virtual void onBufferingUpdate(const sp<AMessage> &msg); 108*bebae9c0SAndroid Build Coastguard Worker virtual void onAttachAuxEffect(const sp<AMessage> &msg); 109*bebae9c0SAndroid Build Coastguard Worker virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg); 110*bebae9c0SAndroid Build Coastguard Worker 111*bebae9c0SAndroid Build Coastguard Worker const bool mHasVideo; // const allows MediaPlayerNotificationClient::notify to safely access 112*bebae9c0SAndroid Build Coastguard Worker int32_t mSeekTimeMsec; 113*bebae9c0SAndroid Build Coastguard Worker 114*bebae9c0SAndroid Build Coastguard Worker sp<IGraphicBufferProducer> mVideoSurfaceTexture; 115*bebae9c0SAndroid Build Coastguard Worker 116*bebae9c0SAndroid Build Coastguard Worker // only safe to access from within Realize and looper 117*bebae9c0SAndroid Build Coastguard Worker sp<IMediaPlayer> mPlayer; 118*bebae9c0SAndroid Build Coastguard Worker // Receives Android MediaPlayer events from mPlayer 119*bebae9c0SAndroid Build Coastguard Worker const sp<MediaPlayerNotificationClient> mPlayerClient; 120*bebae9c0SAndroid Build Coastguard Worker 121*bebae9c0SAndroid Build Coastguard Worker // Receives notifications about death of media.player service 122*bebae9c0SAndroid Build Coastguard Worker const sp<MediaPlayerDeathNotifier> mPlayerDeathNotifier; 123*bebae9c0SAndroid Build Coastguard Worker 124*bebae9c0SAndroid Build Coastguard Worker // Return a reference to the media player service, or ALOGE and return NULL after retries fail getMediaPlayerService()125*bebae9c0SAndroid Build Coastguard Worker static const sp<IMediaPlayerService> getMediaPlayerService() { 126*bebae9c0SAndroid Build Coastguard Worker return IMediaDeathNotifier::getMediaPlayerService(); 127*bebae9c0SAndroid Build Coastguard Worker } 128*bebae9c0SAndroid Build Coastguard Worker 129*bebae9c0SAndroid Build Coastguard Worker private: 130*bebae9c0SAndroid Build Coastguard Worker DISALLOW_EVIL_CONSTRUCTORS(GenericMediaPlayer); 131*bebae9c0SAndroid Build Coastguard Worker void afterMediaPlayerPreparedSuccessfully(); 132*bebae9c0SAndroid Build Coastguard Worker 133*bebae9c0SAndroid Build Coastguard Worker protected: // FIXME temporary 134*bebae9c0SAndroid Build Coastguard Worker Mutex mPreparedPlayerLock; // protects mPreparedPlayer 135*bebae9c0SAndroid Build Coastguard Worker sp<IMediaPlayer> mPreparedPlayer; // non-NULL if MediaPlayer exists and prepared, write once 136*bebae9c0SAndroid Build Coastguard Worker private: 137*bebae9c0SAndroid Build Coastguard Worker void getPreparedPlayer(sp<IMediaPlayer> &preparedPlayer); // safely read mPreparedPlayer 138*bebae9c0SAndroid Build Coastguard Worker 139*bebae9c0SAndroid Build Coastguard Worker }; 140*bebae9c0SAndroid Build Coastguard Worker 141*bebae9c0SAndroid Build Coastguard Worker } // namespace android 142*bebae9c0SAndroid Build Coastguard Worker 143*bebae9c0SAndroid Build Coastguard Worker // is the specified URI a known distant protocol? 144*bebae9c0SAndroid Build Coastguard Worker bool isDistantProtocol(const char *uri); 145*bebae9c0SAndroid Build Coastguard Worker 146*bebae9c0SAndroid Build Coastguard Worker #endif /* __ANDROID_GENERICMEDIAPLAYER_H__ */ 147