Implement AudioTrackCallback in MediaPlayerService
Modify MediaPlayerService to implement AudioTrackCallback rather
than passing a static function callback.
Test: YT music offline playback successful. Data callbacks logged.
Test: MediaPlayerTest
Change-Id: I8864125025011f04b7114f3c5ffec560c11ac5bd
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index 98091be..86be3fe 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -30,9 +30,11 @@
#include <media/AidlConversion.h>
#include <media/AudioResamplerPublic.h>
#include <media/AudioSystem.h>
+#include <media/AudioTrack.h>
#include <media/MediaPlayerInterface.h>
#include <media/Metadata.h>
#include <media/stagefright/foundation/ABase.h>
+#include <mediautils/Synchronization.h>
#include <android/content/AttributionSourceState.h>
#include <system/audio.h>
@@ -41,7 +43,6 @@
using content::AttributionSourceState;
-class AudioTrack;
struct AVSyncSettings;
class DeathNotifier;
class IDataSource;
@@ -161,7 +162,7 @@
sp<AudioOutput> mNextOutput;
AudioCallback mCallback;
void * mCallbackCookie;
- CallbackData * mCallbackData;
+ sp<CallbackData> mCallbackData;
audio_stream_type_t mStreamType;
audio_attributes_t * mAttributes;
float mLeftVolume;
@@ -189,15 +190,15 @@
// CallbackData is what is passed to the AudioTrack as the "user" data.
// We need to be able to target this to a different Output on the fly,
// so we can't use the Output itself for this.
- class CallbackData {
+ class CallbackData : public AudioTrack::IAudioTrackCallback {
friend AudioOutput;
public:
- explicit CallbackData(AudioOutput *cookie) {
+ explicit CallbackData(const wp<AudioOutput>& cookie) {
mData = cookie;
mSwitching = false;
}
- AudioOutput * getOutput() const { return mData; }
- void setOutput(AudioOutput* newcookie) { mData = newcookie; }
+ sp<AudioOutput> getOutput() const { return mData.load().promote(); }
+ void setOutput(const wp<AudioOutput>& newcookie) { mData.store(newcookie); }
// lock/unlock are used by the callback before accessing the payload of this object
void lock() const { mLock.lock(); }
void unlock() const { mLock.unlock(); }
@@ -220,8 +221,13 @@
}
mSwitching = false;
}
+ protected:
+ size_t onMoreData(const AudioTrack::Buffer& buffer) override;
+ void onUnderrun() override;
+ void onStreamEnd() override;
+ void onNewIAudioTrack() override;
private:
- AudioOutput * mData;
+ mediautils::atomic_wp<AudioOutput> mData;
mutable Mutex mLock; // a recursive mutex might make this unnecessary.
bool mSwitching;
DISALLOW_EVIL_CONSTRUCTORS(CallbackData);