1dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi/*
2dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project
3dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
4dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * you may not use this file except in compliance with the License.
6dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * You may obtain a copy of the License at
7dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
8dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
10dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * See the License for the specific language governing permissions and
14dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * limitations under the License.
15dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi */
16dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
178ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#ifndef __ANDROID_GENERICPLAYER_H__
188ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#define __ANDROID_GENERICPLAYER_H__
198ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
208ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#include <media/stagefright/foundation/AHandler.h>
218ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#include <media/stagefright/foundation/ALooper.h>
228ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#include <media/stagefright/foundation/AMessage.h>
23dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
24dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
258ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi/**
268ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi * Message parameters for AHandler messages, see list in GenericPlayer::kWhatxxx
278ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi */
288ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#define WHATPARAM_SEEK_SEEKTIME_MS                  "seekTimeMs"
298ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#define WHATPARAM_LOOP_LOOPING                      "looping"
308ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#define WHATPARAM_BUFFERING_UPDATE                  "bufferingUpdate"
318ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#define WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT "buffUpdateThreshold"
3241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten#define WHATPARAM_ATTACHAUXEFFECT                   "attachAuxEffect"
3341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten#define WHATPARAM_SETAUXEFFECTSENDLEVEL             "setAuxEffectSendLevel"
34a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten// Parameters for kWhatSetPlayEvents
35a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten#define WHATPARAM_SETPLAYEVENTS_FLAGS               "setPlayEventsFlags"
36a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten#define WHATPARAM_SETPLAYEVENTS_MARKER              "setPlayEventsMarker"
37a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten#define WHATPARAM_SETPLAYEVENTS_UPDATE              "setPlayEventsUpdate"
38a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten// Parameters for kWhatOneShot (see explanation at definition of kWhatOneShot below)
39a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten#define WHATPARAM_ONESHOT_GENERATION                "oneShotGeneration"
408ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
41dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivinamespace android {
42dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
43dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Triviclass GenericPlayer : public AHandler
44dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi{
45dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivipublic:
46dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
47dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    enum {
488ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kEventPrepared                = 'prep',
498ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kEventHasVideoSize            = 'vsiz',
508ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kEventPrefetchStatusChange    = 'pfsc',
518ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kEventPrefetchFillLevelUpdate = 'pflu',
527e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten        kEventEndOfStream             = 'eos',
537e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten        kEventChannelCount            = 'ccnt',
54a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        kEventPlay                    = 'play', // SL_PLAYEVENT_*
5531cc0d9597a502a2c81ff318556adde92d50590aGlenn Kasten        kEventErrorAfterPrepare       = 'easp', // error after successful prepare
56dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    };
57dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
588ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
59dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    GenericPlayer(const AudioPlayback_Parameters* params);
60dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual ~GenericPlayer();
61dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
62dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void init(const notif_cbf_t cbf, void* notifUser);
631209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    virtual void preDestroy();
64dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
65d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten    void setDataSource(const char *uri);
66d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten    void setDataSource(int fd, int64_t offset, int64_t length, bool closeAfterUse = false);
67dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
686bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten            void prepare();
69dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void play();
70dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void pause();
71dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void stop();
7222c4f2714b5a419ba350ba733a78d17e09fbd2c3Glenn Kasten    // timeMsec must be >= 0 or == ANDROID_UNKNOWN_TIME (used by StreamPlayer after discontinuity)
73dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void seek(int64_t timeMsec);
74dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void loop(bool loop);
758ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    virtual void setBufferingUpdateThreshold(int16_t thresholdPercent);
76dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
771b3d049fdaa0dfb601e5b7f482e04e84d38d2f93Jean-Michel Trivi    virtual void getDurationMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
78a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    virtual void getPositionMsec(int* msec) = 0; //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
795b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
8039671763229bf1140c8e1c1b6cd4c072cbd4eb6cGlenn Kasten    virtual void setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {}
8139671763229bf1140c8e1c1b6cd4c072cbd4eb6cGlenn Kasten
827e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten    void setVolume(float leftVol, float rightVol);
8341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    void attachAuxEffect(int32_t effectId);
8441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    void setAuxEffectSendLevel(float level);
85fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
86a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // Call after changing any of the IPlay settings related to SL_PLAYEVENT_*
87a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    void setPlayEvents(int32_t eventFlags, int32_t markerPosition, int32_t positionUpdatePeriod);
88a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
89dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Triviprotected:
90891673f650f233f17f60e2c663fa24279b8dc9afGlenn Kasten    // mutex used for set vs use of volume, duration, and cache (fill, threshold) settings
91fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    Mutex mSettingsLock;
92dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
93dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    void resetDataLocator();
94dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    DataLocator2 mDataLocator;
95dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    int          mDataLocatorType;
96dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
978ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    // Constants used to identify the messages in this player's AHandler message loop
988ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    //   in onMessageReceived()
99dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    enum {
1008ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatPrepare         = 'prep',
1018ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatNotif           = 'noti',
1028ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatPlay            = 'play',
1038ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatPause           = 'paus',
1048ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatSeek            = 'seek',
1058ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatSeekComplete    = 'skcp',
1068ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatLoop            = 'loop',
1078ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatVolumeUpdate    = 'volu',
1088ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatBufferingUpdate = 'bufu',
1098ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        kWhatBuffUpdateThres = 'buut',
11041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten        kWhatAttachAuxEffect = 'aaux',
11141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten        kWhatSetAuxEffectSendLevel = 'saux',
112a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        kWhatSetPlayEvents   = 'spev',  // process new IPlay settings related to SL_PLAYEVENT_*
113a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        kWhatOneShot         = 'ones',  // deferred (non-0 timeout) handler for SL_PLAYEVENT_*
114a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // As used here, "one-shot" is the software equivalent of a "retriggerable monostable
115a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // multivibrator" from electronics.  Briefly, a one-shot is a timer that can be triggered
116a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // to fire at some point in the future.  It is "retriggerable" because while the timer
117a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // is active, it is possible to replace the current timeout value by a new value.
118a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // This is done by cancelling the current timer (using a generation count),
119a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // and then posting another timer with the new desired value.
120dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    };
121dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
122dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    // Send a notification to one of the event listeners
123fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    virtual void notify(const char* event, int data1, bool async);
124fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    virtual void notify(const char* event, int data1, int data2, bool async);
125dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
126dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    // AHandler implementation
127dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void onMessageReceived(const sp<AMessage> &msg);
128dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
129dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    // Async event handlers (called from GenericPlayer's event loop)
130dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void onPrepare();
131dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void onNotify(const sp<AMessage> &msg);
132dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void onPlay();
133dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void onPause();
134dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void onSeek(const sp<AMessage> &msg);
135dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    virtual void onLoop(const sp<AMessage> &msg);
136fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    virtual void onVolumeUpdate();
1378ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    virtual void onSeekComplete();
1388ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    virtual void onBufferingUpdate(const sp<AMessage> &msg);
1398ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    virtual void onSetBufferingUpdateThreshold(const sp<AMessage> &msg);
14041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    virtual void onAttachAuxEffect(const sp<AMessage> &msg);
14141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg);
142a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    void onSetPlayEvents(const sp<AMessage> &msg);
143a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    void onOneShot(const sp<AMessage> &msg);
1448ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
1458ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    // Convenience methods
1468ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    //   for async notifications of prefetch status and cache fill level, needs to be called
1478ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    //     with mSettingsLock locked
1488ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    void notifyStatus();
1498ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    void notifyCacheFill();
1508ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    //   for internal async notification to update state that the player is no longer seeking
1518ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    void seekComplete();
1528ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    void bufferingUpdate(int16_t fillLevelPerMille);
153dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
154dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    // Event notification from GenericPlayer to OpenSL ES / OpenMAX AL framework
155dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    notif_cbf_t mNotifyClient;
156dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    void*       mNotifyUser;
1571209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    // lock to protect mNotifyClient and mNotifyUser updates
1581209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    Mutex       mNotifyClientLock;
159dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
160e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    // Bits for mStateFlags
161dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    enum {
162e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten        kFlagPrepared               = 1 << 0,   // use only for successful preparation
163e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten        kFlagPreparing              = 1 << 1,
164e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten        kFlagPlaying                = 1 << 2,
165e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten        kFlagBuffering              = 1 << 3,
1660b02ad8c6715ac9d8526e4229a6030ef436704bcGlenn Kasten        kFlagSeeking                = 1 << 4,   // set if we (not Stagefright) initiated a seek
1675ec63c4998f9b1d8c30363f21cbecc7ffc5d152aGlenn Kasten        kFlagLooping                = 1 << 5,   // set if looping is enabled
168e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten        kFlagPreparedUnsuccessfully = 1 << 6,
169dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    };
170dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
171dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    uint32_t mStateFlags;
172dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
173dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<ALooper> mLooper;
174dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
175dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    AudioPlayback_Parameters mPlaybackParams;
176dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
177fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    AndroidAudioLevels mAndroidAudioLevels;
178891673f650f233f17f60e2c663fa24279b8dc9afGlenn Kasten
179891673f650f233f17f60e2c663fa24279b8dc9afGlenn Kasten    // protected by mSettingsLock
1808ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    int32_t mDurationMsec;
1818ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
1828ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    CacheStatus_t mCacheStatus;
1838ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    int16_t mCacheFill; // cache fill level + played back level in permille
1848ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener
1858ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported
1868ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
187becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten    // Call any time any of the IPlay copies, current position, or play state changes, and
188becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten    // supply the latest known position or ANDROID_UNKNOWN_TIME if position is unknown to caller.
189becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten    void updateOneShot(int positionMs = ANDROID_UNKNOWN_TIME);
190becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten
191becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten    virtual bool advancesPositionInRealTime() const { return true; }
192becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten
193dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Triviprivate:
194a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
195a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // Our copy of some important IPlay member variables, except in Android units
196a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t mEventFlags;
197a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t mMarkerPositionMs;
198a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t mPositionUpdatePeriodMs;
199a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
200a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // We need to be able to cancel any pending one-shot event(s) prior to posting
201a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // a new one-shot.  As AMessage does not currently support cancellation by
202a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // "what" category, we simulate this by keeping a generation counter for
203a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // one-shots.  When a one-shot event is delivered, it checks to see if it is
204a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // still the current one-shot.  If not, it returns immediately, thus
205a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // effectively cancelling itself.  Note that counter wrap-around is possible
206a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // but unlikely and benign.
207a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t mOneShotGeneration;
208a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
209a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // Play position at time of the most recently delivered SL_PLAYEVENT_HEADATNEWPOS,
210a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // or ANDROID_UNKNOWN_TIME if a SL_PLAYEVENT_HEADATNEWPOS has never been delivered.
211a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t mDeliveredNewPosMs;
212a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
213a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // Play position most recently observed by updateOneShot, or ANDROID_UNKNOWN_TIME
214a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // if the play position has never been observed.
215a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t mObservedPositionMs;
216a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
217dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    DISALLOW_EVIL_CONSTRUCTORS(GenericPlayer);
218dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi};
219dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
220dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} // namespace android
2218ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
2220afa0fdcde5876941eaefaacc778984ec4efefa0Glenn Kastenextern void android_player_volumeUpdate(float *pVolumes /*[2]*/, const IVolume *volumeItf,
2230afa0fdcde5876941eaefaacc778984ec4efefa0Glenn Kasten        unsigned channelCount, float amplFromDirectLevel, const bool *audibilityFactors /*[2]*/);
2240afa0fdcde5876941eaefaacc778984ec4efefa0Glenn Kasten
2258ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#endif /* __ANDROID_GENERICPLAYER_H__ */
226