android_GenericPlayer.h revision 5933f3d5e532aaac31ce0e6551c59f0197c0ae3c
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
4313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviclass GenericPlayer : public AHandler
4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{
4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivipublic:
4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventPrepared                = 'prep',
494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventHasVideoSize            = 'vsiz',
504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventPrefetchStatusChange    = 'pfsc',
514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventPrefetchFillLevelUpdate = 'pflu',
52fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        kEventEndOfStream             = 'eos',
53fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        kEventChannelCount            = 'ccnt',
545933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kEventPlay                    = 'play', // SL_PLAYEVENT_*
5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    GenericPlayer(const AudioPlayback_Parameters* params);
5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual ~GenericPlayer();
6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void init(const notif_cbf_t cbf, void* notifUser);
62e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    virtual void preDestroy();
6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void setDataSource(const char *uri);
6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void setDataSource(int fd, int64_t offset, int64_t length);
6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void prepare();
6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void play();
6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void pause();
7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void stop();
7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void seek(int64_t timeMsec);
7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void loop(bool loop);
734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void setBufferingUpdateThreshold(int16_t thresholdPercent);
7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
754b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    virtual void getDurationMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
765933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    virtual void getPositionMsec(int* msec) = 0; //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    virtual void getSampleRate(uint32_t* hz);// hz  != NULL, UNKNOWN_SAMPLERATE if unknown
7870c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi
79fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    void setVolume(float leftVol, float rightVol);
803610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void attachAuxEffect(int32_t effectId);
813610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void setAuxEffectSendLevel(float level);
8237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
835933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Call after changing any of the IPlay settings related to SL_PLAYEVENT_*
845933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void setPlayEvents(int32_t eventFlags, int32_t markerPosition, int32_t positionUpdatePeriod);
855933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprotected:
874b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    // mutex used for set vs use of volume and cache (fill, threshold) settings
8837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex mSettingsLock;
8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void resetDataLocator();
9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DataLocator2 mDataLocator;
9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    int          mDataLocatorType;
9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Constants used to identify the messages in this player's AHandler message loop
954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   in onMessageReceived()
9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatPrepare         = 'prep',
984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatNotif           = 'noti',
994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatPlay            = 'play',
1004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatPause           = 'paus',
1014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatSeek            = 'seek',
1024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatSeekComplete    = 'skcp',
1034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatLoop            = 'loop',
1044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatVolumeUpdate    = 'volu',
1054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatBufferingUpdate = 'bufu',
1064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatBuffUpdateThres = 'buut',
1073610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatAttachAuxEffect = 'aaux',
1083610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatSetAuxEffectSendLevel = 'saux',
1095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatSetPlayEvents   = 'spev',  // process new IPlay settings related to SL_PLAYEVENT_*
1105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatOneShot         = 'ones',  // deferred (non-0 timeout) handler for SL_PLAYEVENT_*
1115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // As used here, "one-shot" is the software equivalent of a "retriggerable monostable
1125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // multivibrator" from electronics.  Briefly, a one-shot is a timer that can be triggered
1135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // to fire at some point in the future.  It is "retriggerable" because while the timer
1145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // is active, it is possible to replace the current timeout value by a new value.
1155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // This is done by cancelling the current timer (using a generation count),
1165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // and then posting another timer with the new desired value.
11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
11813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Send a notification to one of the event listeners
12037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, bool async);
12137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, int data2, bool async);
12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // AHandler implementation
12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onMessageReceived(const sp<AMessage> &msg);
12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Async event handlers (called from GenericPlayer's event loop)
12713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPrepare();
12813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onNotify(const sp<AMessage> &msg);
12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPlay();
13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPause();
13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onSeek(const sp<AMessage> &msg);
13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onLoop(const sp<AMessage> &msg);
13337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void onVolumeUpdate();
1344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSeekComplete();
1354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onBufferingUpdate(const sp<AMessage> &msg);
1364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSetBufferingUpdateThreshold(const sp<AMessage> &msg);
1373610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onAttachAuxEffect(const sp<AMessage> &msg);
1383610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg);
1395933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onSetPlayEvents(const sp<AMessage> &msg);
1405933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onOneShot(const sp<AMessage> &msg);
1414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Convenience methods
1434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for async notifications of prefetch status and cache fill level, needs to be called
1444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //     with mSettingsLock locked
1454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyStatus();
1464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyCacheFill();
1474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for internal async notification to update state that the player is no longer seeking
1484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void seekComplete();
1494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void bufferingUpdate(int16_t fillLevelPerMille);
15013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
15113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Event notification from GenericPlayer to OpenSL ES / OpenMAX AL framework
15213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    notif_cbf_t mNotifyClient;
15313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void*       mNotifyUser;
154e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    // lock to protect mNotifyClient and mNotifyUser updates
155e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    Mutex       mNotifyClientLock;
15613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
15749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    // Bits for mStateFlags
15813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
15949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPrepared               = 1 << 0,   // use only for successful preparation
16049935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparing              = 1 << 1,
16149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPlaying                = 1 << 2,
16249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagBuffering              = 1 << 3,
16349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagSeeking                = 1 << 4,
1649f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        kFlagLooping                = 1 << 5,   // set if looping is enabled
16549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparedUnsuccessfully = 1 << 6,
16613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
16713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
16813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    uint32_t mStateFlags;
16913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<ALooper> mLooper;
17113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    int32_t mLooperPriority;
17213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    AudioPlayback_Parameters mPlaybackParams;
17413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    AndroidAudioLevels mAndroidAudioLevels;
17637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    int mChannelCount; // this is used for the panning law, and is not exposed outside of the object
1774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t mDurationMsec;
1787f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi    uint32_t mSampleRateHz;
1794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    CacheStatus_t mCacheStatus;
1814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFill; // cache fill level + played back level in permille
1824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener
1834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported
1844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
18513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprivate:
1865933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
1875933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Our copy of some important IPlay member variables, except in Android units
1885933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mEventFlags;
1895933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mMarkerPositionMs;
1905933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mPositionUpdatePeriodMs;
1915933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
1925933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // We need to be able to cancel any pending one-shot event(s) prior to posting
1935933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // a new one-shot.  As AMessage does not currently support cancellation by
1945933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // "what" category, we simulate this by keeping a generation counter for
1955933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // one-shots.  When a one-shot event is delivered, it checks to see if it is
1965933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // still the current one-shot.  If not, it returns immediately, thus
1975933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // effectively cancelling itself.  Note that counter wrap-around is possible
1985933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // but unlikely and benign.
1995933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mOneShotGeneration;
2005933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2015933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position at time of the most recently delivered SL_PLAYEVENT_HEADATNEWPOS,
2025933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // or ANDROID_UNKNOWN_TIME if a SL_PLAYEVENT_HEADATNEWPOS has never been delivered.
2035933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mDeliveredNewPosMs;
2045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2055933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position most recently observed by updateOneShot, or ANDROID_UNKNOWN_TIME
2065933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // if the play position has never been observed.
2075933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mObservedPositionMs;
2085933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Call any time any of the IPlay copies, current position, or play state changes, and
2105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // supply the latest known position or ANDROID_UNKNOWN_TIME if position is unknown to caller.
2115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void updateOneShot(int positionMs = ANDROID_UNKNOWN_TIME);
2125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
21313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DISALLOW_EVIL_CONSTRUCTORS(GenericPlayer);
21413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi};
21513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
21613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android
2174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
21899b927751677abfb60a388d65dfeed1fed1db12cGlenn Kastenextern void android_player_volumeUpdate(float *pVolumes /*[2]*/, const IVolume *volumeItf,
21999b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        unsigned channelCount, float amplFromDirectLevel, const bool *audibilityFactors /*[2]*/);
22099b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten
2214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif /* __ANDROID_GENERICPLAYER_H__ */
222