xref: /aosp_15_r20/frameworks/av/media/libmediaplayerservice/MediaPlayerService.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2008, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_MEDIAPLAYERSERVICE_H
19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIAPLAYERSERVICE_H
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <arpa/inet.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <string>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include <utils/threads.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversion.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioContainers.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioResamplerPublic.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioSystem.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioTrack.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaPlayerInterface.h>
36*ec779b8eSAndroid Build Coastguard Worker #include <media/Metadata.h>
37*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ABase.h>
38*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/Synchronization.h>
39*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h>
40*ec779b8eSAndroid Build Coastguard Worker 
41*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h>
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker namespace android {
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState;
46*ec779b8eSAndroid Build Coastguard Worker 
47*ec779b8eSAndroid Build Coastguard Worker struct AVSyncSettings;
48*ec779b8eSAndroid Build Coastguard Worker class DeathNotifier;
49*ec779b8eSAndroid Build Coastguard Worker class IDataSource;
50*ec779b8eSAndroid Build Coastguard Worker class IMediaRecorder;
51*ec779b8eSAndroid Build Coastguard Worker class IMediaMetadataRetriever;
52*ec779b8eSAndroid Build Coastguard Worker class IRemoteDisplay;
53*ec779b8eSAndroid Build Coastguard Worker class IRemoteDisplayClient;
54*ec779b8eSAndroid Build Coastguard Worker class MediaRecorderClient;
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker #define CALLBACK_ANTAGONIZER 0
57*ec779b8eSAndroid Build Coastguard Worker #if CALLBACK_ANTAGONIZER
58*ec779b8eSAndroid Build Coastguard Worker class Antagonizer {
59*ec779b8eSAndroid Build Coastguard Worker public:
60*ec779b8eSAndroid Build Coastguard Worker     Antagonizer(const sp<MediaPlayerBase::Listener> &listener);
start()61*ec779b8eSAndroid Build Coastguard Worker     void start() { mActive = true; }
stop()62*ec779b8eSAndroid Build Coastguard Worker     void stop() { mActive = false; }
63*ec779b8eSAndroid Build Coastguard Worker     void kill();
64*ec779b8eSAndroid Build Coastguard Worker private:
65*ec779b8eSAndroid Build Coastguard Worker     static const int interval;
66*ec779b8eSAndroid Build Coastguard Worker     Antagonizer();
67*ec779b8eSAndroid Build Coastguard Worker     static int callbackThread(void* cookie);
68*ec779b8eSAndroid Build Coastguard Worker     Mutex                         mLock;
69*ec779b8eSAndroid Build Coastguard Worker     Condition                     mCondition;
70*ec779b8eSAndroid Build Coastguard Worker     bool                          mExit;
71*ec779b8eSAndroid Build Coastguard Worker     bool                          mActive;
72*ec779b8eSAndroid Build Coastguard Worker     sp<MediaPlayerBase::Listener> mListener;
73*ec779b8eSAndroid Build Coastguard Worker };
74*ec779b8eSAndroid Build Coastguard Worker #endif
75*ec779b8eSAndroid Build Coastguard Worker 
76*ec779b8eSAndroid Build Coastguard Worker class MediaPlayerService : public BnMediaPlayerService
77*ec779b8eSAndroid Build Coastguard Worker {
78*ec779b8eSAndroid Build Coastguard Worker     class Client;
79*ec779b8eSAndroid Build Coastguard Worker 
80*ec779b8eSAndroid Build Coastguard Worker     class AudioOutput : public MediaPlayerBase::AudioSink
81*ec779b8eSAndroid Build Coastguard Worker     {
82*ec779b8eSAndroid Build Coastguard Worker         class CallbackData;
83*ec779b8eSAndroid Build Coastguard Worker 
84*ec779b8eSAndroid Build Coastguard Worker      public:
85*ec779b8eSAndroid Build Coastguard Worker                                 AudioOutput(
86*ec779b8eSAndroid Build Coastguard Worker                                         audio_session_t sessionId,
87*ec779b8eSAndroid Build Coastguard Worker                                         const AttributionSourceState& attributionSource,
88*ec779b8eSAndroid Build Coastguard Worker                                         const audio_attributes_t * attr,
89*ec779b8eSAndroid Build Coastguard Worker                                         const sp<AudioSystem::AudioDeviceCallback>& deviceCallback);
90*ec779b8eSAndroid Build Coastguard Worker         virtual                 ~AudioOutput();
91*ec779b8eSAndroid Build Coastguard Worker 
ready()92*ec779b8eSAndroid Build Coastguard Worker         virtual bool            ready() const { return mTrack != 0; }
93*ec779b8eSAndroid Build Coastguard Worker         virtual ssize_t         bufferSize() const;
94*ec779b8eSAndroid Build Coastguard Worker         virtual ssize_t         frameCount() const;
95*ec779b8eSAndroid Build Coastguard Worker         virtual ssize_t         channelCount() const;
96*ec779b8eSAndroid Build Coastguard Worker         virtual ssize_t         frameSize() const;
97*ec779b8eSAndroid Build Coastguard Worker         virtual uint32_t        latency() const;
98*ec779b8eSAndroid Build Coastguard Worker         virtual float           msecsPerFrame() const;
99*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getPosition(uint32_t *position) const;
100*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getTimestamp(AudioTimestamp &ts) const;
101*ec779b8eSAndroid Build Coastguard Worker         virtual int64_t         getPlayedOutDurationUs(int64_t nowUs) const;
102*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getFramesWritten(uint32_t *frameswritten) const;
103*ec779b8eSAndroid Build Coastguard Worker         virtual audio_session_t getSessionId() const;
104*ec779b8eSAndroid Build Coastguard Worker         virtual uint32_t        getSampleRate() const;
105*ec779b8eSAndroid Build Coastguard Worker         virtual int64_t         getBufferDurationInUs() const;
getFlags()106*ec779b8eSAndroid Build Coastguard Worker         virtual audio_output_flags_t getFlags() const { return mFlags; }
107*ec779b8eSAndroid Build Coastguard Worker 
108*ec779b8eSAndroid Build Coastguard Worker         status_t open(
109*ec779b8eSAndroid Build Coastguard Worker                 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
110*ec779b8eSAndroid Build Coastguard Worker                 audio_format_t format, int bufferCount,
111*ec779b8eSAndroid Build Coastguard Worker                 AudioCallback cb, const wp<RefBase>& cookie,
112*ec779b8eSAndroid Build Coastguard Worker                 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
113*ec779b8eSAndroid Build Coastguard Worker                 const audio_offload_info_t *offloadInfo = NULL,
114*ec779b8eSAndroid Build Coastguard Worker                 bool doNotReconnect = false,
115*ec779b8eSAndroid Build Coastguard Worker                 uint32_t suggestedFrameCount = 0) override;
116*ec779b8eSAndroid Build Coastguard Worker 
117*ec779b8eSAndroid Build Coastguard Worker         virtual void            setPlayerIId(int32_t playerIId);
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        start();
120*ec779b8eSAndroid Build Coastguard Worker         virtual ssize_t         write(const void* buffer, size_t size, bool blocking = true);
121*ec779b8eSAndroid Build Coastguard Worker         virtual void            stop();
122*ec779b8eSAndroid Build Coastguard Worker         virtual void            flush();
123*ec779b8eSAndroid Build Coastguard Worker         virtual void            pause();
124*ec779b8eSAndroid Build Coastguard Worker         virtual void            close();
125*ec779b8eSAndroid Build Coastguard Worker                 void            setAudioStreamType(audio_stream_type_t streamType);
getAudioStreamType()126*ec779b8eSAndroid Build Coastguard Worker         virtual audio_stream_type_t getAudioStreamType() const { return mStreamType; }
127*ec779b8eSAndroid Build Coastguard Worker                 void            setAudioAttributes(const audio_attributes_t * attributes);
128*ec779b8eSAndroid Build Coastguard Worker 
129*ec779b8eSAndroid Build Coastguard Worker                 void            setVolume(float left, float right);
130*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setPlaybackRate(const AudioPlaybackRate& rate);
131*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getPlaybackRate(AudioPlaybackRate* rate /* nonnull */);
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker                 status_t        setAuxEffectSendLevel(float level);
134*ec779b8eSAndroid Build Coastguard Worker                 status_t        attachAuxEffect(int effectId);
135*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        dump(int fd, const Vector<String16>& args) const;
136*ec779b8eSAndroid Build Coastguard Worker 
137*ec779b8eSAndroid Build Coastguard Worker         static bool             isOnEmulator();
138*ec779b8eSAndroid Build Coastguard Worker         static int              getMinBufferCount();
139*ec779b8eSAndroid Build Coastguard Worker                 void            setNextOutput(const sp<AudioOutput>& nextOutput);
140*ec779b8eSAndroid Build Coastguard Worker                 void            switchToNextOutput();
needsTrailingPadding()141*ec779b8eSAndroid Build Coastguard Worker         virtual bool            needsTrailingPadding() { return mNextOutput == NULL; }
142*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setParameters(const String8& keyValuePairs);
143*ec779b8eSAndroid Build Coastguard Worker         virtual String8         getParameters(const String8& keys);
144*ec779b8eSAndroid Build Coastguard Worker 
145*ec779b8eSAndroid Build Coastguard Worker         virtual media::VolumeShaper::Status applyVolumeShaper(
146*ec779b8eSAndroid Build Coastguard Worker                                         const sp<media::VolumeShaper::Configuration>& configuration,
147*ec779b8eSAndroid Build Coastguard Worker                                         const sp<media::VolumeShaper::Operation>& operation) override;
148*ec779b8eSAndroid Build Coastguard Worker         virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
149*ec779b8eSAndroid Build Coastguard Worker 
150*ec779b8eSAndroid Build Coastguard Worker         // AudioRouting
151*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setOutputDevice(audio_port_handle_t deviceId);
152*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getRoutedDeviceIds(DeviceIdVector& deviceIds);
153*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        enableAudioDeviceCallback(bool enabled);
154*ec779b8eSAndroid Build Coastguard Worker 
155*ec779b8eSAndroid Build Coastguard Worker     private:
156*ec779b8eSAndroid Build Coastguard Worker         static void             setMinBufferCount();
157*ec779b8eSAndroid Build Coastguard Worker         static void             CallbackWrapper(
158*ec779b8eSAndroid Build Coastguard Worker                 int event, void *me, void *info);
159*ec779b8eSAndroid Build Coastguard Worker                void             deleteRecycledTrack_l();
160*ec779b8eSAndroid Build Coastguard Worker                void             close_l();
161*ec779b8eSAndroid Build Coastguard Worker            status_t             updateTrack();
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker         sp<AudioTrack>          mTrack;
164*ec779b8eSAndroid Build Coastguard Worker         sp<AudioTrack>          mRecycledTrack;
165*ec779b8eSAndroid Build Coastguard Worker         sp<AudioOutput>         mNextOutput;
166*ec779b8eSAndroid Build Coastguard Worker         int                     mCachedPlayerIId;
167*ec779b8eSAndroid Build Coastguard Worker         AudioCallback           mCallback;
168*ec779b8eSAndroid Build Coastguard Worker         wp<RefBase>             mCallbackCookie;
169*ec779b8eSAndroid Build Coastguard Worker         sp<CallbackData>        mCallbackData;
170*ec779b8eSAndroid Build Coastguard Worker         audio_stream_type_t     mStreamType;
171*ec779b8eSAndroid Build Coastguard Worker         audio_attributes_t *    mAttributes;
172*ec779b8eSAndroid Build Coastguard Worker         float                   mLeftVolume;
173*ec779b8eSAndroid Build Coastguard Worker         float                   mRightVolume;
174*ec779b8eSAndroid Build Coastguard Worker         AudioPlaybackRate       mPlaybackRate;
175*ec779b8eSAndroid Build Coastguard Worker         uint32_t                mSampleRateHz; // sample rate of the content, as set in open()
176*ec779b8eSAndroid Build Coastguard Worker         float                   mMsecsPerFrame;
177*ec779b8eSAndroid Build Coastguard Worker         size_t                  mFrameSize;
178*ec779b8eSAndroid Build Coastguard Worker         audio_session_t         mSessionId;
179*ec779b8eSAndroid Build Coastguard Worker         AttributionSourceState  mAttributionSource;
180*ec779b8eSAndroid Build Coastguard Worker         float                   mSendLevel;
181*ec779b8eSAndroid Build Coastguard Worker         int                     mAuxEffectId;
182*ec779b8eSAndroid Build Coastguard Worker         audio_output_flags_t    mFlags;
183*ec779b8eSAndroid Build Coastguard Worker         sp<media::VolumeHandler>       mVolumeHandler;
184*ec779b8eSAndroid Build Coastguard Worker         audio_port_handle_t     mSelectedDeviceId;
185*ec779b8eSAndroid Build Coastguard Worker         DeviceIdVector          mRoutedDeviceIds;
186*ec779b8eSAndroid Build Coastguard Worker         bool                    mDeviceCallbackEnabled;
187*ec779b8eSAndroid Build Coastguard Worker         wp<AudioSystem::AudioDeviceCallback>        mDeviceCallback;
188*ec779b8eSAndroid Build Coastguard Worker         mutable Mutex           mLock;
189*ec779b8eSAndroid Build Coastguard Worker 
190*ec779b8eSAndroid Build Coastguard Worker         // static variables below not protected by mutex
191*ec779b8eSAndroid Build Coastguard Worker         static bool             mIsOnEmulator;
192*ec779b8eSAndroid Build Coastguard Worker         static int              mMinBufferCount;  // 12 for emulator; otherwise 4
193*ec779b8eSAndroid Build Coastguard Worker 
194*ec779b8eSAndroid Build Coastguard Worker         // CallbackData is what is passed to the AudioTrack as the "user" data.
195*ec779b8eSAndroid Build Coastguard Worker         // We need to be able to target this to a different Output on the fly,
196*ec779b8eSAndroid Build Coastguard Worker         // so we can't use the Output itself for this.
197*ec779b8eSAndroid Build Coastguard Worker         class CallbackData : public AudioTrack::IAudioTrackCallback {
198*ec779b8eSAndroid Build Coastguard Worker             friend AudioOutput;
199*ec779b8eSAndroid Build Coastguard Worker         public:
CallbackData(const wp<AudioOutput> & cookie)200*ec779b8eSAndroid Build Coastguard Worker             explicit CallbackData(const wp<AudioOutput>& cookie) {
201*ec779b8eSAndroid Build Coastguard Worker                 mData = cookie;
202*ec779b8eSAndroid Build Coastguard Worker                 mSwitching = false;
203*ec779b8eSAndroid Build Coastguard Worker             }
getOutput()204*ec779b8eSAndroid Build Coastguard Worker             sp<AudioOutput> getOutput() const { return mData.load().promote(); }
setOutput(const wp<AudioOutput> & newcookie)205*ec779b8eSAndroid Build Coastguard Worker             void            setOutput(const wp<AudioOutput>& newcookie) { mData.store(newcookie); }
206*ec779b8eSAndroid Build Coastguard Worker             // lock/unlock are used by the callback before accessing the payload of this object
lock()207*ec779b8eSAndroid Build Coastguard Worker             void            lock() const { mLock.lock(); }
unlock()208*ec779b8eSAndroid Build Coastguard Worker             void            unlock() const { mLock.unlock(); }
209*ec779b8eSAndroid Build Coastguard Worker 
210*ec779b8eSAndroid Build Coastguard Worker             // tryBeginTrackSwitch/endTrackSwitch are used when the CallbackData is handed over
211*ec779b8eSAndroid Build Coastguard Worker             // to the next sink.
212*ec779b8eSAndroid Build Coastguard Worker 
213*ec779b8eSAndroid Build Coastguard Worker             // tryBeginTrackSwitch() returns true only if it obtains the lock.
tryBeginTrackSwitch()214*ec779b8eSAndroid Build Coastguard Worker             bool            tryBeginTrackSwitch() {
215*ec779b8eSAndroid Build Coastguard Worker                 LOG_ALWAYS_FATAL_IF(mSwitching, "tryBeginTrackSwitch() already called");
216*ec779b8eSAndroid Build Coastguard Worker                 if (mLock.tryLock() != OK) {
217*ec779b8eSAndroid Build Coastguard Worker                     return false;
218*ec779b8eSAndroid Build Coastguard Worker                 }
219*ec779b8eSAndroid Build Coastguard Worker                 mSwitching = true;
220*ec779b8eSAndroid Build Coastguard Worker                 return true;
221*ec779b8eSAndroid Build Coastguard Worker             }
endTrackSwitch()222*ec779b8eSAndroid Build Coastguard Worker             void            endTrackSwitch() {
223*ec779b8eSAndroid Build Coastguard Worker                 if (mSwitching) {
224*ec779b8eSAndroid Build Coastguard Worker                     mLock.unlock();
225*ec779b8eSAndroid Build Coastguard Worker                 }
226*ec779b8eSAndroid Build Coastguard Worker                 mSwitching = false;
227*ec779b8eSAndroid Build Coastguard Worker             }
228*ec779b8eSAndroid Build Coastguard Worker         protected:
229*ec779b8eSAndroid Build Coastguard Worker             size_t onMoreData(const AudioTrack::Buffer& buffer) override;
230*ec779b8eSAndroid Build Coastguard Worker             void onUnderrun() override;
231*ec779b8eSAndroid Build Coastguard Worker             void onStreamEnd() override;
232*ec779b8eSAndroid Build Coastguard Worker             void onNewIAudioTrack() override;
233*ec779b8eSAndroid Build Coastguard Worker         private:
234*ec779b8eSAndroid Build Coastguard Worker             mediautils::atomic_wp<AudioOutput> mData;
235*ec779b8eSAndroid Build Coastguard Worker             mutable Mutex   mLock; // a recursive mutex might make this unnecessary.
236*ec779b8eSAndroid Build Coastguard Worker             bool            mSwitching;
237*ec779b8eSAndroid Build Coastguard Worker             DISALLOW_EVIL_CONSTRUCTORS(CallbackData);
238*ec779b8eSAndroid Build Coastguard Worker         };
239*ec779b8eSAndroid Build Coastguard Worker 
240*ec779b8eSAndroid Build Coastguard Worker     }; // AudioOutput
241*ec779b8eSAndroid Build Coastguard Worker 
242*ec779b8eSAndroid Build Coastguard Worker public:
243*ec779b8eSAndroid Build Coastguard Worker     static  void                instantiate();
244*ec779b8eSAndroid Build Coastguard Worker 
245*ec779b8eSAndroid Build Coastguard Worker     // IMediaPlayerService interface
246*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaRecorder> createMediaRecorder(const AttributionSourceState &attributionSource);
247*ec779b8eSAndroid Build Coastguard Worker     void    removeMediaRecorderClient(const wp<MediaRecorderClient>& client);
248*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaMetadataRetriever> createMetadataRetriever();
249*ec779b8eSAndroid Build Coastguard Worker 
250*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaPlayer>    create(const sp<IMediaPlayerClient>& client,
251*ec779b8eSAndroid Build Coastguard Worker                                        audio_session_t audioSessionId,
252*ec779b8eSAndroid Build Coastguard Worker                                        const AttributionSourceState& attributionSource);
253*ec779b8eSAndroid Build Coastguard Worker 
254*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaCodecList> getCodecList() const;
255*ec779b8eSAndroid Build Coastguard Worker 
256*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,
257*ec779b8eSAndroid Build Coastguard Worker             const sp<IRemoteDisplayClient>& client, const String8& iface);
258*ec779b8eSAndroid Build Coastguard Worker     virtual status_t            dump(int fd, const Vector<String16>& args);
259*ec779b8eSAndroid Build Coastguard Worker 
260*ec779b8eSAndroid Build Coastguard Worker             void                removeClient(const wp<Client>& client);
261*ec779b8eSAndroid Build Coastguard Worker             bool                hasClient(wp<Client> client);
262*ec779b8eSAndroid Build Coastguard Worker 
263*ec779b8eSAndroid Build Coastguard Worker     enum {
264*ec779b8eSAndroid Build Coastguard Worker         MEDIASERVER_PROCESS_DEATH = 0,
265*ec779b8eSAndroid Build Coastguard Worker         MEDIAEXTRACTOR_PROCESS_DEATH = 1,
266*ec779b8eSAndroid Build Coastguard Worker         MEDIACODEC_PROCESS_DEATH = 2,
267*ec779b8eSAndroid Build Coastguard Worker         AUDIO_PROCESS_DEATH = 3,   // currently no need to track this
268*ec779b8eSAndroid Build Coastguard Worker         CAMERA_PROCESS_DEATH = 4
269*ec779b8eSAndroid Build Coastguard Worker     };
270*ec779b8eSAndroid Build Coastguard Worker 
271*ec779b8eSAndroid Build Coastguard Worker     // Collect info of the codec usage from media player and media recorder
272*ec779b8eSAndroid Build Coastguard Worker     virtual void                addBatteryData(uint32_t params);
273*ec779b8eSAndroid Build Coastguard Worker     // API for the Battery app to pull the data of codecs usage
274*ec779b8eSAndroid Build Coastguard Worker     virtual status_t            pullBatteryData(Parcel* reply);
275*ec779b8eSAndroid Build Coastguard Worker private:
276*ec779b8eSAndroid Build Coastguard Worker     struct BatteryTracker {
277*ec779b8eSAndroid Build Coastguard Worker         BatteryTracker();
278*ec779b8eSAndroid Build Coastguard Worker         // Collect info of the codec usage from media player and media recorder
279*ec779b8eSAndroid Build Coastguard Worker         void addBatteryData(uint32_t params);
280*ec779b8eSAndroid Build Coastguard Worker         // API for the Battery app to pull the data of codecs usage
281*ec779b8eSAndroid Build Coastguard Worker         status_t pullBatteryData(Parcel* reply);
282*ec779b8eSAndroid Build Coastguard Worker 
283*ec779b8eSAndroid Build Coastguard Worker     private:
284*ec779b8eSAndroid Build Coastguard Worker         // For battery usage tracking purpose
285*ec779b8eSAndroid Build Coastguard Worker         struct BatteryUsageInfo {
286*ec779b8eSAndroid Build Coastguard Worker             // how many streams are being played by one UID
287*ec779b8eSAndroid Build Coastguard Worker             int     refCount;
288*ec779b8eSAndroid Build Coastguard Worker             // a temp variable to store the duration(ms) of audio codecs
289*ec779b8eSAndroid Build Coastguard Worker             // when we start a audio codec, we minus the system time from audioLastTime
290*ec779b8eSAndroid Build Coastguard Worker             // when we pause it, we add the system time back to the audioLastTime
291*ec779b8eSAndroid Build Coastguard Worker             // so after the pause, audioLastTime = pause time - start time
292*ec779b8eSAndroid Build Coastguard Worker             // if multiple audio streams are played (or recorded), then audioLastTime
293*ec779b8eSAndroid Build Coastguard Worker             // = the total playing time of all the streams
294*ec779b8eSAndroid Build Coastguard Worker             int32_t audioLastTime;
295*ec779b8eSAndroid Build Coastguard Worker             // when all the audio streams are being paused, we assign audioLastTime to
296*ec779b8eSAndroid Build Coastguard Worker             // this variable, so this value could be provided to the battery app
297*ec779b8eSAndroid Build Coastguard Worker             // in the next pullBatteryData call
298*ec779b8eSAndroid Build Coastguard Worker             int32_t audioTotalTime;
299*ec779b8eSAndroid Build Coastguard Worker 
300*ec779b8eSAndroid Build Coastguard Worker             int32_t videoLastTime;
301*ec779b8eSAndroid Build Coastguard Worker             int32_t videoTotalTime;
302*ec779b8eSAndroid Build Coastguard Worker         };
303*ec779b8eSAndroid Build Coastguard Worker         KeyedVector<int, BatteryUsageInfo>    mBatteryData;
304*ec779b8eSAndroid Build Coastguard Worker 
305*ec779b8eSAndroid Build Coastguard Worker         enum {
306*ec779b8eSAndroid Build Coastguard Worker             SPEAKER,
307*ec779b8eSAndroid Build Coastguard Worker             OTHER_AUDIO_DEVICE,
308*ec779b8eSAndroid Build Coastguard Worker             SPEAKER_AND_OTHER,
309*ec779b8eSAndroid Build Coastguard Worker             NUM_AUDIO_DEVICES
310*ec779b8eSAndroid Build Coastguard Worker         };
311*ec779b8eSAndroid Build Coastguard Worker 
312*ec779b8eSAndroid Build Coastguard Worker         struct BatteryAudioFlingerUsageInfo {
313*ec779b8eSAndroid Build Coastguard Worker             int refCount; // how many audio streams are being played
314*ec779b8eSAndroid Build Coastguard Worker             int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used
315*ec779b8eSAndroid Build Coastguard Worker             int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms
316*ec779b8eSAndroid Build Coastguard Worker             // totalTime[]: total time of audio output devices usage
317*ec779b8eSAndroid Build Coastguard Worker             int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms
318*ec779b8eSAndroid Build Coastguard Worker         };
319*ec779b8eSAndroid Build Coastguard Worker 
320*ec779b8eSAndroid Build Coastguard Worker         // This varialble is used to record the usage of audio output device
321*ec779b8eSAndroid Build Coastguard Worker         // for battery app
322*ec779b8eSAndroid Build Coastguard Worker         BatteryAudioFlingerUsageInfo mBatteryAudio;
323*ec779b8eSAndroid Build Coastguard Worker 
324*ec779b8eSAndroid Build Coastguard Worker         mutable Mutex mLock;
325*ec779b8eSAndroid Build Coastguard Worker     };
326*ec779b8eSAndroid Build Coastguard Worker     BatteryTracker mBatteryTracker;
327*ec779b8eSAndroid Build Coastguard Worker 
328*ec779b8eSAndroid Build Coastguard Worker     class Client : public BnMediaPlayer {
329*ec779b8eSAndroid Build Coastguard Worker         // IMediaPlayer interface
330*ec779b8eSAndroid Build Coastguard Worker         virtual void            disconnect();
331*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setVideoSurfaceTexture(
332*ec779b8eSAndroid Build Coastguard Worker                                         const sp<IGraphicBufferProducer>& bufferProducer);
333*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setBufferingSettings(const BufferingSettings& buffering) override;
334*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getBufferingSettings(
335*ec779b8eSAndroid Build Coastguard Worker                                         BufferingSettings* buffering /* nonnull */) override;
336*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        prepareAsync();
337*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        start();
338*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        stop();
339*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        pause();
340*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        isPlaying(bool* state);
341*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setPlaybackSettings(const AudioPlaybackRate& rate);
342*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
343*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setSyncSettings(const AVSyncSettings& rate, float videoFpsHint);
344*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getSyncSettings(AVSyncSettings* rate /* nonnull */,
345*ec779b8eSAndroid Build Coastguard Worker                                                 float* videoFps /* nonnull */);
346*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        seekTo(
347*ec779b8eSAndroid Build Coastguard Worker                 int msec,
348*ec779b8eSAndroid Build Coastguard Worker                 MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC);
349*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getCurrentPosition(int* msec);
350*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getDuration(int* msec);
351*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        reset();
352*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        notifyAt(int64_t mediaTimeUs);
353*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setAudioStreamType(audio_stream_type_t type);
354*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setLooping(int loop);
355*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setVolume(float leftVolume, float rightVolume);
356*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        invoke(const Parcel& request, Parcel *reply);
357*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setMetadataFilter(const Parcel& filter);
358*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getMetadata(bool update_only,
359*ec779b8eSAndroid Build Coastguard Worker                                             bool apply_filter,
360*ec779b8eSAndroid Build Coastguard Worker                                             Parcel *reply);
361*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setAuxEffectSendLevel(float level);
362*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        attachAuxEffect(int effectId);
363*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setParameter(int key, const Parcel &request);
364*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getParameter(int key, Parcel *reply);
365*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setRetransmitEndpoint(const struct sockaddr_in* endpoint);
366*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        getRetransmitEndpoint(struct sockaddr_in* endpoint);
367*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setNextPlayer(const sp<IMediaPlayer>& player);
368*ec779b8eSAndroid Build Coastguard Worker 
369*ec779b8eSAndroid Build Coastguard Worker         virtual media::VolumeShaper::Status applyVolumeShaper(
370*ec779b8eSAndroid Build Coastguard Worker                                         const sp<media::VolumeShaper::Configuration>& configuration,
371*ec779b8eSAndroid Build Coastguard Worker                                         const sp<media::VolumeShaper::Operation>& operation) override;
372*ec779b8eSAndroid Build Coastguard Worker         virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
373*ec779b8eSAndroid Build Coastguard Worker 
374*ec779b8eSAndroid Build Coastguard Worker         sp<MediaPlayerBase>     createPlayer(player_type playerType);
375*ec779b8eSAndroid Build Coastguard Worker 
376*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setDataSource(
377*ec779b8eSAndroid Build Coastguard Worker                         const sp<IMediaHTTPService> &httpService,
378*ec779b8eSAndroid Build Coastguard Worker                         const char *url,
379*ec779b8eSAndroid Build Coastguard Worker                         const KeyedVector<String8, String8> *headers);
380*ec779b8eSAndroid Build Coastguard Worker 
381*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setDataSource(int fd, int64_t offset, int64_t length);
382*ec779b8eSAndroid Build Coastguard Worker 
383*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setDataSource(const sp<IStreamSource> &source);
384*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setDataSource(const sp<IDataSource> &source);
385*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        setDataSource(const String8& rtpParams);
386*ec779b8eSAndroid Build Coastguard Worker 
387*ec779b8eSAndroid Build Coastguard Worker 
388*ec779b8eSAndroid Build Coastguard Worker         sp<MediaPlayerBase>     setDataSource_pre(player_type playerType);
389*ec779b8eSAndroid Build Coastguard Worker         status_t                setDataSource_post(const sp<MediaPlayerBase>& p,
390*ec779b8eSAndroid Build Coastguard Worker                                                    status_t status);
391*ec779b8eSAndroid Build Coastguard Worker 
392*ec779b8eSAndroid Build Coastguard Worker                 void            notify(int msg, int ext1, int ext2, const Parcel *obj);
393*ec779b8eSAndroid Build Coastguard Worker 
pid()394*ec779b8eSAndroid Build Coastguard Worker                 pid_t           pid() const {
395*ec779b8eSAndroid Build Coastguard Worker                     return VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mAttributionSource.pid));
396*ec779b8eSAndroid Build Coastguard Worker                 }
397*ec779b8eSAndroid Build Coastguard Worker         virtual status_t        dump(int fd, const Vector<String16>& args);
398*ec779b8eSAndroid Build Coastguard Worker 
getAudioSessionId()399*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t getAudioSessionId() { return mAudioSessionId; }
400*ec779b8eSAndroid Build Coastguard Worker         // Modular DRM
401*ec779b8eSAndroid Build Coastguard Worker         virtual status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
402*ec779b8eSAndroid Build Coastguard Worker         virtual status_t releaseDrm();
403*ec779b8eSAndroid Build Coastguard Worker         // AudioRouting
404*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setOutputDevice(audio_port_handle_t deviceId);
405*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getRoutedDeviceIds(DeviceIdVector& deviceIds);
406*ec779b8eSAndroid Build Coastguard Worker         virtual status_t enableAudioDeviceCallback(bool enabled);
407*ec779b8eSAndroid Build Coastguard Worker 
408*ec779b8eSAndroid Build Coastguard Worker     private:
409*ec779b8eSAndroid Build Coastguard Worker         class AudioDeviceUpdatedNotifier: public AudioSystem::AudioDeviceCallback
410*ec779b8eSAndroid Build Coastguard Worker         {
411*ec779b8eSAndroid Build Coastguard Worker         public:
AudioDeviceUpdatedNotifier(const sp<MediaPlayerBase> & listener)412*ec779b8eSAndroid Build Coastguard Worker             AudioDeviceUpdatedNotifier(const sp<MediaPlayerBase>& listener) {
413*ec779b8eSAndroid Build Coastguard Worker                 mListener = listener;
414*ec779b8eSAndroid Build Coastguard Worker             }
~AudioDeviceUpdatedNotifier()415*ec779b8eSAndroid Build Coastguard Worker             ~AudioDeviceUpdatedNotifier() {}
416*ec779b8eSAndroid Build Coastguard Worker 
417*ec779b8eSAndroid Build Coastguard Worker             virtual void onAudioDeviceUpdate(audio_io_handle_t audioIo,
418*ec779b8eSAndroid Build Coastguard Worker                                              const DeviceIdVector& deviceIds);
419*ec779b8eSAndroid Build Coastguard Worker 
420*ec779b8eSAndroid Build Coastguard Worker         private:
421*ec779b8eSAndroid Build Coastguard Worker             wp<MediaPlayerBase> mListener;
422*ec779b8eSAndroid Build Coastguard Worker         };
423*ec779b8eSAndroid Build Coastguard Worker 
424*ec779b8eSAndroid Build Coastguard Worker         friend class MediaPlayerService;
425*ec779b8eSAndroid Build Coastguard Worker                                 Client( const sp<MediaPlayerService>& service,
426*ec779b8eSAndroid Build Coastguard Worker                                         const AttributionSourceState& attributionSource,
427*ec779b8eSAndroid Build Coastguard Worker                                         int32_t connId,
428*ec779b8eSAndroid Build Coastguard Worker                                         const sp<IMediaPlayerClient>& client,
429*ec779b8eSAndroid Build Coastguard Worker                                         audio_session_t audioSessionId);
430*ec779b8eSAndroid Build Coastguard Worker                                 Client();
431*ec779b8eSAndroid Build Coastguard Worker         virtual                 ~Client();
432*ec779b8eSAndroid Build Coastguard Worker 
433*ec779b8eSAndroid Build Coastguard Worker                 void            deletePlayer();
434*ec779b8eSAndroid Build Coastguard Worker 
getPlayer()435*ec779b8eSAndroid Build Coastguard Worker         sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
436*ec779b8eSAndroid Build Coastguard Worker 
437*ec779b8eSAndroid Build Coastguard Worker 
438*ec779b8eSAndroid Build Coastguard Worker 
439*ec779b8eSAndroid Build Coastguard Worker         // @param type Of the metadata to be tested.
440*ec779b8eSAndroid Build Coastguard Worker         // @return true if the metadata should be dropped according to
441*ec779b8eSAndroid Build Coastguard Worker         //              the filters.
442*ec779b8eSAndroid Build Coastguard Worker         bool shouldDropMetadata(media::Metadata::Type type) const;
443*ec779b8eSAndroid Build Coastguard Worker 
444*ec779b8eSAndroid Build Coastguard Worker         // Add a new element to the set of metadata updated. Noop if
445*ec779b8eSAndroid Build Coastguard Worker         // the element exists already.
446*ec779b8eSAndroid Build Coastguard Worker         // @param type Of the metadata to be recorded.
447*ec779b8eSAndroid Build Coastguard Worker         void addNewMetadataUpdate(media::Metadata::Type type);
448*ec779b8eSAndroid Build Coastguard Worker 
449*ec779b8eSAndroid Build Coastguard Worker         // Disconnect from the currently connected ANativeWindow.
450*ec779b8eSAndroid Build Coastguard Worker         void disconnectNativeWindow_l();
451*ec779b8eSAndroid Build Coastguard Worker 
452*ec779b8eSAndroid Build Coastguard Worker         status_t setAudioAttributes_l(const Parcel &request);
453*ec779b8eSAndroid Build Coastguard Worker 
454*ec779b8eSAndroid Build Coastguard Worker         class Listener : public MediaPlayerBase::Listener {
455*ec779b8eSAndroid Build Coastguard Worker         public:
Listener(const wp<Client> & client)456*ec779b8eSAndroid Build Coastguard Worker             Listener(const wp<Client> &client) : mClient(client) {}
~Listener()457*ec779b8eSAndroid Build Coastguard Worker             virtual ~Listener() {}
notify(int msg,int ext1,int ext2,const Parcel * obj)458*ec779b8eSAndroid Build Coastguard Worker             virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) {
459*ec779b8eSAndroid Build Coastguard Worker                 sp<Client> client = mClient.promote();
460*ec779b8eSAndroid Build Coastguard Worker                 if (client != NULL) {
461*ec779b8eSAndroid Build Coastguard Worker                     client->notify(msg, ext1, ext2, obj);
462*ec779b8eSAndroid Build Coastguard Worker                 }
463*ec779b8eSAndroid Build Coastguard Worker             }
464*ec779b8eSAndroid Build Coastguard Worker         private:
465*ec779b8eSAndroid Build Coastguard Worker             wp<Client> mClient;
466*ec779b8eSAndroid Build Coastguard Worker         };
467*ec779b8eSAndroid Build Coastguard Worker 
468*ec779b8eSAndroid Build Coastguard Worker         mutable     Mutex                         mLock;
469*ec779b8eSAndroid Build Coastguard Worker                     sp<MediaPlayerBase>           mPlayer;
470*ec779b8eSAndroid Build Coastguard Worker                     sp<MediaPlayerService>        mService;
471*ec779b8eSAndroid Build Coastguard Worker                     sp<IMediaPlayerClient>        mClient;
472*ec779b8eSAndroid Build Coastguard Worker                     sp<AudioOutput>               mAudioOutput;
473*ec779b8eSAndroid Build Coastguard Worker                     const AttributionSourceState  mAttributionSource;
474*ec779b8eSAndroid Build Coastguard Worker                     status_t                      mStatus;
475*ec779b8eSAndroid Build Coastguard Worker                     bool                          mLoop;
476*ec779b8eSAndroid Build Coastguard Worker                     int32_t                       mConnId;
477*ec779b8eSAndroid Build Coastguard Worker                     audio_session_t               mAudioSessionId;
478*ec779b8eSAndroid Build Coastguard Worker                     audio_attributes_t *          mAudioAttributes;
479*ec779b8eSAndroid Build Coastguard Worker                     sp<ANativeWindow>             mConnectedWindow;
480*ec779b8eSAndroid Build Coastguard Worker                     sp<IBinder>                   mConnectedWindowBinder;
481*ec779b8eSAndroid Build Coastguard Worker                     struct sockaddr_in            mRetransmitEndpoint;
482*ec779b8eSAndroid Build Coastguard Worker                     bool                          mRetransmitEndpointValid;
483*ec779b8eSAndroid Build Coastguard Worker                     sp<Client>                    mNextClient;
484*ec779b8eSAndroid Build Coastguard Worker                     sp<MediaPlayerBase::Listener> mListener;
485*ec779b8eSAndroid Build Coastguard Worker 
486*ec779b8eSAndroid Build Coastguard Worker         // Metadata filters.
487*ec779b8eSAndroid Build Coastguard Worker         media::Metadata::Filter mMetadataAllow;  // protected by mLock
488*ec779b8eSAndroid Build Coastguard Worker         media::Metadata::Filter mMetadataDrop;  // protected by mLock
489*ec779b8eSAndroid Build Coastguard Worker 
490*ec779b8eSAndroid Build Coastguard Worker         // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
491*ec779b8eSAndroid Build Coastguard Worker         // notification we try to update mMetadataUpdated which is a
492*ec779b8eSAndroid Build Coastguard Worker         // set: no duplicate.
493*ec779b8eSAndroid Build Coastguard Worker         // getMetadata clears this set.
494*ec779b8eSAndroid Build Coastguard Worker         media::Metadata::Filter mMetadataUpdated;  // protected by mLock
495*ec779b8eSAndroid Build Coastguard Worker 
496*ec779b8eSAndroid Build Coastguard Worker         std::vector<DeathNotifier> mDeathNotifiers;
497*ec779b8eSAndroid Build Coastguard Worker         sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedListener;
498*ec779b8eSAndroid Build Coastguard Worker #if CALLBACK_ANTAGONIZER
499*ec779b8eSAndroid Build Coastguard Worker                     Antagonizer*                  mAntagonizer;
500*ec779b8eSAndroid Build Coastguard Worker #endif
501*ec779b8eSAndroid Build Coastguard Worker     }; // Client
502*ec779b8eSAndroid Build Coastguard Worker 
503*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
504*ec779b8eSAndroid Build Coastguard Worker 
505*ec779b8eSAndroid Build Coastguard Worker                             MediaPlayerService();
506*ec779b8eSAndroid Build Coastguard Worker     virtual                 ~MediaPlayerService();
507*ec779b8eSAndroid Build Coastguard Worker 
508*ec779b8eSAndroid Build Coastguard Worker     mutable     Mutex                       mLock;
509*ec779b8eSAndroid Build Coastguard Worker                 SortedVector< wp<Client> >  mClients;
510*ec779b8eSAndroid Build Coastguard Worker                 SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
511*ec779b8eSAndroid Build Coastguard Worker                 int32_t                     mNextConnId;
512*ec779b8eSAndroid Build Coastguard Worker 
513*ec779b8eSAndroid Build Coastguard Worker #ifdef FUZZ_MODE_MEDIA_PLAYER_SERVICE
514*ec779b8eSAndroid Build Coastguard Worker public:
515*ec779b8eSAndroid Build Coastguard Worker     friend class sp<MediaPlayerService>;
516*ec779b8eSAndroid Build Coastguard Worker     static sp<MediaPlayerService> createForFuzzTesting();
517*ec779b8eSAndroid Build Coastguard Worker #endif // FUZZ_MODE_MEDIA_PLAYER_SERVICE
518*ec779b8eSAndroid Build Coastguard Worker };
519*ec779b8eSAndroid Build Coastguard Worker 
520*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
521*ec779b8eSAndroid Build Coastguard Worker 
522*ec779b8eSAndroid Build Coastguard Worker }; // namespace android
523*ec779b8eSAndroid Build Coastguard Worker 
524*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIAPLAYERSERVICE_H
525