Implement AudioTrack callback in AudioPlayer
Modify AudioPlayer to implement AudioTrack callback interface rather
than passing callback function pointers. Change instantiations of
AudioPlayer to use sp.
Test: Compiles
Change-Id: Iad51430dd99c985ad6e6fc4f39d6ed5b44120f5b
diff --git a/cmds/stagefright/AudioPlayer.cpp b/cmds/stagefright/AudioPlayer.cpp
index 55427ca..a63bde6 100644
--- a/cmds/stagefright/AudioPlayer.cpp
+++ b/cmds/stagefright/AudioPlayer.cpp
@@ -249,7 +249,8 @@
mAudioTrack = new AudioTrack(
AUDIO_STREAM_MUSIC, mSampleRate, AUDIO_FORMAT_PCM_16_BIT, audioMask,
- 0 /*frameCount*/, AUDIO_OUTPUT_FLAG_NONE, &AudioCallback, this,
+ 0 /*frameCount*/, AUDIO_OUTPUT_FLAG_NONE,
+ wp<IAudioTrackCallback>::fromExisting(this),
0 /*notificationFrames*/);
if ((err = mAudioTrack->initCheck()) != OK) {
@@ -397,10 +398,6 @@
mStartPosUs = 0;
}
-// static
-void AudioPlayer::AudioCallback(int event, void *user, void *info) {
- static_cast<AudioPlayer *>(user)->AudioCallback(event, info);
-}
bool AudioPlayer::reachedEOS(status_t *finalStatus) {
*finalStatus = OK;
@@ -455,20 +452,12 @@
return 0;
}
-void AudioPlayer::AudioCallback(int event, void *info) {
- switch (event) {
- case AudioTrack::EVENT_MORE_DATA:
- {
- AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
- size_t numBytesWritten = fillBuffer(buffer->raw, buffer->size);
- buffer->size = numBytesWritten;
- }
- break;
+size_t AudioPlayer::onMoreData(const AudioTrack::Buffer& buffer) {
+ return fillBuffer(buffer.raw, buffer.size);
+}
- case AudioTrack::EVENT_STREAM_END:
- mReachedEOS = true;
- break;
- }
+void AudioPlayer::onStreamEnd() {
+ mReachedEOS = true;
}
size_t AudioPlayer::fillBuffer(void *data, size_t size) {
diff --git a/cmds/stagefright/AudioPlayer.h b/cmds/stagefright/AudioPlayer.h
index 43550ea..95b8702 100644
--- a/cmds/stagefright/AudioPlayer.h
+++ b/cmds/stagefright/AudioPlayer.h
@@ -19,6 +19,7 @@
#define AUDIO_PLAYER_H_
#include <media/AudioResamplerPublic.h>
+#include <media/AudioTrack.h>
#include <media/stagefright/MediaSource.h>
#include <media/MediaPlayerInterface.h>
#include <media/stagefright/MediaBuffer.h>
@@ -26,10 +27,9 @@
namespace android {
-class AudioTrack;
struct AwesomePlayer;
-class AudioPlayer {
+class AudioPlayer : AudioTrack::IAudioTrackCallback {
public:
enum {
REACHED_EOS,
@@ -66,6 +66,9 @@
status_t getPlaybackRate(AudioPlaybackRate *rate /* nonnull */);
private:
+ friend sp<AudioPlayer>;
+ size_t onMoreData(const AudioTrack::Buffer& buffer) override;
+ void onStreamEnd() override;
sp<MediaSource> mSource;
sp<AudioTrack> mAudioTrack;
diff --git a/cmds/stagefright/audioloop.cpp b/cmds/stagefright/audioloop.cpp
index 4b41ff8..83f8fe9 100644
--- a/cmds/stagefright/audioloop.cpp
+++ b/cmds/stagefright/audioloop.cpp
@@ -166,9 +166,9 @@
sp<MediaSource> decoder = SimpleDecodingSource::Create(encoder);
if (playToSpeaker) {
- AudioPlayer player(NULL);
- player.setSource(decoder);
- player.start();
+ sp<AudioPlayer> player = sp<AudioPlayer>::make(nullptr);
+ player->setSource(decoder);
+ player->start();
sleep(duration);
ALOGI("Line: %d", __LINE__);
diff --git a/cmds/stagefright/record.cpp b/cmds/stagefright/record.cpp
index 098c278..5743ad6 100644
--- a/cmds/stagefright/record.cpp
+++ b/cmds/stagefright/record.cpp
@@ -32,7 +32,6 @@
#include <media/stagefright/SimpleDecodingSource.h>
#include <media/MediaPlayerInterface.h>
-#include "AudioPlayer.h"
using namespace android;
@@ -274,17 +273,6 @@
const int32_t kNumChannels = 2;
sp<MediaSource> audioSource = new SineSource(kSampleRate, kNumChannels);
-#if 0
- sp<MediaPlayerBase::AudioSink> audioSink;
- AudioPlayer *player = new AudioPlayer(audioSink);
- player->setSource(audioSource);
- player->start();
-
- sleep(10);
-
- player->stop();
-#endif
-
sp<AMessage> encMeta = new AMessage;
encMeta->setString("mime",
0 ? MEDIA_MIMETYPE_AUDIO_AMR_WB : MEDIA_MIMETYPE_AUDIO_AAC);
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index c430f05..ec16bc2 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -220,7 +220,7 @@
}
if (gPlaybackAudio) {
- AudioPlayer *player = new AudioPlayer(NULL);
+ sp<AudioPlayer> player = sp<AudioPlayer>::make(nullptr);
player->setSource(rawSource);
rawSource.clear();
@@ -235,9 +235,6 @@
fprintf(stderr, "unable to start playback err=%d (0x%08x)\n", err, err);
}
- delete player;
- player = NULL;
-
return;
} else if (gReproduceBug >= 3 && gReproduceBug <= 5) {
int64_t durationUs;