blob: fde13818f087825236e26216e7217f7c311895ab [file] [log] [blame]
Wei Jia53692fa2017-12-11 10:33:46 -08001/*
2**
3** Copyright 2017, 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_MEDIAPLAYER2MANAGER_H
19#define ANDROID_MEDIAPLAYER2MANAGER_H
20
21#include <arpa/inet.h>
22
23#include <utils/threads.h>
24#include <utils/Errors.h>
25#include <utils/KeyedVector.h>
26#include <utils/String8.h>
27#include <utils/Vector.h>
28
Wei Jia53692fa2017-12-11 10:33:46 -080029#include <media/Metadata.h>
30#include <media/stagefright/foundation/ABase.h>
Wei Jia51b69562018-02-05 16:17:13 -080031#include <mediaplayer2/MediaPlayer2Engine.h>
32#include <mediaplayer2/MediaPlayer2Interface.h>
Wei Jia53692fa2017-12-11 10:33:46 -080033
34#include <system/audio.h>
35
36namespace android {
37
Wei Jia28288fb2017-12-15 13:45:29 -080038struct ANativeWindowWrapper;
Wei Jia53692fa2017-12-11 10:33:46 -080039struct AudioPlaybackRate;
40class AudioTrack;
41struct AVSyncSettings;
Wei Jiac5c79da2017-12-21 18:03:05 -080042class DataSource;
Wei Jia53692fa2017-12-11 10:33:46 -080043struct MediaHTTPService;
44class MediaPlayer2EngineClient;
45
46#define CALLBACK_ANTAGONIZER 0
47#if CALLBACK_ANTAGONIZER
48class Antagonizer {
49public:
Pawin Vongmasa50963852017-12-12 06:24:42 -080050 Antagonizer(
Wei Jia33abcc72018-01-30 09:47:38 -080051 MediaPlayer2Interface::NotifyCallback cb,
Pawin Vongmasa50963852017-12-12 06:24:42 -080052 const wp<MediaPlayer2Engine> &client);
Wei Jia53692fa2017-12-11 10:33:46 -080053 void start() { mActive = true; }
54 void stop() { mActive = false; }
55 void kill();
56private:
57 static const int interval;
58 Antagonizer();
Pawin Vongmasa50963852017-12-12 06:24:42 -080059 static int callbackThread(void *cookie);
60 Mutex mLock;
61 Condition mCondition;
62 bool mExit;
63 bool mActive;
64 wp<MediaPlayer2Engine> mClient;
Wei Jia33abcc72018-01-30 09:47:38 -080065 MediaPlayer2Interface::NotifyCallback mCb;
Wei Jia53692fa2017-12-11 10:33:46 -080066};
67#endif
68
69class MediaPlayer2Manager {
70 class Client;
71
Wei Jia33abcc72018-01-30 09:47:38 -080072 class AudioOutput : public MediaPlayer2Interface::AudioSink
Wei Jia53692fa2017-12-11 10:33:46 -080073 {
74 class CallbackData;
75
76 public:
77 AudioOutput(
78 audio_session_t sessionId,
79 uid_t uid,
80 int pid,
81 const audio_attributes_t * attr,
82 const sp<AudioSystem::AudioDeviceCallback>& deviceCallback);
83 virtual ~AudioOutput();
84
85 virtual bool ready() const { return mTrack != 0; }
86 virtual ssize_t bufferSize() const;
87 virtual ssize_t frameCount() const;
88 virtual ssize_t channelCount() const;
89 virtual ssize_t frameSize() const;
90 virtual uint32_t latency() const;
91 virtual float msecsPerFrame() const;
92 virtual status_t getPosition(uint32_t *position) const;
93 virtual status_t getTimestamp(AudioTimestamp &ts) const;
94 virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const;
95 virtual status_t getFramesWritten(uint32_t *frameswritten) const;
96 virtual audio_session_t getSessionId() const;
97 virtual uint32_t getSampleRate() const;
98 virtual int64_t getBufferDurationInUs() const;
99
100 virtual status_t open(
101 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
102 audio_format_t format, int bufferCount,
103 AudioCallback cb, void *cookie,
104 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
105 const audio_offload_info_t *offloadInfo = NULL,
106 bool doNotReconnect = false,
107 uint32_t suggestedFrameCount = 0);
108
109 virtual status_t start();
110 virtual ssize_t write(const void* buffer, size_t size, bool blocking = true);
111 virtual void stop();
112 virtual void flush();
113 virtual void pause();
114 virtual void close();
115 void setAudioStreamType(audio_stream_type_t streamType);
116 virtual audio_stream_type_t getAudioStreamType() const { return mStreamType; }
117 void setAudioAttributes(const audio_attributes_t * attributes);
118
119 void setVolume(float left, float right);
120 virtual status_t setPlaybackRate(const AudioPlaybackRate& rate);
121 virtual status_t getPlaybackRate(AudioPlaybackRate* rate /* nonnull */);
122
123 status_t setAuxEffectSendLevel(float level);
124 status_t attachAuxEffect(int effectId);
125 virtual status_t dump(int fd, const Vector<String16>& args) const;
126
127 static bool isOnEmulator();
128 static int getMinBufferCount();
129 void setNextOutput(const sp<AudioOutput>& nextOutput);
130 void switchToNextOutput();
131 virtual bool needsTrailingPadding() { return mNextOutput == NULL; }
132 virtual status_t setParameters(const String8& keyValuePairs);
133 virtual String8 getParameters(const String8& keys);
134
Wei Jia53692fa2017-12-11 10:33:46 -0800135 // AudioRouting
136 virtual status_t setOutputDevice(audio_port_handle_t deviceId);
137 virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
138 virtual status_t enableAudioDeviceCallback(bool enabled);
139
140 private:
141 static void setMinBufferCount();
142 static void CallbackWrapper(
143 int event, void *me, void *info);
144 void deleteRecycledTrack_l();
145 void close_l();
146 status_t updateTrack();
147
148 sp<AudioTrack> mTrack;
149 sp<AudioTrack> mRecycledTrack;
150 sp<AudioOutput> mNextOutput;
151 AudioCallback mCallback;
152 void * mCallbackCookie;
153 CallbackData * mCallbackData;
154 audio_stream_type_t mStreamType;
155 audio_attributes_t * mAttributes;
156 float mLeftVolume;
157 float mRightVolume;
158 AudioPlaybackRate mPlaybackRate;
159 uint32_t mSampleRateHz; // sample rate of the content, as set in open()
160 float mMsecsPerFrame;
161 size_t mFrameSize;
162 audio_session_t mSessionId;
163 uid_t mUid;
164 int mPid;
165 float mSendLevel;
166 int mAuxEffectId;
167 audio_output_flags_t mFlags;
Wei Jia53692fa2017-12-11 10:33:46 -0800168 audio_port_handle_t mSelectedDeviceId;
169 audio_port_handle_t mRoutedDeviceId;
170 bool mDeviceCallbackEnabled;
171 wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;
172 mutable Mutex mLock;
173
174 // static variables below not protected by mutex
175 static bool mIsOnEmulator;
176 static int mMinBufferCount; // 12 for emulator; otherwise 4
177
178 // CallbackData is what is passed to the AudioTrack as the "user" data.
179 // We need to be able to target this to a different Output on the fly,
180 // so we can't use the Output itself for this.
181 class CallbackData {
182 friend AudioOutput;
183 public:
184 explicit CallbackData(AudioOutput *cookie) {
185 mData = cookie;
186 mSwitching = false;
187 }
188 AudioOutput * getOutput() const { return mData; }
189 void setOutput(AudioOutput* newcookie) { mData = newcookie; }
190 // lock/unlock are used by the callback before accessing the payload of this object
191 void lock() const { mLock.lock(); }
192 void unlock() const { mLock.unlock(); }
193
194 // tryBeginTrackSwitch/endTrackSwitch are used when the CallbackData is handed over
195 // to the next sink.
196
197 // tryBeginTrackSwitch() returns true only if it obtains the lock.
198 bool tryBeginTrackSwitch() {
199 LOG_ALWAYS_FATAL_IF(mSwitching, "tryBeginTrackSwitch() already called");
200 if (mLock.tryLock() != OK) {
201 return false;
202 }
203 mSwitching = true;
204 return true;
205 }
206 void endTrackSwitch() {
207 if (mSwitching) {
208 mLock.unlock();
209 }
210 mSwitching = false;
211 }
212 private:
213 AudioOutput * mData;
214 mutable Mutex mLock; // a recursive mutex might make this unnecessary.
215 bool mSwitching;
216 DISALLOW_EVIL_CONSTRUCTORS(CallbackData);
217 };
218
219 }; // AudioOutput
220
221
222public:
223 MediaPlayer2Manager();
224 virtual ~MediaPlayer2Manager();
225
226 static MediaPlayer2Manager& get();
227
228 // MediaPlayer2Manager interface
229 virtual sp<MediaPlayer2Engine> create(const sp<MediaPlayer2EngineClient>& client,
230 audio_session_t audioSessionId);
231
232 virtual status_t dump(int fd, const Vector<String16>& args);
233
234 void removeClient(const wp<Client>& client);
235 bool hasClient(wp<Client> client);
236
237private:
238 class Client : public MediaPlayer2Engine {
239 // MediaPlayer2Engine interface
240 virtual void disconnect();
241 virtual status_t setVideoSurfaceTexture(
Wei Jia28288fb2017-12-15 13:45:29 -0800242 const sp<ANativeWindowWrapper>& nww) override;
Wei Jia53692fa2017-12-11 10:33:46 -0800243 virtual status_t setBufferingSettings(const BufferingSettings& buffering) override;
244 virtual status_t getBufferingSettings(
245 BufferingSettings* buffering /* nonnull */) override;
246 virtual status_t prepareAsync();
247 virtual status_t start();
248 virtual status_t stop();
249 virtual status_t pause();
250 virtual status_t isPlaying(bool* state);
251 virtual status_t setPlaybackSettings(const AudioPlaybackRate& rate);
252 virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
253 virtual status_t setSyncSettings(const AVSyncSettings& rate, float videoFpsHint);
254 virtual status_t getSyncSettings(AVSyncSettings* rate /* nonnull */,
255 float* videoFps /* nonnull */);
256 virtual status_t seekTo(
257 int msec,
258 MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC);
259 virtual status_t getCurrentPosition(int* msec);
260 virtual status_t getDuration(int* msec);
261 virtual status_t reset();
262 virtual status_t notifyAt(int64_t mediaTimeUs);
263 virtual status_t setAudioStreamType(audio_stream_type_t type);
264 virtual status_t setLooping(int loop);
265 virtual status_t setVolume(float leftVolume, float rightVolume);
266 virtual status_t invoke(const Parcel& request, Parcel *reply);
267 virtual status_t setMetadataFilter(const Parcel& filter);
268 virtual status_t getMetadata(bool update_only,
269 bool apply_filter,
270 Parcel *reply);
271 virtual status_t setAuxEffectSendLevel(float level);
272 virtual status_t attachAuxEffect(int effectId);
273 virtual status_t setParameter(int key, const Parcel &request);
274 virtual status_t getParameter(int key, Parcel *reply);
Wei Jia53692fa2017-12-11 10:33:46 -0800275 virtual status_t setNextPlayer(const sp<MediaPlayer2Engine>& player);
276
Wei Jiac2636032018-02-01 09:15:25 -0800277 virtual status_t setDataSource(const sp<DataSourceDesc> &dsd);
Wei Jia53692fa2017-12-11 10:33:46 -0800278
Pawin Vongmasa50963852017-12-12 06:24:42 -0800279 static void notify(const wp<MediaPlayer2Engine> &listener, int msg,
Wei Jia53692fa2017-12-11 10:33:46 -0800280 int ext1, int ext2, const Parcel *obj);
281
282 pid_t pid() const { return mPid; }
283 virtual status_t dump(int fd, const Vector<String16>& args);
284
285 audio_session_t getAudioSessionId() { return mAudioSessionId; }
286 // Modular DRM
287 virtual status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
288 virtual status_t releaseDrm();
289 // AudioRouting
290 virtual status_t setOutputDevice(audio_port_handle_t deviceId);
291 virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
292 virtual status_t enableAudioDeviceCallback(bool enabled);
293
294 private:
295 class AudioDeviceUpdatedNotifier: public AudioSystem::AudioDeviceCallback
296 {
297 public:
Wei Jia33abcc72018-01-30 09:47:38 -0800298 AudioDeviceUpdatedNotifier(const sp<MediaPlayer2Interface>& listener) {
Wei Jia53692fa2017-12-11 10:33:46 -0800299 mListener = listener;
300 }
301 ~AudioDeviceUpdatedNotifier() {}
302
303 virtual void onAudioDeviceUpdate(audio_io_handle_t audioIo,
304 audio_port_handle_t deviceId);
305
306 private:
Wei Jia33abcc72018-01-30 09:47:38 -0800307 wp<MediaPlayer2Interface> mListener;
Wei Jia53692fa2017-12-11 10:33:46 -0800308 };
309
310 friend class MediaPlayer2Manager;
311 Client(pid_t pid,
312 int32_t connId,
313 const sp<MediaPlayer2EngineClient>& client,
314 audio_session_t audioSessionId,
315 uid_t uid);
316 Client();
317 virtual ~Client();
Wei Jiac2636032018-02-01 09:15:25 -0800318 bool init();
Wei Jia53692fa2017-12-11 10:33:46 -0800319
320 void deletePlayer();
321
Wei Jia33abcc72018-01-30 09:47:38 -0800322 sp<MediaPlayer2Interface> getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
Wei Jia53692fa2017-12-11 10:33:46 -0800323
324
325
326 // @param type Of the metadata to be tested.
327 // @return true if the metadata should be dropped according to
328 // the filters.
329 bool shouldDropMetadata(media::Metadata::Type type) const;
330
331 // Add a new element to the set of metadata updated. Noop if
332 // the element exists already.
333 // @param type Of the metadata to be recorded.
334 void addNewMetadataUpdate(media::Metadata::Type type);
335
336 // Disconnect from the currently connected ANativeWindow.
337 void disconnectNativeWindow_l();
338
339 status_t setAudioAttributes_l(const Parcel &request);
340
341 mutable Mutex mLock;
Wei Jia33abcc72018-01-30 09:47:38 -0800342 sp<MediaPlayer2Interface> mPlayer;
Wei Jia53692fa2017-12-11 10:33:46 -0800343 sp<MediaPlayer2EngineClient> mClient;
344 sp<AudioOutput> mAudioOutput;
345 pid_t mPid;
346 status_t mStatus;
347 bool mLoop;
348 int32_t mConnId;
349 audio_session_t mAudioSessionId;
350 audio_attributes_t * mAudioAttributes;
351 uid_t mUid;
Wei Jia28288fb2017-12-15 13:45:29 -0800352 sp<ANativeWindowWrapper> mConnectedWindow;
Wei Jia53692fa2017-12-11 10:33:46 -0800353 sp<Client> mNextClient;
354
355 // Metadata filters.
356 media::Metadata::Filter mMetadataAllow; // protected by mLock
357 media::Metadata::Filter mMetadataDrop; // protected by mLock
358
359 // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
360 // notification we try to update mMetadataUpdated which is a
361 // set: no duplicate.
362 // getMetadata clears this set.
363 media::Metadata::Filter mMetadataUpdated; // protected by mLock
364
365 sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedListener;
366#if CALLBACK_ANTAGONIZER
367 Antagonizer* mAntagonizer;
368#endif
369 }; // Client
370
371// ----------------------------------------------------------------------------
372
373 pid_t mPid;
374 uid_t mUid;
375
376 mutable Mutex mLock;
377 SortedVector< wp<Client> > mClients;
378 int32_t mNextConnId;
379};
380
381// ----------------------------------------------------------------------------
382
383}; // namespace android
384
385#endif // ANDROID_MEDIAPLAYER2MANAGER_H