blob: d3ee044952165501727e6648bf0269d286f30a71 [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
29#include <media/MediaPlayer2Engine.h>
30#include <media/MediaPlayer2Interface.h>
31#include <media/Metadata.h>
32#include <media/stagefright/foundation/ABase.h>
33
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;
42class IDataSource;
43struct 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(
51 MediaPlayer2Base::NotifyCallback cb,
52 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;
65 MediaPlayer2Base::NotifyCallback mCb;
Wei Jia53692fa2017-12-11 10:33:46 -080066};
67#endif
68
69class MediaPlayer2Manager {
70 class Client;
71
72 class AudioOutput : public MediaPlayer2Base::AudioSink
73 {
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
135 virtual media::VolumeShaper::Status applyVolumeShaper(
136 const sp<media::VolumeShaper::Configuration>& configuration,
137 const sp<media::VolumeShaper::Operation>& operation) override;
138 virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
139
140 // AudioRouting
141 virtual status_t setOutputDevice(audio_port_handle_t deviceId);
142 virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
143 virtual status_t enableAudioDeviceCallback(bool enabled);
144
145 private:
146 static void setMinBufferCount();
147 static void CallbackWrapper(
148 int event, void *me, void *info);
149 void deleteRecycledTrack_l();
150 void close_l();
151 status_t updateTrack();
152
153 sp<AudioTrack> mTrack;
154 sp<AudioTrack> mRecycledTrack;
155 sp<AudioOutput> mNextOutput;
156 AudioCallback mCallback;
157 void * mCallbackCookie;
158 CallbackData * mCallbackData;
159 audio_stream_type_t mStreamType;
160 audio_attributes_t * mAttributes;
161 float mLeftVolume;
162 float mRightVolume;
163 AudioPlaybackRate mPlaybackRate;
164 uint32_t mSampleRateHz; // sample rate of the content, as set in open()
165 float mMsecsPerFrame;
166 size_t mFrameSize;
167 audio_session_t mSessionId;
168 uid_t mUid;
169 int mPid;
170 float mSendLevel;
171 int mAuxEffectId;
172 audio_output_flags_t mFlags;
173 sp<media::VolumeHandler> mVolumeHandler;
174 audio_port_handle_t mSelectedDeviceId;
175 audio_port_handle_t mRoutedDeviceId;
176 bool mDeviceCallbackEnabled;
177 wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;
178 mutable Mutex mLock;
179
180 // static variables below not protected by mutex
181 static bool mIsOnEmulator;
182 static int mMinBufferCount; // 12 for emulator; otherwise 4
183
184 // CallbackData is what is passed to the AudioTrack as the "user" data.
185 // We need to be able to target this to a different Output on the fly,
186 // so we can't use the Output itself for this.
187 class CallbackData {
188 friend AudioOutput;
189 public:
190 explicit CallbackData(AudioOutput *cookie) {
191 mData = cookie;
192 mSwitching = false;
193 }
194 AudioOutput * getOutput() const { return mData; }
195 void setOutput(AudioOutput* newcookie) { mData = newcookie; }
196 // lock/unlock are used by the callback before accessing the payload of this object
197 void lock() const { mLock.lock(); }
198 void unlock() const { mLock.unlock(); }
199
200 // tryBeginTrackSwitch/endTrackSwitch are used when the CallbackData is handed over
201 // to the next sink.
202
203 // tryBeginTrackSwitch() returns true only if it obtains the lock.
204 bool tryBeginTrackSwitch() {
205 LOG_ALWAYS_FATAL_IF(mSwitching, "tryBeginTrackSwitch() already called");
206 if (mLock.tryLock() != OK) {
207 return false;
208 }
209 mSwitching = true;
210 return true;
211 }
212 void endTrackSwitch() {
213 if (mSwitching) {
214 mLock.unlock();
215 }
216 mSwitching = false;
217 }
218 private:
219 AudioOutput * mData;
220 mutable Mutex mLock; // a recursive mutex might make this unnecessary.
221 bool mSwitching;
222 DISALLOW_EVIL_CONSTRUCTORS(CallbackData);
223 };
224
225 }; // AudioOutput
226
227
228public:
229 MediaPlayer2Manager();
230 virtual ~MediaPlayer2Manager();
231
232 static MediaPlayer2Manager& get();
233
234 // MediaPlayer2Manager interface
235 virtual sp<MediaPlayer2Engine> create(const sp<MediaPlayer2EngineClient>& client,
236 audio_session_t audioSessionId);
237
238 virtual status_t dump(int fd, const Vector<String16>& args);
239
240 void removeClient(const wp<Client>& client);
241 bool hasClient(wp<Client> client);
242
243private:
244 class Client : public MediaPlayer2Engine {
245 // MediaPlayer2Engine interface
246 virtual void disconnect();
247 virtual status_t setVideoSurfaceTexture(
Wei Jia28288fb2017-12-15 13:45:29 -0800248 const sp<ANativeWindowWrapper>& nww) override;
Wei Jia53692fa2017-12-11 10:33:46 -0800249 virtual status_t setBufferingSettings(const BufferingSettings& buffering) override;
250 virtual status_t getBufferingSettings(
251 BufferingSettings* buffering /* nonnull */) override;
252 virtual status_t prepareAsync();
253 virtual status_t start();
254 virtual status_t stop();
255 virtual status_t pause();
256 virtual status_t isPlaying(bool* state);
257 virtual status_t setPlaybackSettings(const AudioPlaybackRate& rate);
258 virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
259 virtual status_t setSyncSettings(const AVSyncSettings& rate, float videoFpsHint);
260 virtual status_t getSyncSettings(AVSyncSettings* rate /* nonnull */,
261 float* videoFps /* nonnull */);
262 virtual status_t seekTo(
263 int msec,
264 MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC);
265 virtual status_t getCurrentPosition(int* msec);
266 virtual status_t getDuration(int* msec);
267 virtual status_t reset();
268 virtual status_t notifyAt(int64_t mediaTimeUs);
269 virtual status_t setAudioStreamType(audio_stream_type_t type);
270 virtual status_t setLooping(int loop);
271 virtual status_t setVolume(float leftVolume, float rightVolume);
272 virtual status_t invoke(const Parcel& request, Parcel *reply);
273 virtual status_t setMetadataFilter(const Parcel& filter);
274 virtual status_t getMetadata(bool update_only,
275 bool apply_filter,
276 Parcel *reply);
277 virtual status_t setAuxEffectSendLevel(float level);
278 virtual status_t attachAuxEffect(int effectId);
279 virtual status_t setParameter(int key, const Parcel &request);
280 virtual status_t getParameter(int key, Parcel *reply);
281 virtual status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint);
282 virtual status_t getRetransmitEndpoint(struct sockaddr_in* endpoint);
283 virtual status_t setNextPlayer(const sp<MediaPlayer2Engine>& player);
284
285 virtual media::VolumeShaper::Status applyVolumeShaper(
286 const sp<media::VolumeShaper::Configuration>& configuration,
287 const sp<media::VolumeShaper::Operation>& operation) override;
288 virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
289
Wei Jia28288fb2017-12-15 13:45:29 -0800290 sp<MediaPlayer2Base> createPlayer(player2_type playerType);
Wei Jia53692fa2017-12-11 10:33:46 -0800291
292 virtual status_t setDataSource(
293 const sp<MediaHTTPService> &httpService,
294 const char *url,
295 const KeyedVector<String8, String8> *headers);
296
297 virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
298
299 virtual status_t setDataSource(const sp<IStreamSource> &source);
300 virtual status_t setDataSource(const sp<IDataSource> &source);
301
302
Wei Jia28288fb2017-12-15 13:45:29 -0800303 sp<MediaPlayer2Base> setDataSource_pre(player2_type playerType);
Wei Jia53692fa2017-12-11 10:33:46 -0800304 status_t setDataSource_post(const sp<MediaPlayer2Base>& p,
305 status_t status);
306
Pawin Vongmasa50963852017-12-12 06:24:42 -0800307 static void notify(const wp<MediaPlayer2Engine> &listener, int msg,
Wei Jia53692fa2017-12-11 10:33:46 -0800308 int ext1, int ext2, const Parcel *obj);
309
310 pid_t pid() const { return mPid; }
311 virtual status_t dump(int fd, const Vector<String16>& args);
312
313 audio_session_t getAudioSessionId() { return mAudioSessionId; }
314 // Modular DRM
315 virtual status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
316 virtual status_t releaseDrm();
317 // AudioRouting
318 virtual status_t setOutputDevice(audio_port_handle_t deviceId);
319 virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
320 virtual status_t enableAudioDeviceCallback(bool enabled);
321
322 private:
323 class AudioDeviceUpdatedNotifier: public AudioSystem::AudioDeviceCallback
324 {
325 public:
326 AudioDeviceUpdatedNotifier(const sp<MediaPlayer2Base>& listener) {
327 mListener = listener;
328 }
329 ~AudioDeviceUpdatedNotifier() {}
330
331 virtual void onAudioDeviceUpdate(audio_io_handle_t audioIo,
332 audio_port_handle_t deviceId);
333
334 private:
335 wp<MediaPlayer2Base> mListener;
336 };
337
338 friend class MediaPlayer2Manager;
339 Client(pid_t pid,
340 int32_t connId,
341 const sp<MediaPlayer2EngineClient>& client,
342 audio_session_t audioSessionId,
343 uid_t uid);
344 Client();
345 virtual ~Client();
346
347 void deletePlayer();
348
349 sp<MediaPlayer2Base> getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
350
351
352
353 // @param type Of the metadata to be tested.
354 // @return true if the metadata should be dropped according to
355 // the filters.
356 bool shouldDropMetadata(media::Metadata::Type type) const;
357
358 // Add a new element to the set of metadata updated. Noop if
359 // the element exists already.
360 // @param type Of the metadata to be recorded.
361 void addNewMetadataUpdate(media::Metadata::Type type);
362
363 // Disconnect from the currently connected ANativeWindow.
364 void disconnectNativeWindow_l();
365
366 status_t setAudioAttributes_l(const Parcel &request);
367
368 mutable Mutex mLock;
369 sp<MediaPlayer2Base> mPlayer;
370 sp<MediaPlayer2EngineClient> mClient;
371 sp<AudioOutput> mAudioOutput;
372 pid_t mPid;
373 status_t mStatus;
374 bool mLoop;
375 int32_t mConnId;
376 audio_session_t mAudioSessionId;
377 audio_attributes_t * mAudioAttributes;
378 uid_t mUid;
Wei Jia28288fb2017-12-15 13:45:29 -0800379 sp<ANativeWindowWrapper> mConnectedWindow;
Wei Jia53692fa2017-12-11 10:33:46 -0800380 struct sockaddr_in mRetransmitEndpoint;
381 bool mRetransmitEndpointValid;
382 sp<Client> mNextClient;
383
384 // Metadata filters.
385 media::Metadata::Filter mMetadataAllow; // protected by mLock
386 media::Metadata::Filter mMetadataDrop; // protected by mLock
387
388 // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
389 // notification we try to update mMetadataUpdated which is a
390 // set: no duplicate.
391 // getMetadata clears this set.
392 media::Metadata::Filter mMetadataUpdated; // protected by mLock
393
394 sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedListener;
395#if CALLBACK_ANTAGONIZER
396 Antagonizer* mAntagonizer;
397#endif
398 }; // Client
399
400// ----------------------------------------------------------------------------
401
402 pid_t mPid;
403 uid_t mUid;
404
405 mutable Mutex mLock;
406 SortedVector< wp<Client> > mClients;
407 int32_t mNextConnId;
408};
409
410// ----------------------------------------------------------------------------
411
412}; // namespace android
413
414#endif // ANDROID_MEDIAPLAYER2MANAGER_H