| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | ** | 
|  | 3 | ** Copyright 2008, The Android Open Source Project | 
|  | 4 | ** | 
|  | 5 | ** Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 6 | ** you may not use this file except in compliance with the License. | 
|  | 7 | ** You may obtain a copy of the License at | 
|  | 8 | ** | 
|  | 9 | **     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 10 | ** | 
|  | 11 | ** Unless required by applicable law or agreed to in writing, software | 
|  | 12 | ** distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 13 | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 14 | ** See the License for the specific language governing permissions and | 
|  | 15 | ** limitations under the License. | 
|  | 16 | */ | 
|  | 17 |  | 
|  | 18 | #ifndef ANDROID_MEDIAPLAYERSERVICE_H | 
|  | 19 | #define ANDROID_MEDIAPLAYERSERVICE_H | 
|  | 20 |  | 
| John Grossman | c795b64 | 2012-02-22 15:38:35 -0800 | [diff] [blame] | 21 | #include <arpa/inet.h> | 
|  | 22 |  | 
| Mathias Agopian | 273d098 | 2009-05-31 19:13:00 -0700 | [diff] [blame] | 23 | #include <utils/Log.h> | 
|  | 24 | #include <utils/threads.h> | 
|  | 25 | #include <utils/List.h> | 
|  | 26 | #include <utils/Errors.h> | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 27 | #include <utils/KeyedVector.h> | 
| Andreas Huber | 2db8455 | 2010-01-28 11:19:57 -0800 | [diff] [blame] | 28 | #include <utils/String8.h> | 
| Nicolas Catania | a7e0e8b | 2009-07-08 08:57:42 -0700 | [diff] [blame] | 29 | #include <utils/Vector.h> | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 30 |  | 
|  | 31 | #include <media/IMediaPlayerService.h> | 
|  | 32 | #include <media/MediaPlayerInterface.h> | 
| niko | a64c8c7 | 2009-07-20 15:07:26 -0700 | [diff] [blame] | 33 | #include <media/Metadata.h> | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 34 | #include <media/stagefright/foundation/ABase.h> | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 35 |  | 
| Dima Zavin | 6476024 | 2011-05-11 14:15:23 -0700 | [diff] [blame] | 36 | #include <system/audio.h> | 
| Dima Zavin | fce7a47 | 2011-04-19 22:30:36 -0700 | [diff] [blame] | 37 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 38 | namespace android { | 
|  | 39 |  | 
| Glenn Kasten | a3f1fa3 | 2012-01-18 14:54:46 -0800 | [diff] [blame] | 40 | class AudioTrack; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 41 | class IMediaRecorder; | 
|  | 42 | class IMediaMetadataRetriever; | 
| Andreas Huber | 20111aa | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 43 | class IOMX; | 
| Gloria Wang | dac6a31 | 2009-10-29 15:46:37 -0700 | [diff] [blame] | 44 | class MediaRecorderClient; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 45 |  | 
|  | 46 | #define CALLBACK_ANTAGONIZER 0 | 
|  | 47 | #if CALLBACK_ANTAGONIZER | 
|  | 48 | class Antagonizer { | 
|  | 49 | public: | 
|  | 50 | Antagonizer(notify_callback_f cb, void* client); | 
|  | 51 | void start() { mActive = true; } | 
|  | 52 | void stop() { mActive = false; } | 
|  | 53 | void kill(); | 
|  | 54 | private: | 
|  | 55 | static const int interval; | 
|  | 56 | Antagonizer(); | 
|  | 57 | static int callbackThread(void* cookie); | 
|  | 58 | Mutex               mLock; | 
|  | 59 | Condition           mCondition; | 
|  | 60 | bool                mExit; | 
|  | 61 | bool                mActive; | 
|  | 62 | void*               mClient; | 
|  | 63 | notify_callback_f   mCb; | 
|  | 64 | }; | 
|  | 65 | #endif | 
|  | 66 |  | 
|  | 67 | class MediaPlayerService : public BnMediaPlayerService | 
|  | 68 | { | 
|  | 69 | class Client; | 
|  | 70 |  | 
|  | 71 | class AudioOutput : public MediaPlayerBase::AudioSink | 
|  | 72 | { | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 73 | class CallbackData; | 
|  | 74 |  | 
|  | 75 | public: | 
| Eric Laurent | a514bdb | 2010-06-21 09:27:30 -0700 | [diff] [blame] | 76 | AudioOutput(int sessionId); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 77 | virtual                 ~AudioOutput(); | 
|  | 78 |  | 
|  | 79 | virtual bool            ready() const { return mTrack != NULL; } | 
|  | 80 | virtual bool            realtime() const { return true; } | 
|  | 81 | virtual ssize_t         bufferSize() const; | 
|  | 82 | virtual ssize_t         frameCount() const; | 
|  | 83 | virtual ssize_t         channelCount() const; | 
|  | 84 | virtual ssize_t         frameSize() const; | 
|  | 85 | virtual uint32_t        latency() const; | 
|  | 86 | virtual float           msecsPerFrame() const; | 
| Marco Nelissen | 4110c10 | 2012-03-29 09:31:28 -0700 | [diff] [blame^] | 87 | virtual status_t        getPosition(uint32_t *position) const; | 
|  | 88 | virtual status_t        getFramesWritten(uint32_t *frameswritten) const; | 
|  | 89 | virtual int             getSessionId() const; | 
| Andreas Huber | 20111aa | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 90 |  | 
|  | 91 | virtual status_t        open( | 
| Jean-Michel Trivi | 786618f | 2012-03-02 14:54:07 -0800 | [diff] [blame] | 92 | uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, | 
| Glenn Kasten | e1c3962 | 2012-01-04 09:36:37 -0800 | [diff] [blame] | 93 | audio_format_t format, int bufferCount, | 
| Andreas Huber | 20111aa | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 94 | AudioCallback cb, void *cookie); | 
|  | 95 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 96 | virtual void            start(); | 
|  | 97 | virtual ssize_t         write(const void* buffer, size_t size); | 
|  | 98 | virtual void            stop(); | 
|  | 99 | virtual void            flush(); | 
|  | 100 | virtual void            pause(); | 
|  | 101 | virtual void            close(); | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 102 | void            setAudioStreamType(audio_stream_type_t streamType) { mStreamType = streamType; } | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 103 | void            setVolume(float left, float right); | 
| Jean-Michel Trivi | 7a8b0ed | 2012-02-02 09:06:31 -0800 | [diff] [blame] | 104 | virtual status_t        setPlaybackRatePermille(int32_t ratePermille); | 
| Eric Laurent | 2beeb50 | 2010-07-16 07:43:46 -0700 | [diff] [blame] | 105 | status_t        setAuxEffectSendLevel(float level); | 
|  | 106 | status_t        attachAuxEffect(int effectId); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 107 | virtual status_t        dump(int fd, const Vector<String16>& args) const; | 
|  | 108 |  | 
|  | 109 | static bool             isOnEmulator(); | 
|  | 110 | static int              getMinBufferCount(); | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 111 | void            setNextOutput(const sp<AudioOutput>& nextOutput); | 
|  | 112 | void            switchToNextOutput(); | 
|  | 113 | virtual bool            needsTrailingPadding() { return mNextOutput == NULL; } | 
|  | 114 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 115 | private: | 
|  | 116 | static void             setMinBufferCount(); | 
| Andreas Huber | 20111aa | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 117 | static void             CallbackWrapper( | 
| Glenn Kasten | d217a8c | 2011-06-01 15:20:35 -0700 | [diff] [blame] | 118 | int event, void *me, void *info); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 119 |  | 
|  | 120 | AudioTrack*             mTrack; | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 121 | AudioTrack*             mRecycledTrack; | 
|  | 122 | sp<AudioOutput>         mNextOutput; | 
| Andreas Huber | 20111aa | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 123 | AudioCallback           mCallback; | 
|  | 124 | void *                  mCallbackCookie; | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 125 | CallbackData *          mCallbackData; | 
| Marco Nelissen | 4110c10 | 2012-03-29 09:31:28 -0700 | [diff] [blame^] | 126 | uint64_t                mBytesWritten; | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 127 | audio_stream_type_t     mStreamType; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 128 | float                   mLeftVolume; | 
|  | 129 | float                   mRightVolume; | 
| Jean-Michel Trivi | 7a8b0ed | 2012-02-02 09:06:31 -0800 | [diff] [blame] | 130 | int32_t                 mPlaybackRatePermille; | 
|  | 131 | uint32_t                mSampleRateHz; // sample rate of the content, as set in open() | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 132 | float                   mMsecsPerFrame; | 
| Eric Laurent | a514bdb | 2010-06-21 09:27:30 -0700 | [diff] [blame] | 133 | int                     mSessionId; | 
| Eric Laurent | 2beeb50 | 2010-07-16 07:43:46 -0700 | [diff] [blame] | 134 | float                   mSendLevel; | 
|  | 135 | int                     mAuxEffectId; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 136 | static bool             mIsOnEmulator; | 
|  | 137 | static int              mMinBufferCount;  // 12 for emulator; otherwise 4 | 
|  | 138 |  | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 139 | // CallbackData is what is passed to the AudioTrack as the "user" data. | 
|  | 140 | // We need to be able to target this to a different Output on the fly, | 
|  | 141 | // so we can't use the Output itself for this. | 
|  | 142 | class CallbackData { | 
|  | 143 | public: | 
|  | 144 | CallbackData(AudioOutput *cookie) { | 
|  | 145 | mData = cookie; | 
|  | 146 | mSwitching = false; | 
|  | 147 | } | 
|  | 148 | AudioOutput *   getOutput() { return mData;} | 
|  | 149 | void            setOutput(AudioOutput* newcookie) { mData = newcookie; } | 
|  | 150 | // lock/unlock are used by the callback before accessing the payload of this object | 
|  | 151 | void            lock() { mLock.lock(); } | 
|  | 152 | void            unlock() { mLock.unlock(); } | 
|  | 153 | // beginTrackSwitch/endTrackSwitch are used when this object is being handed over | 
|  | 154 | // to the next sink. | 
|  | 155 | void            beginTrackSwitch() { mLock.lock(); mSwitching = true; } | 
|  | 156 | void            endTrackSwitch() { | 
|  | 157 | if (mSwitching) { | 
|  | 158 | mLock.unlock(); | 
|  | 159 | } | 
|  | 160 | mSwitching = false; | 
|  | 161 | } | 
|  | 162 | private: | 
|  | 163 | AudioOutput *   mData; | 
|  | 164 | mutable Mutex   mLock; | 
|  | 165 | bool            mSwitching; | 
|  | 166 | DISALLOW_EVIL_CONSTRUCTORS(CallbackData); | 
|  | 167 | }; | 
|  | 168 |  | 
|  | 169 | }; // AudioOutput | 
|  | 170 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 171 |  | 
|  | 172 | class AudioCache : public MediaPlayerBase::AudioSink | 
|  | 173 | { | 
|  | 174 | public: | 
|  | 175 | AudioCache(const char* name); | 
|  | 176 | virtual                 ~AudioCache() {} | 
|  | 177 |  | 
|  | 178 | virtual bool            ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); } | 
|  | 179 | virtual bool            realtime() const { return false; } | 
|  | 180 | virtual ssize_t         bufferSize() const { return frameSize() * mFrameCount; } | 
|  | 181 | virtual ssize_t         frameCount() const { return mFrameCount; } | 
|  | 182 | virtual ssize_t         channelCount() const { return (ssize_t)mChannelCount; } | 
| Dima Zavin | fce7a47 | 2011-04-19 22:30:36 -0700 | [diff] [blame] | 183 | virtual ssize_t         frameSize() const { return ssize_t(mChannelCount * ((mFormat == AUDIO_FORMAT_PCM_16_BIT)?sizeof(int16_t):sizeof(u_int8_t))); } | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 184 | virtual uint32_t        latency() const; | 
|  | 185 | virtual float           msecsPerFrame() const; | 
| Marco Nelissen | 4110c10 | 2012-03-29 09:31:28 -0700 | [diff] [blame^] | 186 | virtual status_t        getPosition(uint32_t *position) const; | 
|  | 187 | virtual status_t        getFramesWritten(uint32_t *frameswritten) const; | 
|  | 188 | virtual int             getSessionId() const; | 
| Andreas Huber | 20111aa | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 189 |  | 
|  | 190 | virtual status_t        open( | 
| Jean-Michel Trivi | 786618f | 2012-03-02 14:54:07 -0800 | [diff] [blame] | 191 | uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, | 
|  | 192 | audio_format_t format, int bufferCount = 1, | 
| Andreas Huber | 20111aa | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 193 | AudioCallback cb = NULL, void *cookie = NULL); | 
|  | 194 |  | 
| Andreas Huber | 7d5b8a7 | 2010-02-09 16:59:18 -0800 | [diff] [blame] | 195 | virtual void            start(); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 196 | virtual ssize_t         write(const void* buffer, size_t size); | 
| Andreas Huber | 7d5b8a7 | 2010-02-09 16:59:18 -0800 | [diff] [blame] | 197 | virtual void            stop(); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 198 | virtual void            flush() {} | 
|  | 199 | virtual void            pause() {} | 
|  | 200 | virtual void            close() {} | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 201 | void            setAudioStreamType(audio_stream_type_t streamType) {} | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 202 | void            setVolume(float left, float right) {} | 
| Jean-Michel Trivi | 7a8b0ed | 2012-02-02 09:06:31 -0800 | [diff] [blame] | 203 | virtual status_t        setPlaybackRatePermille(int32_t ratePermille) { return INVALID_OPERATION; } | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 204 | uint32_t        sampleRate() const { return mSampleRate; } | 
| Glenn Kasten | e1c3962 | 2012-01-04 09:36:37 -0800 | [diff] [blame] | 205 | audio_format_t  format() const { return mFormat; } | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 206 | size_t          size() const { return mSize; } | 
|  | 207 | status_t        wait(); | 
|  | 208 |  | 
|  | 209 | sp<IMemoryHeap> getHeap() const { return mHeap; } | 
|  | 210 |  | 
| Gloria Wang | b483c47 | 2011-04-11 17:23:27 -0700 | [diff] [blame] | 211 | static  void            notify(void* cookie, int msg, | 
|  | 212 | int ext1, int ext2, const Parcel *obj); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 213 | virtual status_t        dump(int fd, const Vector<String16>& args) const; | 
|  | 214 |  | 
|  | 215 | private: | 
|  | 216 | AudioCache(); | 
|  | 217 |  | 
|  | 218 | Mutex               mLock; | 
|  | 219 | Condition           mSignal; | 
|  | 220 | sp<MemoryHeapBase>  mHeap; | 
|  | 221 | float               mMsecsPerFrame; | 
|  | 222 | uint16_t            mChannelCount; | 
| Glenn Kasten | e1c3962 | 2012-01-04 09:36:37 -0800 | [diff] [blame] | 223 | audio_format_t      mFormat; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 224 | ssize_t             mFrameCount; | 
|  | 225 | uint32_t            mSampleRate; | 
|  | 226 | uint32_t            mSize; | 
|  | 227 | int                 mError; | 
|  | 228 | bool                mCommandComplete; | 
| Andreas Huber | 7d5b8a7 | 2010-02-09 16:59:18 -0800 | [diff] [blame] | 229 |  | 
|  | 230 | sp<Thread>          mCallbackThread; | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 231 | }; // AudioCache | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 232 |  | 
|  | 233 | public: | 
|  | 234 | static  void                instantiate(); | 
|  | 235 |  | 
|  | 236 | // IMediaPlayerService interface | 
|  | 237 | virtual sp<IMediaRecorder>  createMediaRecorder(pid_t pid); | 
| Gloria Wang | dac6a31 | 2009-10-29 15:46:37 -0700 | [diff] [blame] | 238 | void    removeMediaRecorderClient(wp<MediaRecorderClient> client); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 239 | virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid); | 
|  | 240 |  | 
| Dave Burke | d681bbb | 2011-08-30 14:39:17 +0100 | [diff] [blame] | 241 | virtual sp<IMediaPlayer>    create(pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId); | 
| Andreas Huber | e2b1028 | 2010-11-23 11:41:34 -0800 | [diff] [blame] | 242 |  | 
| Glenn Kasten | e1c3962 | 2012-01-04 09:36:37 -0800 | [diff] [blame] | 243 | virtual sp<IMemory>         decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat); | 
|  | 244 | virtual sp<IMemory>         decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat); | 
| Andreas Huber | 318ad9c | 2009-10-15 13:46:54 -0700 | [diff] [blame] | 245 | virtual sp<IOMX>            getOMX(); | 
| Andreas Huber | ed3e3e0 | 2012-03-26 11:13:27 -0700 | [diff] [blame] | 246 | virtual sp<ICrypto>         makeCrypto(); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 247 |  | 
|  | 248 | virtual status_t            dump(int fd, const Vector<String16>& args); | 
|  | 249 |  | 
|  | 250 | void                removeClient(wp<Client> client); | 
|  | 251 |  | 
| Gloria Wang | 7cf180c | 2011-02-19 18:37:57 -0800 | [diff] [blame] | 252 | // For battery usage tracking purpose | 
|  | 253 | struct BatteryUsageInfo { | 
|  | 254 | // how many streams are being played by one UID | 
|  | 255 | int     refCount; | 
|  | 256 | // a temp variable to store the duration(ms) of audio codecs | 
|  | 257 | // when we start a audio codec, we minus the system time from audioLastTime | 
|  | 258 | // when we pause it, we add the system time back to the audioLastTime | 
|  | 259 | // so after the pause, audioLastTime = pause time - start time | 
|  | 260 | // if multiple audio streams are played (or recorded), then audioLastTime | 
|  | 261 | // = the total playing time of all the streams | 
|  | 262 | int32_t audioLastTime; | 
|  | 263 | // when all the audio streams are being paused, we assign audioLastTime to | 
|  | 264 | // this variable, so this value could be provided to the battery app | 
|  | 265 | // in the next pullBatteryData call | 
|  | 266 | int32_t audioTotalTime; | 
| Nicolas Catania | a7e0e8b | 2009-07-08 08:57:42 -0700 | [diff] [blame] | 267 |  | 
| Gloria Wang | 7cf180c | 2011-02-19 18:37:57 -0800 | [diff] [blame] | 268 | int32_t videoLastTime; | 
|  | 269 | int32_t videoTotalTime; | 
|  | 270 | }; | 
|  | 271 | KeyedVector<int, BatteryUsageInfo>    mBatteryData; | 
|  | 272 |  | 
| Gloria Wang | 9ee159b | 2011-02-24 14:51:45 -0800 | [diff] [blame] | 273 | enum { | 
|  | 274 | SPEAKER, | 
|  | 275 | OTHER_AUDIO_DEVICE, | 
|  | 276 | SPEAKER_AND_OTHER, | 
|  | 277 | NUM_AUDIO_DEVICES | 
|  | 278 | }; | 
|  | 279 |  | 
|  | 280 | struct BatteryAudioFlingerUsageInfo { | 
|  | 281 | int refCount; // how many audio streams are being played | 
|  | 282 | int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used | 
|  | 283 | int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms | 
|  | 284 | // totalTime[]: total time of audio output devices usage | 
|  | 285 | int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms | 
|  | 286 | }; | 
|  | 287 |  | 
|  | 288 | // This varialble is used to record the usage of audio output device | 
|  | 289 | // for battery app | 
|  | 290 | BatteryAudioFlingerUsageInfo mBatteryAudio; | 
|  | 291 |  | 
| Gloria Wang | 7cf180c | 2011-02-19 18:37:57 -0800 | [diff] [blame] | 292 | // Collect info of the codec usage from media player and media recorder | 
|  | 293 | virtual void                addBatteryData(uint32_t params); | 
|  | 294 | // API for the Battery app to pull the data of codecs usage | 
|  | 295 | virtual status_t            pullBatteryData(Parcel* reply); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 296 | private: | 
|  | 297 |  | 
|  | 298 | class Client : public BnMediaPlayer { | 
|  | 299 |  | 
|  | 300 | // IMediaPlayer interface | 
|  | 301 | virtual void            disconnect(); | 
| Glenn Kasten | 1173118 | 2011-02-08 17:26:17 -0800 | [diff] [blame] | 302 | virtual status_t        setVideoSurfaceTexture( | 
|  | 303 | const sp<ISurfaceTexture>& surfaceTexture); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 304 | virtual status_t        prepareAsync(); | 
|  | 305 | virtual status_t        start(); | 
|  | 306 | virtual status_t        stop(); | 
|  | 307 | virtual status_t        pause(); | 
|  | 308 | virtual status_t        isPlaying(bool* state); | 
|  | 309 | virtual status_t        seekTo(int msec); | 
|  | 310 | virtual status_t        getCurrentPosition(int* msec); | 
|  | 311 | virtual status_t        getDuration(int* msec); | 
|  | 312 | virtual status_t        reset(); | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 313 | virtual status_t        setAudioStreamType(audio_stream_type_t type); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 314 | virtual status_t        setLooping(int loop); | 
|  | 315 | virtual status_t        setVolume(float leftVolume, float rightVolume); | 
| Nicolas Catania | 1d187f1 | 2009-05-12 23:25:55 -0700 | [diff] [blame] | 316 | virtual status_t        invoke(const Parcel& request, Parcel *reply); | 
| Nicolas Catania | a7e0e8b | 2009-07-08 08:57:42 -0700 | [diff] [blame] | 317 | virtual status_t        setMetadataFilter(const Parcel& filter); | 
| Nicolas Catania | 4829038 | 2009-07-10 13:53:06 -0700 | [diff] [blame] | 318 | virtual status_t        getMetadata(bool update_only, | 
|  | 319 | bool apply_filter, | 
|  | 320 | Parcel *reply); | 
| Eric Laurent | 2beeb50 | 2010-07-16 07:43:46 -0700 | [diff] [blame] | 321 | virtual status_t        setAuxEffectSendLevel(float level); | 
|  | 322 | virtual status_t        attachAuxEffect(int effectId); | 
| Gloria Wang | 4f9e47f | 2011-04-25 17:28:22 -0700 | [diff] [blame] | 323 | virtual status_t        setParameter(int key, const Parcel &request); | 
|  | 324 | virtual status_t        getParameter(int key, Parcel *reply); | 
| John Grossman | c795b64 | 2012-02-22 15:38:35 -0800 | [diff] [blame] | 325 | virtual status_t        setRetransmitEndpoint(const struct sockaddr_in* endpoint); | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 326 | virtual status_t        setNextPlayer(const sp<IMediaPlayer>& player); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 327 |  | 
|  | 328 | sp<MediaPlayerBase>     createPlayer(player_type playerType); | 
| Andreas Huber | 2db8455 | 2010-01-28 11:19:57 -0800 | [diff] [blame] | 329 |  | 
| Dave Burke | d681bbb | 2011-08-30 14:39:17 +0100 | [diff] [blame] | 330 | virtual status_t        setDataSource( | 
| Andreas Huber | 2db8455 | 2010-01-28 11:19:57 -0800 | [diff] [blame] | 331 | const char *url, | 
|  | 332 | const KeyedVector<String8, String8> *headers); | 
|  | 333 |  | 
| Dave Burke | d681bbb | 2011-08-30 14:39:17 +0100 | [diff] [blame] | 334 | virtual status_t        setDataSource(int fd, int64_t offset, int64_t length); | 
| Andreas Huber | e2b1028 | 2010-11-23 11:41:34 -0800 | [diff] [blame] | 335 |  | 
| Dave Burke | d681bbb | 2011-08-30 14:39:17 +0100 | [diff] [blame] | 336 | virtual status_t        setDataSource(const sp<IStreamSource> &source); | 
| Andreas Huber | e2b1028 | 2010-11-23 11:41:34 -0800 | [diff] [blame] | 337 |  | 
| John Grossman | c795b64 | 2012-02-22 15:38:35 -0800 | [diff] [blame] | 338 | sp<MediaPlayerBase>     setDataSource_pre(player_type playerType); | 
|  | 339 | void                    setDataSource_post(const sp<MediaPlayerBase>& p, | 
|  | 340 | status_t status); | 
|  | 341 |  | 
|  | 342 | player_type             getPlayerType(int fd, int64_t offset, int64_t length); | 
|  | 343 | player_type             getPlayerType(const char* url); | 
|  | 344 | player_type             getPlayerType(const sp<IStreamSource> &source); | 
|  | 345 |  | 
| Gloria Wang | b483c47 | 2011-04-11 17:23:27 -0700 | [diff] [blame] | 346 | static  void            notify(void* cookie, int msg, | 
|  | 347 | int ext1, int ext2, const Parcel *obj); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 348 |  | 
|  | 349 | pid_t           pid() const { return mPid; } | 
|  | 350 | virtual status_t        dump(int fd, const Vector<String16>& args) const; | 
|  | 351 |  | 
| Eric Laurent | a514bdb | 2010-06-21 09:27:30 -0700 | [diff] [blame] | 352 | int             getAudioSessionId() { return mAudioSessionId; } | 
|  | 353 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 354 | private: | 
|  | 355 | friend class MediaPlayerService; | 
|  | 356 | Client( const sp<MediaPlayerService>& service, | 
|  | 357 | pid_t pid, | 
|  | 358 | int32_t connId, | 
| Eric Laurent | a514bdb | 2010-06-21 09:27:30 -0700 | [diff] [blame] | 359 | const sp<IMediaPlayerClient>& client, | 
| Andreas Huber | 9b80c2b | 2011-06-30 15:47:02 -0700 | [diff] [blame] | 360 | int audioSessionId, | 
|  | 361 | uid_t uid); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 362 | Client(); | 
|  | 363 | virtual                 ~Client(); | 
|  | 364 |  | 
|  | 365 | void            deletePlayer(); | 
|  | 366 |  | 
|  | 367 | sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; } | 
|  | 368 |  | 
| Nicolas Catania | a7e0e8b | 2009-07-08 08:57:42 -0700 | [diff] [blame] | 369 |  | 
| Nicolas Catania | 4829038 | 2009-07-10 13:53:06 -0700 | [diff] [blame] | 370 |  | 
|  | 371 | // @param type Of the metadata to be tested. | 
|  | 372 | // @return true if the metadata should be dropped according to | 
|  | 373 | //              the filters. | 
| niko | a64c8c7 | 2009-07-20 15:07:26 -0700 | [diff] [blame] | 374 | bool shouldDropMetadata(media::Metadata::Type type) const; | 
| Nicolas Catania | 4829038 | 2009-07-10 13:53:06 -0700 | [diff] [blame] | 375 |  | 
|  | 376 | // Add a new element to the set of metadata updated. Noop if | 
|  | 377 | // the element exists already. | 
|  | 378 | // @param type Of the metadata to be recorded. | 
| niko | a64c8c7 | 2009-07-20 15:07:26 -0700 | [diff] [blame] | 379 | void addNewMetadataUpdate(media::Metadata::Type type); | 
| Nicolas Catania | a7e0e8b | 2009-07-08 08:57:42 -0700 | [diff] [blame] | 380 |  | 
| Jamie Gennis | 7dae00b | 2011-10-26 18:36:31 -0700 | [diff] [blame] | 381 | // Disconnect from the currently connected ANativeWindow. | 
|  | 382 | void disconnectNativeWindow(); | 
|  | 383 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 384 | mutable     Mutex                       mLock; | 
|  | 385 | sp<MediaPlayerBase>         mPlayer; | 
|  | 386 | sp<MediaPlayerService>      mService; | 
|  | 387 | sp<IMediaPlayerClient>      mClient; | 
|  | 388 | sp<AudioOutput>             mAudioOutput; | 
|  | 389 | pid_t                       mPid; | 
|  | 390 | status_t                    mStatus; | 
|  | 391 | bool                        mLoop; | 
|  | 392 | int32_t                     mConnId; | 
| Eric Laurent | a514bdb | 2010-06-21 09:27:30 -0700 | [diff] [blame] | 393 | int                         mAudioSessionId; | 
| Andreas Huber | 9b80c2b | 2011-06-30 15:47:02 -0700 | [diff] [blame] | 394 | uid_t                       mUID; | 
| Jamie Gennis | 7dae00b | 2011-10-26 18:36:31 -0700 | [diff] [blame] | 395 | sp<ANativeWindow>           mConnectedWindow; | 
|  | 396 | sp<IBinder>                 mConnectedWindowBinder; | 
| John Grossman | c795b64 | 2012-02-22 15:38:35 -0800 | [diff] [blame] | 397 | struct sockaddr_in          mRetransmitEndpoint; | 
|  | 398 | bool                        mRetransmitEndpointValid; | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 399 | sp<Client>                  mNextClient; | 
| Nicolas Catania | 4829038 | 2009-07-10 13:53:06 -0700 | [diff] [blame] | 400 |  | 
| Nicolas Catania | a7e0e8b | 2009-07-08 08:57:42 -0700 | [diff] [blame] | 401 | // Metadata filters. | 
| niko | a64c8c7 | 2009-07-20 15:07:26 -0700 | [diff] [blame] | 402 | media::Metadata::Filter mMetadataAllow;  // protected by mLock | 
|  | 403 | media::Metadata::Filter mMetadataDrop;  // protected by mLock | 
| Nicolas Catania | 4829038 | 2009-07-10 13:53:06 -0700 | [diff] [blame] | 404 |  | 
|  | 405 | // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE | 
|  | 406 | // notification we try to update mMetadataUpdated which is a | 
|  | 407 | // set: no duplicate. | 
|  | 408 | // getMetadata clears this set. | 
| niko | a64c8c7 | 2009-07-20 15:07:26 -0700 | [diff] [blame] | 409 | media::Metadata::Filter mMetadataUpdated;  // protected by mLock | 
| Nicolas Catania | 4829038 | 2009-07-10 13:53:06 -0700 | [diff] [blame] | 410 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 411 | #if CALLBACK_ANTAGONIZER | 
|  | 412 | Antagonizer*                mAntagonizer; | 
|  | 413 | #endif | 
| Marco Nelissen | 6b74d67 | 2012-02-28 16:07:44 -0800 | [diff] [blame] | 414 | }; // Client | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 415 |  | 
|  | 416 | // ---------------------------------------------------------------------------- | 
|  | 417 |  | 
|  | 418 | MediaPlayerService(); | 
|  | 419 | virtual                 ~MediaPlayerService(); | 
|  | 420 |  | 
|  | 421 | mutable     Mutex                       mLock; | 
|  | 422 | SortedVector< wp<Client> >  mClients; | 
| Gloria Wang | dac6a31 | 2009-10-29 15:46:37 -0700 | [diff] [blame] | 423 | SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 424 | int32_t                     mNextConnId; | 
| Andreas Huber | 318ad9c | 2009-10-15 13:46:54 -0700 | [diff] [blame] | 425 | sp<IOMX>                    mOMX; | 
| Andreas Huber | ed3e3e0 | 2012-03-26 11:13:27 -0700 | [diff] [blame] | 426 | sp<ICrypto>                 mCrypto; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 427 | }; | 
|  | 428 |  | 
|  | 429 | // ---------------------------------------------------------------------------- | 
|  | 430 |  | 
|  | 431 | }; // namespace android | 
|  | 432 |  | 
|  | 433 | #endif // ANDROID_MEDIAPLAYERSERVICE_H |