android_GenericPlayer.h revision 7349b2e742b2cedc6d149fac62ed661ad7d47dec
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(); 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 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: 904b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // mutex used for set vs use of volume 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 int32_t mLooperPriority; 17513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 17613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AudioPlayback_Parameters mPlaybackParams; 17713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 17837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi AndroidAudioLevels mAndroidAudioLevels; 17937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi int mChannelCount; // this is used for the panning law, and is not exposed outside of the object 1804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t mDurationMsec; 1817f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi uint32_t mSampleRateHz; 1824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 1834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CacheStatus_t mCacheStatus; 1844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int16_t mCacheFill; // cache fill level + played back level in permille 1854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener 1864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported 1874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 1887133228a478e16458b659946f2180ecddd13fda7Glenn Kasten const sp<CallbackProtector> mCallbackProtector; 189485a038f9f0f898227b8ab4218e94c5d56b6ed0bGlenn Kasten 1907349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten // Call any time any of the IPlay copies, current position, or play state changes, and 1917349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten // supply the latest known position or ANDROID_UNKNOWN_TIME if position is unknown to caller. 1927349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten void updateOneShot(int positionMs = ANDROID_UNKNOWN_TIME); 1937349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten 1947349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten virtual bool advancesPositionInRealTime() const { return true; } 1957349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten 19613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprivate: 1975933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 1985933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Our copy of some important IPlay member variables, except in Android units 1995933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten int32_t mEventFlags; 2005933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten int32_t mMarkerPositionMs; 2015933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten int32_t mPositionUpdatePeriodMs; 2025933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 2035933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // We need to be able to cancel any pending one-shot event(s) prior to posting 2045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // a new one-shot. As AMessage does not currently support cancellation by 2055933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // "what" category, we simulate this by keeping a generation counter for 2065933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // one-shots. When a one-shot event is delivered, it checks to see if it is 2075933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // still the current one-shot. If not, it returns immediately, thus 2085933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // effectively cancelling itself. Note that counter wrap-around is possible 2095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // but unlikely and benign. 2105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten int32_t mOneShotGeneration; 2115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 2125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Play position at time of the most recently delivered SL_PLAYEVENT_HEADATNEWPOS, 2135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // or ANDROID_UNKNOWN_TIME if a SL_PLAYEVENT_HEADATNEWPOS has never been delivered. 2145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten int32_t mDeliveredNewPosMs; 2155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 2165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Play position most recently observed by updateOneShot, or ANDROID_UNKNOWN_TIME 2175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // if the play position has never been observed. 2185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten int32_t mObservedPositionMs; 2195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 22013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi DISALLOW_EVIL_CONSTRUCTORS(GenericPlayer); 22113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi}; 22213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 22313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 2244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 22599b927751677abfb60a388d65dfeed1fed1db12cGlenn Kastenextern void android_player_volumeUpdate(float *pVolumes /*[2]*/, const IVolume *volumeItf, 22699b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten unsigned channelCount, float amplFromDirectLevel, const bool *audibilityFactors /*[2]*/); 22799b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten 2284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif /* __ANDROID_GENERICPLAYER_H__ */ 229