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