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