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