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 {
494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventPrepared                = 'prep',
504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventHasVideoSize            = 'vsiz',
514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventPrefetchStatusChange    = 'pfsc',
524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kEventPrefetchFillLevelUpdate = 'pflu',
53fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        kEventEndOfStream             = 'eos',
54fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        kEventChannelCount            = 'ccnt',
555933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kEventPlay                    = 'play', // SL_PLAYEVENT_*
565e4d65e369f28746767aba11b618dee314bb8197Glenn Kasten        kEventErrorAfterPrepare       = 'easp', // error after successful prepare
5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    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
81e21f91df7afb1175ddb5b0045ebb0d5338df2535Andy McFadden    virtual void setVideoSurfaceTexture(const sp<IGraphicBufferProducer> &bufferProducer) {}
8235ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten
83fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    void setVolume(float leftVol, float rightVol);
843610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void attachAuxEffect(int32_t effectId);
853610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    void setAuxEffectSendLevel(float level);
8637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
8791145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    virtual void setPlaybackRate(int32_t ratePermille);
8891145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi
895933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Call after changing any of the IPlay settings related to SL_PLAYEVENT_*
905933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void setPlayEvents(int32_t eventFlags, int32_t markerPosition, int32_t positionUpdatePeriod);
915933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprotected:
931fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    // mutex used for set vs use of volume, duration, and cache (fill, threshold) settings
9437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex mSettingsLock;
9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void resetDataLocator();
9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DataLocator2 mDataLocator;
9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    int          mDataLocatorType;
9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
1004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Constants used to identify the messages in this player's AHandler message loop
1014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   in onMessageReceived()
10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
103e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatPrepare         = 'prep',  // start preparation
104e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatNotif           = 'noti',  // send a notification to client
105e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatPlay            = 'play',  // start player
106e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatPause           = 'paus',  // pause or stop player
107e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatSeek            = 'seek',  // request a seek to specified position
108e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatSeekComplete    = 'skcp',  // seek request has completed
109e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatLoop            = 'loop',  // set the player's looping status
110e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatVolumeUpdate    = 'volu',  // set the channel gains to specified values
1114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatBufferingUpdate = 'bufu',
1124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatBuffUpdateThres = 'buut',
1133610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatAttachAuxEffect = 'aaux',
1143610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatSetAuxEffectSendLevel = 'saux',
1155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatSetPlayEvents   = 'spev',  // process new IPlay settings related to SL_PLAYEVENT_*
1165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatOneShot         = 'ones',  // deferred (non-0 timeout) handler for SL_PLAYEVENT_*
1175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // As used here, "one-shot" is the software equivalent of a "retriggerable monostable
1185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // multivibrator" from electronics.  Briefly, a one-shot is a timer that can be triggered
1195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // to fire at some point in the future.  It is "retriggerable" because while the timer
1205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // is active, it is possible to replace the current timeout value by a new value.
1215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // This is done by cancelling the current timer (using a generation count),
1225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        // and then posting another timer with the new desired value.
12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Send a notification to one of the event listeners
12637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, bool async);
12737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void notify(const char* event, int data1, int data2, bool async);
12813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // AHandler implementation
13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onMessageReceived(const sp<AMessage> &msg);
13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Async event handlers (called from GenericPlayer's event loop)
13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPrepare();
13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onNotify(const sp<AMessage> &msg);
13513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPlay();
13613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onPause();
13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onSeek(const sp<AMessage> &msg);
13813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    virtual void onLoop(const sp<AMessage> &msg);
13937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    virtual void onVolumeUpdate();
1404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSeekComplete();
1414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onBufferingUpdate(const sp<AMessage> &msg);
1424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    virtual void onSetBufferingUpdateThreshold(const sp<AMessage> &msg);
1433610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onAttachAuxEffect(const sp<AMessage> &msg);
1443610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg);
1455933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onSetPlayEvents(const sp<AMessage> &msg);
1465933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void onOneShot(const sp<AMessage> &msg);
1474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // Convenience methods
1494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for async notifications of prefetch status and cache fill level, needs to be called
1504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //     with mSettingsLock locked
1514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyStatus();
1524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void notifyCacheFill();
1534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    //   for internal async notification to update state that the player is no longer seeking
1544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void seekComplete();
1554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void bufferingUpdate(int16_t fillLevelPerMille);
15613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
15713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    // Event notification from GenericPlayer to OpenSL ES / OpenMAX AL framework
15813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    notif_cbf_t mNotifyClient;
15913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void*       mNotifyUser;
160e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    // lock to protect mNotifyClient and mNotifyUser updates
161e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    Mutex       mNotifyClientLock;
16213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
16349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    // Bits for mStateFlags
16413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
16549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPrepared               = 1 << 0,   // use only for successful preparation
16649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparing              = 1 << 1,
16749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPlaying                = 1 << 2,
16849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagBuffering              = 1 << 3,
169f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        kFlagSeeking                = 1 << 4,   // set if we (not Stagefright) initiated a seek
1709f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        kFlagLooping                = 1 << 5,   // set if looping is enabled
17149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        kFlagPreparedUnsuccessfully = 1 << 6,
17213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    };
17313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
174e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten    // Only accessed from event loop, does not need a mutex
17513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    uint32_t mStateFlags;
17613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<ALooper> mLooper;
17813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
179167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn Kasten    const AudioPlayback_Parameters mPlaybackParams;
18013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
181e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten    // protected by mSettingsLock after construction
18237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    AndroidAudioLevels mAndroidAudioLevels;
1831fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten
1841fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    // protected by mSettingsLock
1854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t mDurationMsec;
18691145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    int16_t mPlaybackRatePermille;
1874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    CacheStatus_t mCacheStatus;
1894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFill; // cache fill level + played back level in permille
1904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener
1914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported
1924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1937349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    // Call any time any of the IPlay copies, current position, or play state changes, and
1947349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    // supply the latest known position or ANDROID_UNKNOWN_TIME if position is unknown to caller.
1957349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    void updateOneShot(int positionMs = ANDROID_UNKNOWN_TIME);
1967349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
19791145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    // players that "render" data to present it to the user (a music player, a video player),
19891145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    // should return true, while players that only decode (hopefully faster than "real time")
19991145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    // should return false.
2007349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    virtual bool advancesPositionInRealTime() const { return true; }
2017349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
20213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprivate:
2035933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Our copy of some important IPlay member variables, except in Android units
2055933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mEventFlags;
2065933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mMarkerPositionMs;
2075933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mPositionUpdatePeriodMs;
2085933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // We need to be able to cancel any pending one-shot event(s) prior to posting
2105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // a new one-shot.  As AMessage does not currently support cancellation by
2115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // "what" category, we simulate this by keeping a generation counter for
2125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // one-shots.  When a one-shot event is delivered, it checks to see if it is
2135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // still the current one-shot.  If not, it returns immediately, thus
2145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // effectively cancelling itself.  Note that counter wrap-around is possible
2155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // but unlikely and benign.
2165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mOneShotGeneration;
2175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position at time of the most recently delivered SL_PLAYEVENT_HEADATNEWPOS,
2195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // or ANDROID_UNKNOWN_TIME if a SL_PLAYEVENT_HEADATNEWPOS has never been delivered.
2205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mDeliveredNewPosMs;
2215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Play position most recently observed by updateOneShot, or ANDROID_UNKNOWN_TIME
2235933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // if the play position has never been observed.
2245933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    int32_t mObservedPositionMs;
2255933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
22613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    DISALLOW_EVIL_CONSTRUCTORS(GenericPlayer);
22713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi};
22813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
22913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android
2304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
23199b927751677abfb60a388d65dfeed1fed1db12cGlenn Kastenextern void android_player_volumeUpdate(float *pVolumes /*[2]*/, const IVolume *volumeItf,
23299b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        unsigned channelCount, float amplFromDirectLevel, const bool *audibilityFactors /*[2]*/);
23399b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten
2344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif /* __ANDROID_GENERICPLAYER_H__ */
235