113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/*
213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project
313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *
413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * you may not use this file except in compliance with the License.
613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * You may obtain a copy of the License at
713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *
813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *
1013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * See the License for the specific language governing permissions and
1413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * limitations under the License.
1513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */
1613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#ifndef __ANDROID_GENERICPLAYER_H__
184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define __ANDROID_GENERICPLAYER_H__
194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/foundation/AHandler.h>
214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/foundation/ALooper.h>
224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/foundation/AMessage.h>
2313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
2413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/**
264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * Message parameters for AHandler messages, see list in GenericPlayer::kWhatxxx
274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */
284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define WHATPARAM_SEEK_SEEKTIME_MS                  "seekTimeMs"
294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define WHATPARAM_LOOP_LOOPING                      "looping"
304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define WHATPARAM_BUFFERING_UPDATE                  "bufferingUpdate"
314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT "buffUpdateThreshold"
323610785fa93586ce84a27a27530feb77b8035229Glenn Kasten#define WHATPARAM_ATTACHAUXEFFECT                   "attachAuxEffect"
333610785fa93586ce84a27a27530feb77b8035229Glenn Kasten#define WHATPARAM_SETAUXEFFECTSENDLEVEL             "setAuxEffectSendLevel"
345933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten// Parameters for kWhatSetPlayEvents
355933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#define WHATPARAM_SETPLAYEVENTS_FLAGS               "setPlayEventsFlags"
365933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#define WHATPARAM_SETPLAYEVENTS_MARKER              "setPlayEventsMarker"
375933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#define WHATPARAM_SETPLAYEVENTS_UPDATE              "setPlayEventsUpdate"
385933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten// Parameters for kWhatOneShot (see explanation at definition of kWhatOneShot below)
395933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#define WHATPARAM_ONESHOT_GENERATION                "oneShotGeneration"
404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivinamespace android {
4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
43e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten// abstract base class
4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviclass GenericPlayer : public AHandler
4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{
4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivipublic:
4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
4962496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventPrepared                = 0,
5062496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventHasVideoSize            = 1,
5162496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventPrefetchStatusChange    = 2,
5262496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventPrefetchFillLevelUpdate = 3,
5362496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventEndOfStream             = 4,
5462496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventChannelCount            = 5,
5562496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventPlay                    = 6, // SL_PLAYEVENT_*
5662496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kEventErrorAfterPrepare       = 7, // error after successful prepare
5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
609bf773df2b8a0cf788f394c326960bc3a5af7c60Chih-Hung Hsieh    explicit GenericPlayer(const AudioPlayback_Parameters* params);
6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual ~GenericPlayer();
6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
63c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void init(const notif_cbf_t cbf, void* notifUser);
64e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    virtual void preDestroy();
6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
66833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    void setDataSource(const char *uri);
67833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    void setDataSource(int fd, int64_t offset, int64_t length, bool closeAfterUse = false);
6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
69c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void prepare();
7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void play();
71c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void pause();
72c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void stop();
73a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten    // timeMsec must be >= 0 or == ANDROID_UNKNOWN_TIME (used by StreamPlayer after discontinuity)
74c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void seek(int64_t timeMsec);
75c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void loop(bool loop);
76c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void setBufferingUpdateThreshold(int16_t thresholdPercent);
7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
78c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void getDurationMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
795933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    virtual void getPositionMsec(int* msec) = 0; //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
8070c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi
81a6585530d8cf92658042c001b6a27fc397c62b9fGlenn Kasten    virtual void setVideoSurfaceTexture(const sp<IGraphicBufferProducer> &bufferProducer __unused)
82a6585530d8cf92658042c001b6a27fc397c62b9fGlenn Kasten            { }
8335ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten
84fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    void setVolume(float leftVol, float rightVol);
853610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void attachAuxEffect(int32_t effectId);
863610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void setAuxEffectSendLevel(float level);
8737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
8891145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    virtual void setPlaybackRate(int32_t ratePermille);
8991145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi
905933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Call after changing any of the IPlay settings related to SL_PLAYEVENT_*
915933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void setPlayEvents(int32_t eventFlags, int32_t markerPosition, int32_t positionUpdatePeriod);
925933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprotected:
941fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    // mutex used for set vs use of volume, duration, and cache (fill, threshold) settings
9537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex mSettingsLock;
9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void resetDataLocator();
9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DataLocator2 mDataLocator;
9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    int          mDataLocatorType;
10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
1014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Constants used to identify the messages in this player's AHandler message loop
1024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   in onMessageReceived()
10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
10462496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatPrepare         = 0,  // start preparation
10562496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatNotif           = 1,  // send a notification to client
10662496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatPlay            = 2,  // start player
10762496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatPause           = 3,  // pause or stop player
10862496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatSeek            = 4,  // request a seek to specified position
10962496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatSeekComplete    = 5,  // seek request has completed
11062496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatLoop            = 6,  // set the player's looping status
11162496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatVolumeUpdate    = 7,  // set the channel gains to specified values
11262496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatBufferingUpdate = 8,
11362496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatBuffUpdateThres = 9,
11462496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatAttachAuxEffect = 10,
11562496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatSetAuxEffectSendLevel = 11,
11662496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatSetPlayEvents   = 12,  // process new IPlay settings related to SL_PLAYEVENT_*
11762496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        kWhatOneShot         = 13,  // deferred (non-0 timeout) handler for SL_PLAYEVENT_*
1185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // As used here, "one-shot" is the software equivalent of a "retriggerable monostable
1195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // multivibrator" from electronics.  Briefly, a one-shot is a timer that can be triggered
1205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // to fire at some point in the future.  It is "retriggerable" because while the timer
1215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // is active, it is possible to replace the current timeout value by a new value.
1225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // This is done by cancelling the current timer (using a generation count),
1235933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // and then posting another timer with the new desired value.
12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Send a notification to one of the event listeners
12737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, bool async);
12837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, int data2, bool async);
12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // AHandler implementation
13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onMessageReceived(const sp<AMessage> &msg);
13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Async event handlers (called from GenericPlayer's event loop)
13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPrepare();
13513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onNotify(const sp<AMessage> &msg);
13613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPlay();
13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPause();
13813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onSeek(const sp<AMessage> &msg);
13913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onLoop(const sp<AMessage> &msg);
14037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void onVolumeUpdate();
1414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSeekComplete();
1424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onBufferingUpdate(const sp<AMessage> &msg);
1434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSetBufferingUpdateThreshold(const sp<AMessage> &msg);
1443610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onAttachAuxEffect(const sp<AMessage> &msg);
1453610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg);
1465933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onSetPlayEvents(const sp<AMessage> &msg);
1475933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onOneShot(const sp<AMessage> &msg);
1484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Convenience methods
1504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for async notifications of prefetch status and cache fill level, needs to be called
1514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //     with mSettingsLock locked
1524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyStatus();
1534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyCacheFill();
1544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for internal async notification to update state that the player is no longer seeking
1554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void seekComplete();
1564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void bufferingUpdate(int16_t fillLevelPerMille);
15713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
15813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Event notification from GenericPlayer to OpenSL ES / OpenMAX AL framework
15913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    notif_cbf_t mNotifyClient;
16013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void*       mNotifyUser;
161e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    // lock to protect mNotifyClient and mNotifyUser updates
162e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    Mutex       mNotifyClientLock;
16313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
16449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    // Bits for mStateFlags
16513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
16649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPrepared               = 1 << 0,   // use only for successful preparation
16749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparing              = 1 << 1,
16849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPlaying                = 1 << 2,
16949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagBuffering              = 1 << 3,
170f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        kFlagSeeking                = 1 << 4,   // set if we (not Stagefright) initiated a seek
1719f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        kFlagLooping                = 1 << 5,   // set if looping is enabled
17249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparedUnsuccessfully = 1 << 6,
17313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
17413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
175e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten    // Only accessed from event loop, does not need a mutex
17613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    uint32_t mStateFlags;
17713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<ALooper> mLooper;
17913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
180167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn Kasten    const AudioPlayback_Parameters mPlaybackParams;
18113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
182e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten    // protected by mSettingsLock after construction
18337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    AndroidAudioLevels mAndroidAudioLevels;
1841fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten
1851fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    // protected by mSettingsLock
1864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t mDurationMsec;
18791145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    int16_t mPlaybackRatePermille;
1884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    CacheStatus_t mCacheStatus;
1904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFill; // cache fill level + played back level in permille
1914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener
1924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported
1934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1947349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    // Call any time any of the IPlay copies, current position, or play state changes, and
1957349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    // supply the latest known position or ANDROID_UNKNOWN_TIME if position is unknown to caller.
1967349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    void updateOneShot(int positionMs = ANDROID_UNKNOWN_TIME);
1977349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
19891145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    // players that "render" data to present it to the user (a music player, a video player),
19991145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    // should return true, while players that only decode (hopefully faster than "real time")
20091145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    // should return false.
2017349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    virtual bool advancesPositionInRealTime() const { return true; }
2027349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
20313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprivate:
2045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2055933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Our copy of some important IPlay member variables, except in Android units
2065933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mEventFlags;
2075933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mMarkerPositionMs;
2085933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mPositionUpdatePeriodMs;
2095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // We need to be able to cancel any pending one-shot event(s) prior to posting
2115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // a new one-shot.  As AMessage does not currently support cancellation by
2125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // "what" category, we simulate this by keeping a generation counter for
2135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // one-shots.  When a one-shot event is delivered, it checks to see if it is
2145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // still the current one-shot.  If not, it returns immediately, thus
2155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // effectively cancelling itself.  Note that counter wrap-around is possible
2165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // but unlikely and benign.
2175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mOneShotGeneration;
2185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position at time of the most recently delivered SL_PLAYEVENT_HEADATNEWPOS,
2205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // or ANDROID_UNKNOWN_TIME if a SL_PLAYEVENT_HEADATNEWPOS has never been delivered.
2215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mDeliveredNewPosMs;
2225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2235933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position most recently observed by updateOneShot, or ANDROID_UNKNOWN_TIME
2245933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // if the play position has never been observed.
2255933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mObservedPositionMs;
2265933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
22713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DISALLOW_EVIL_CONSTRUCTORS(GenericPlayer);
22813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi};
22913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
23013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android
2314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
23299b927751677abfb60a388d65dfeed1fed1db12cGlenn Kastenextern void android_player_volumeUpdate(float *pVolumes /*[2]*/, const IVolume *volumeItf,
23399b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        unsigned channelCount, float amplFromDirectLevel, const bool *audibilityFactors /*[2]*/);
23499b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten
2354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif /* __ANDROID_GENERICPLAYER_H__ */
236