android_GenericPlayer.h revision 1fa5c3206d06bbebdea2dc92f378ce6b8a211e23
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
64833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    void setDataSource(const char *uri);
65833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    void setDataSource(int fd, int64_t offset, int64_t length, bool closeAfterUse = false);
6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
6785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            void prepare();
6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void play();
6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void pause();
7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void stop();
71a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten    // timeMsec must be >= 0 or == ANDROID_UNKNOWN_TIME (used by StreamPlayer after discontinuity)
7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void seek(int64_t timeMsec);
7313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void loop(bool loop);
744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void setBufferingUpdateThreshold(int16_t thresholdPercent);
7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
764b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    virtual void getDurationMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
775933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    virtual void getPositionMsec(int* msec) = 0; //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
7870c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi
7935ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    virtual void setVideoSurface(const sp<Surface> &surface) {}
8035ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    virtual void setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {}
8135ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten
82fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    void setVolume(float leftVol, float rightVol);
833610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void attachAuxEffect(int32_t effectId);
843610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void setAuxEffectSendLevel(float level);
8537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
865933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Call after changing any of the IPlay settings related to SL_PLAYEVENT_*
875933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void setPlayEvents(int32_t eventFlags, int32_t markerPosition, int32_t positionUpdatePeriod);
885933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprotected:
901fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    // mutex used for set vs use of volume, duration, and cache (fill, threshold) settings
9137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex mSettingsLock;
9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void resetDataLocator();
9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DataLocator2 mDataLocator;
9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    int          mDataLocatorType;
9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Constants used to identify the messages in this player's AHandler message loop
984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   in onMessageReceived()
9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
1004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatPrepare         = 'prep',
1014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatNotif           = 'noti',
1024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatPlay            = 'play',
1034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatPause           = 'paus',
1044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatSeek            = 'seek',
1054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatSeekComplete    = 'skcp',
1064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatLoop            = 'loop',
1074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatVolumeUpdate    = 'volu',
1084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatBufferingUpdate = 'bufu',
1094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatBuffUpdateThres = 'buut',
1103610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatAttachAuxEffect = 'aaux',
1113610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatSetAuxEffectSendLevel = 'saux',
1125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatSetPlayEvents   = 'spev',  // process new IPlay settings related to SL_PLAYEVENT_*
1135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatOneShot         = 'ones',  // deferred (non-0 timeout) handler for SL_PLAYEVENT_*
1145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // As used here, "one-shot" is the software equivalent of a "retriggerable monostable
1155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // multivibrator" from electronics.  Briefly, a one-shot is a timer that can be triggered
1165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // to fire at some point in the future.  It is "retriggerable" because while the timer
1175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // is active, it is possible to replace the current timeout value by a new value.
1185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // This is done by cancelling the current timer (using a generation count),
1195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // and then posting another timer with the new desired value.
12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Send a notification to one of the event listeners
12337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, bool async);
12437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, int data2, bool async);
12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // AHandler implementation
12713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onMessageReceived(const sp<AMessage> &msg);
12813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Async event handlers (called from GenericPlayer's event loop)
13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPrepare();
13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onNotify(const sp<AMessage> &msg);
13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPlay();
13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPause();
13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onSeek(const sp<AMessage> &msg);
13513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onLoop(const sp<AMessage> &msg);
13637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void onVolumeUpdate();
1374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSeekComplete();
1384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onBufferingUpdate(const sp<AMessage> &msg);
1394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSetBufferingUpdateThreshold(const sp<AMessage> &msg);
1403610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onAttachAuxEffect(const sp<AMessage> &msg);
1413610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg);
1425933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onSetPlayEvents(const sp<AMessage> &msg);
1435933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onOneShot(const sp<AMessage> &msg);
1444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Convenience methods
1464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for async notifications of prefetch status and cache fill level, needs to be called
1474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //     with mSettingsLock locked
1484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyStatus();
1494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyCacheFill();
1504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for internal async notification to update state that the player is no longer seeking
1514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void seekComplete();
1524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void bufferingUpdate(int16_t fillLevelPerMille);
15313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
15413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Event notification from GenericPlayer to OpenSL ES / OpenMAX AL framework
15513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    notif_cbf_t mNotifyClient;
15613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void*       mNotifyUser;
157e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    // lock to protect mNotifyClient and mNotifyUser updates
158e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    Mutex       mNotifyClientLock;
15913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
16049935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    // Bits for mStateFlags
16113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
16249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPrepared               = 1 << 0,   // use only for successful preparation
16349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparing              = 1 << 1,
16449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPlaying                = 1 << 2,
16549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagBuffering              = 1 << 3,
166f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        kFlagSeeking                = 1 << 4,   // set if we (not Stagefright) initiated a seek
1679f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        kFlagLooping                = 1 << 5,   // set if looping is enabled
16849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparedUnsuccessfully = 1 << 6,
16913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
17013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    uint32_t mStateFlags;
17213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<ALooper> mLooper;
17413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    AudioPlayback_Parameters mPlaybackParams;
17613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    AndroidAudioLevels mAndroidAudioLevels;
1781fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten
1791fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    // protected by mSettingsLock
1804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t mDurationMsec;
1814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    CacheStatus_t mCacheStatus;
1834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFill; // cache fill level + played back level in permille
1844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener
1854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported
1864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1877349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    // Call any time any of the IPlay copies, current position, or play state changes, and
1887349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    // supply the latest known position or ANDROID_UNKNOWN_TIME if position is unknown to caller.
1897349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    void updateOneShot(int positionMs = ANDROID_UNKNOWN_TIME);
1907349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
1917349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    virtual bool advancesPositionInRealTime() const { return true; }
1927349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
19313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprivate:
1945933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
1955933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Our copy of some important IPlay member variables, except in Android units
1965933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mEventFlags;
1975933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mMarkerPositionMs;
1985933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mPositionUpdatePeriodMs;
1995933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2005933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // We need to be able to cancel any pending one-shot event(s) prior to posting
2015933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // a new one-shot.  As AMessage does not currently support cancellation by
2025933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // "what" category, we simulate this by keeping a generation counter for
2035933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // one-shots.  When a one-shot event is delivered, it checks to see if it is
2045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // still the current one-shot.  If not, it returns immediately, thus
2055933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // effectively cancelling itself.  Note that counter wrap-around is possible
2065933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // but unlikely and benign.
2075933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mOneShotGeneration;
2085933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position at time of the most recently delivered SL_PLAYEVENT_HEADATNEWPOS,
2105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // or ANDROID_UNKNOWN_TIME if a SL_PLAYEVENT_HEADATNEWPOS has never been delivered.
2115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mDeliveredNewPosMs;
2125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position most recently observed by updateOneShot, or ANDROID_UNKNOWN_TIME
2145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // if the play position has never been observed.
2155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mObservedPositionMs;
2165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
21713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DISALLOW_EVIL_CONSTRUCTORS(GenericPlayer);
21813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi};
21913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
22013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android
2214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
22299b927751677abfb60a388d65dfeed1fed1db12cGlenn Kastenextern void android_player_volumeUpdate(float *pVolumes /*[2]*/, const IVolume *volumeItf,
22399b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        unsigned channelCount, float amplFromDirectLevel, const bool *audibilityFactors /*[2]*/);
22499b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten
2254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif /* __ANDROID_GENERICPLAYER_H__ */
226