blob: b346f40a6b399d04f2880668c5ff7b8136a31dab [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
38struct AudioPlaybackRate;
39class AudioTrack;
40struct AVSyncSettings;
41class IDataSource;
42struct MediaHTTPService;
43class MediaPlayer2EngineClient;
44
45#define CALLBACK_ANTAGONIZER 0
46#if CALLBACK_ANTAGONIZER
47class Antagonizer {
48public:
49 Antagonizer(notify_callback_f cb, void* client);
50 void start() { mActive = true; }
51 void stop() { mActive = false; }
52 void kill();
53private:
54 static const int interval;
55 Antagonizer();
56 static int callbackThread(void* cookie);
57 Mutex mLock;
58 Condition mCondition;
59 bool mExit;
60 bool mActive;
61 void* mClient;
62 notify_callback_f mCb;
63};
64#endif
65
66class MediaPlayer2Manager {
67 class Client;
68
69 class AudioOutput : public MediaPlayer2Base::AudioSink
70 {
71 class CallbackData;
72
73 public:
74 AudioOutput(
75 audio_session_t sessionId,
76 uid_t uid,
77 int pid,
78 const audio_attributes_t * attr,
79 const sp<AudioSystem::AudioDeviceCallback>& deviceCallback);
80 virtual ~AudioOutput();
81
82 virtual bool ready() const { return mTrack != 0; }
83 virtual ssize_t bufferSize() const;
84 virtual ssize_t frameCount() const;
85 virtual ssize_t channelCount() const;
86 virtual ssize_t frameSize() const;
87 virtual uint32_t latency() const;
88 virtual float msecsPerFrame() const;
89 virtual status_t getPosition(uint32_t *position) const;
90 virtual status_t getTimestamp(AudioTimestamp &ts) const;
91 virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const;
92 virtual status_t getFramesWritten(uint32_t *frameswritten) const;
93 virtual audio_session_t getSessionId() const;
94 virtual uint32_t getSampleRate() const;
95 virtual int64_t getBufferDurationInUs() const;
96
97 virtual status_t open(
98 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
99 audio_format_t format, int bufferCount,
100 AudioCallback cb, void *cookie,
101 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
102 const audio_offload_info_t *offloadInfo = NULL,
103 bool doNotReconnect = false,
104 uint32_t suggestedFrameCount = 0);
105
106 virtual status_t start();
107 virtual ssize_t write(const void* buffer, size_t size, bool blocking = true);
108 virtual void stop();
109 virtual void flush();
110 virtual void pause();
111 virtual void close();
112 void setAudioStreamType(audio_stream_type_t streamType);
113 virtual audio_stream_type_t getAudioStreamType() const { return mStreamType; }
114 void setAudioAttributes(const audio_attributes_t * attributes);
115
116 void setVolume(float left, float right);
117 virtual status_t setPlaybackRate(const AudioPlaybackRate& rate);
118 virtual status_t getPlaybackRate(AudioPlaybackRate* rate /* nonnull */);
119
120 status_t setAuxEffectSendLevel(float level);
121 status_t attachAuxEffect(int effectId);
122 virtual status_t dump(int fd, const Vector<String16>& args) const;
123
124 static bool isOnEmulator();
125 static int getMinBufferCount();
126 void setNextOutput(const sp<AudioOutput>& nextOutput);
127 void switchToNextOutput();
128 virtual bool needsTrailingPadding() { return mNextOutput == NULL; }
129 virtual status_t setParameters(const String8& keyValuePairs);
130 virtual String8 getParameters(const String8& keys);
131
132 virtual media::VolumeShaper::Status applyVolumeShaper(
133 const sp<media::VolumeShaper::Configuration>& configuration,
134 const sp<media::VolumeShaper::Operation>& operation) override;
135 virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
136
137 // AudioRouting
138 virtual status_t setOutputDevice(audio_port_handle_t deviceId);
139 virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
140 virtual status_t enableAudioDeviceCallback(bool enabled);
141
142 private:
143 static void setMinBufferCount();
144 static void CallbackWrapper(
145 int event, void *me, void *info);
146 void deleteRecycledTrack_l();
147 void close_l();
148 status_t updateTrack();
149
150 sp<AudioTrack> mTrack;
151 sp<AudioTrack> mRecycledTrack;
152 sp<AudioOutput> mNextOutput;
153 AudioCallback mCallback;
154 void * mCallbackCookie;
155 CallbackData * mCallbackData;
156 audio_stream_type_t mStreamType;
157 audio_attributes_t * mAttributes;
158 float mLeftVolume;
159 float mRightVolume;
160 AudioPlaybackRate mPlaybackRate;
161 uint32_t mSampleRateHz; // sample rate of the content, as set in open()
162 float mMsecsPerFrame;
163 size_t mFrameSize;
164 audio_session_t mSessionId;
165 uid_t mUid;
166 int mPid;
167 float mSendLevel;
168 int mAuxEffectId;
169 audio_output_flags_t mFlags;
170 sp<media::VolumeHandler> mVolumeHandler;
171 audio_port_handle_t mSelectedDeviceId;
172 audio_port_handle_t mRoutedDeviceId;
173 bool mDeviceCallbackEnabled;
174 wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;
175 mutable Mutex mLock;
176
177 // static variables below not protected by mutex
178 static bool mIsOnEmulator;
179 static int mMinBufferCount; // 12 for emulator; otherwise 4
180
181 // CallbackData is what is passed to the AudioTrack as the "user" data.
182 // We need to be able to target this to a different Output on the fly,
183 // so we can't use the Output itself for this.
184 class CallbackData {
185 friend AudioOutput;
186 public:
187 explicit CallbackData(AudioOutput *cookie) {
188 mData = cookie;
189 mSwitching = false;
190 }
191 AudioOutput * getOutput() const { return mData; }
192 void setOutput(AudioOutput* newcookie) { mData = newcookie; }
193 // lock/unlock are used by the callback before accessing the payload of this object
194 void lock() const { mLock.lock(); }
195 void unlock() const { mLock.unlock(); }
196
197 // tryBeginTrackSwitch/endTrackSwitch are used when the CallbackData is handed over
198 // to the next sink.
199
200 // tryBeginTrackSwitch() returns true only if it obtains the lock.
201 bool tryBeginTrackSwitch() {
202 LOG_ALWAYS_FATAL_IF(mSwitching, "tryBeginTrackSwitch() already called");
203 if (mLock.tryLock() != OK) {
204 return false;
205 }
206 mSwitching = true;
207 return true;
208 }
209 void endTrackSwitch() {
210 if (mSwitching) {
211 mLock.unlock();
212 }
213 mSwitching = false;
214 }
215 private:
216 AudioOutput * mData;
217 mutable Mutex mLock; // a recursive mutex might make this unnecessary.
218 bool mSwitching;
219 DISALLOW_EVIL_CONSTRUCTORS(CallbackData);
220 };
221
222 }; // AudioOutput
223
224
225public:
226 MediaPlayer2Manager();
227 virtual ~MediaPlayer2Manager();
228
229 static MediaPlayer2Manager& get();
230
231 // MediaPlayer2Manager interface
232 virtual sp<MediaPlayer2Engine> create(const sp<MediaPlayer2EngineClient>& client,
233 audio_session_t audioSessionId);
234
235 virtual status_t dump(int fd, const Vector<String16>& args);
236
237 void removeClient(const wp<Client>& client);
238 bool hasClient(wp<Client> client);
239
240private:
241 class Client : public MediaPlayer2Engine {
242 // MediaPlayer2Engine interface
243 virtual void disconnect();
244 virtual status_t setVideoSurfaceTexture(
245 const sp<IGraphicBufferProducer>& bufferProducer);
246 virtual status_t setBufferingSettings(const BufferingSettings& buffering) override;
247 virtual status_t getBufferingSettings(
248 BufferingSettings* buffering /* nonnull */) override;
249 virtual status_t prepareAsync();
250 virtual status_t start();
251 virtual status_t stop();
252 virtual status_t pause();
253 virtual status_t isPlaying(bool* state);
254 virtual status_t setPlaybackSettings(const AudioPlaybackRate& rate);
255 virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
256 virtual status_t setSyncSettings(const AVSyncSettings& rate, float videoFpsHint);
257 virtual status_t getSyncSettings(AVSyncSettings* rate /* nonnull */,
258 float* videoFps /* nonnull */);
259 virtual status_t seekTo(
260 int msec,
261 MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC);
262 virtual status_t getCurrentPosition(int* msec);
263 virtual status_t getDuration(int* msec);
264 virtual status_t reset();
265 virtual status_t notifyAt(int64_t mediaTimeUs);
266 virtual status_t setAudioStreamType(audio_stream_type_t type);
267 virtual status_t setLooping(int loop);
268 virtual status_t setVolume(float leftVolume, float rightVolume);
269 virtual status_t invoke(const Parcel& request, Parcel *reply);
270 virtual status_t setMetadataFilter(const Parcel& filter);
271 virtual status_t getMetadata(bool update_only,
272 bool apply_filter,
273 Parcel *reply);
274 virtual status_t setAuxEffectSendLevel(float level);
275 virtual status_t attachAuxEffect(int effectId);
276 virtual status_t setParameter(int key, const Parcel &request);
277 virtual status_t getParameter(int key, Parcel *reply);
278 virtual status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint);
279 virtual status_t getRetransmitEndpoint(struct sockaddr_in* endpoint);
280 virtual status_t setNextPlayer(const sp<MediaPlayer2Engine>& player);
281
282 virtual media::VolumeShaper::Status applyVolumeShaper(
283 const sp<media::VolumeShaper::Configuration>& configuration,
284 const sp<media::VolumeShaper::Operation>& operation) override;
285 virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
286
287 sp<MediaPlayer2Base> createPlayer(player2_type playerType);
288
289 virtual status_t setDataSource(
290 const sp<MediaHTTPService> &httpService,
291 const char *url,
292 const KeyedVector<String8, String8> *headers);
293
294 virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
295
296 virtual status_t setDataSource(const sp<IStreamSource> &source);
297 virtual status_t setDataSource(const sp<IDataSource> &source);
298
299
300 sp<MediaPlayer2Base> setDataSource_pre(player2_type playerType);
301 status_t setDataSource_post(const sp<MediaPlayer2Base>& p,
302 status_t status);
303
304 static void notify(void* cookie, int msg,
305 int ext1, int ext2, const Parcel *obj);
306
307 pid_t pid() const { return mPid; }
308 virtual status_t dump(int fd, const Vector<String16>& args);
309
310 audio_session_t getAudioSessionId() { return mAudioSessionId; }
311 // Modular DRM
312 virtual status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
313 virtual status_t releaseDrm();
314 // AudioRouting
315 virtual status_t setOutputDevice(audio_port_handle_t deviceId);
316 virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId);
317 virtual status_t enableAudioDeviceCallback(bool enabled);
318
319 private:
320 class AudioDeviceUpdatedNotifier: public AudioSystem::AudioDeviceCallback
321 {
322 public:
323 AudioDeviceUpdatedNotifier(const sp<MediaPlayer2Base>& listener) {
324 mListener = listener;
325 }
326 ~AudioDeviceUpdatedNotifier() {}
327
328 virtual void onAudioDeviceUpdate(audio_io_handle_t audioIo,
329 audio_port_handle_t deviceId);
330
331 private:
332 wp<MediaPlayer2Base> mListener;
333 };
334
335 friend class MediaPlayer2Manager;
336 Client(pid_t pid,
337 int32_t connId,
338 const sp<MediaPlayer2EngineClient>& client,
339 audio_session_t audioSessionId,
340 uid_t uid);
341 Client();
342 virtual ~Client();
343
344 void deletePlayer();
345
346 sp<MediaPlayer2Base> getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
347
348
349
350 // @param type Of the metadata to be tested.
351 // @return true if the metadata should be dropped according to
352 // the filters.
353 bool shouldDropMetadata(media::Metadata::Type type) const;
354
355 // Add a new element to the set of metadata updated. Noop if
356 // the element exists already.
357 // @param type Of the metadata to be recorded.
358 void addNewMetadataUpdate(media::Metadata::Type type);
359
360 // Disconnect from the currently connected ANativeWindow.
361 void disconnectNativeWindow_l();
362
363 status_t setAudioAttributes_l(const Parcel &request);
364
365 mutable Mutex mLock;
366 sp<MediaPlayer2Base> mPlayer;
367 sp<MediaPlayer2EngineClient> mClient;
368 sp<AudioOutput> mAudioOutput;
369 pid_t mPid;
370 status_t mStatus;
371 bool mLoop;
372 int32_t mConnId;
373 audio_session_t mAudioSessionId;
374 audio_attributes_t * mAudioAttributes;
375 uid_t mUid;
376 sp<ANativeWindow> mConnectedWindow;
377 sp<IBinder> mConnectedWindowBinder;
378 struct sockaddr_in mRetransmitEndpoint;
379 bool mRetransmitEndpointValid;
380 sp<Client> mNextClient;
381
382 // Metadata filters.
383 media::Metadata::Filter mMetadataAllow; // protected by mLock
384 media::Metadata::Filter mMetadataDrop; // protected by mLock
385
386 // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
387 // notification we try to update mMetadataUpdated which is a
388 // set: no duplicate.
389 // getMetadata clears this set.
390 media::Metadata::Filter mMetadataUpdated; // protected by mLock
391
392 sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedListener;
393#if CALLBACK_ANTAGONIZER
394 Antagonizer* mAntagonizer;
395#endif
396 }; // Client
397
398// ----------------------------------------------------------------------------
399
400 pid_t mPid;
401 uid_t mUid;
402
403 mutable Mutex mLock;
404 SortedVector< wp<Client> > mClients;
405 int32_t mNextConnId;
406};
407
408// ----------------------------------------------------------------------------
409
410}; // namespace android
411
412#endif // ANDROID_MEDIAPLAYER2MANAGER_H