android_GenericPlayer.h revision fa2bd93c3a9852a1f879663eeff598d13cf8fa81
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" 344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivinamespace android { 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviclass GenericPlayer : public AHandler 3813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{ 3913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivipublic: 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi enum { 424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kEventPrepared = 'prep', 434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kEventHasVideoSize = 'vsiz', 444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kEventPrefetchStatusChange = 'pfsc', 454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kEventPrefetchFillLevelUpdate = 'pflu', 46fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten kEventEndOfStream = 'eos', 47fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten kEventChannelCount = 'ccnt', 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi }; 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi GenericPlayer(const AudioPlayback_Parameters* params); 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual ~GenericPlayer(); 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void init(const notif_cbf_t cbf, void* notifUser); 55e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi virtual void preDestroy(); 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void setDataSource(const char *uri); 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void setDataSource(int fd, int64_t offset, int64_t length); 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void prepare(); 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void play(); 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void pause(); 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void stop(); 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void seek(int64_t timeMsec); 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void loop(bool loop); 664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi virtual void setBufferingUpdateThreshold(int16_t thresholdPercent); 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi virtual void getDurationMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown 694b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi virtual void getPositionMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown 704b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi virtual void getSampleRate(uint32_t* hz);// hz != NULL, UNKNOWN_SAMPLERATE if unknown 7170c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 72fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten void setVolume(float leftVol, float rightVol); 733610785fa93586ce84a27a27530feb77b8035229Glenn Kasten void attachAuxEffect(int32_t effectId); 743610785fa93586ce84a27a27530feb77b8035229Glenn Kasten void setAuxEffectSendLevel(float level); 7537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprotected: 774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // mutex used for set vs use of volume and cache (fill, threshold) settings 7837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex mSettingsLock; 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void resetDataLocator(); 8113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi DataLocator2 mDataLocator; 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int mDataLocatorType; 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // Constants used to identify the messages in this player's AHandler message loop 854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // in onMessageReceived() 8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi enum { 874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatPrepare = 'prep', 884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatNotif = 'noti', 894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatPlay = 'play', 904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatPause = 'paus', 914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatSeek = 'seek', 924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatSeekComplete = 'skcp', 934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatLoop = 'loop', 944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatVolumeUpdate = 'volu', 954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatBufferingUpdate = 'bufu', 964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kWhatBuffUpdateThres = 'buut', 973610785fa93586ce84a27a27530feb77b8035229Glenn Kasten kWhatMediaPlayerInfo = 'mpin', 983610785fa93586ce84a27a27530feb77b8035229Glenn Kasten kWhatAttachAuxEffect = 'aaux', 993610785fa93586ce84a27a27530feb77b8035229Glenn Kasten kWhatSetAuxEffectSendLevel = 'saux', 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi }; 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Send a notification to one of the event listeners 10337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi virtual void notify(const char* event, int data1, bool async); 10437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi virtual void notify(const char* event, int data1, int data2, bool async); 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // AHandler implementation 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void onMessageReceived(const sp<AMessage> &msg); 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Async event handlers (called from GenericPlayer's event loop) 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void onPrepare(); 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void onNotify(const sp<AMessage> &msg); 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void onPlay(); 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void onPause(); 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void onSeek(const sp<AMessage> &msg); 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void onLoop(const sp<AMessage> &msg); 11637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi virtual void onVolumeUpdate(); 1174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi virtual void onSeekComplete(); 1184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi virtual void onBufferingUpdate(const sp<AMessage> &msg); 1194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi virtual void onSetBufferingUpdateThreshold(const sp<AMessage> &msg); 1203610785fa93586ce84a27a27530feb77b8035229Glenn Kasten virtual void onAttachAuxEffect(const sp<AMessage> &msg); 1213610785fa93586ce84a27a27530feb77b8035229Glenn Kasten virtual void onSetAuxEffectSendLevel(const sp<AMessage> &msg); 1224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 1234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // Convenience methods 1244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // for async notifications of prefetch status and cache fill level, needs to be called 1254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // with mSettingsLock locked 1264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi void notifyStatus(); 1274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi void notifyCacheFill(); 1284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // for internal async notification to update state that the player is no longer seeking 1294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi void seekComplete(); 1304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi void bufferingUpdate(int16_t fillLevelPerMille); 13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Event notification from GenericPlayer to OpenSL ES / OpenMAX AL framework 13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi notif_cbf_t mNotifyClient; 13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void* mNotifyUser; 135e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi // lock to protect mNotifyClient and mNotifyUser updates 136e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi Mutex mNotifyClientLock; 13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten // Bits for mStateFlags 13913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi enum { 14049935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten kFlagPrepared = 1 << 0, // use only for successful preparation 14149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten kFlagPreparing = 1 << 1, 14249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten kFlagPlaying = 1 << 2, 14349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten kFlagBuffering = 1 << 3, 14449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten kFlagSeeking = 1 << 4, 14549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten kFlagLooping = 1 << 5, 14649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten kFlagPreparedUnsuccessfully = 1 << 6, 14713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi }; 14813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi uint32_t mStateFlags; 15013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<ALooper> mLooper; 15213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int32_t mLooperPriority; 15313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AudioPlayback_Parameters mPlaybackParams; 15513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi AndroidAudioLevels mAndroidAudioLevels; 15737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi int mChannelCount; // this is used for the panning law, and is not exposed outside of the object 1584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t mDurationMsec; 1594b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // position is not protected by any lock in this generic class, may be different in subclasses 1604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t mPositionMsec; 1617f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi uint32_t mSampleRateHz; 1624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 1634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CacheStatus_t mCacheStatus; 1644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int16_t mCacheFill; // cache fill level + played back level in permille 1654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener 1664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported 1674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 16813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprivate: 16913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi DISALLOW_EVIL_CONSTRUCTORS(GenericPlayer); 17013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi}; 17113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 17213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 1734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 1744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif /* __ANDROID_GENERICPLAYER_H__ */ 175