xref: /aosp_15_r20/frameworks/wilhelm/src/android/android_GenericMediaPlayer.h (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
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