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