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