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