Merge "Implement missing pause/resume support for NuPlayer." into honeycomb

This commit is contained in:
Andreas Huber
2011-01-20 17:05:48 -08:00
committed by Android (Google) Code Review
4 changed files with 85 additions and 5 deletions

View File

@@ -92,11 +92,11 @@ void NuPlayer::start() {
} }
void NuPlayer::pause() { void NuPlayer::pause() {
// XXX to be implemented (new AMessage(kWhatPause, id()))->post();
} }
void NuPlayer::resume() { void NuPlayer::resume() {
// XXX to be implemented (new AMessage(kWhatResume, id()))->post();
} }
void NuPlayer::resetAsync() { void NuPlayer::resetAsync() {
@@ -430,6 +430,20 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
break; break;
} }
case kWhatPause:
{
CHECK(mRenderer != NULL);
mRenderer->pause();
break;
}
case kWhatResume:
{
CHECK(mRenderer != NULL);
mRenderer->resume();
break;
}
default: default:
TRESPASS(); TRESPASS();
break; break;

View File

@@ -75,6 +75,8 @@ private:
kWhatRendererNotify, kWhatRendererNotify,
kWhatReset, kWhatReset,
kWhatSeek, kWhatSeek,
kWhatPause,
kWhatResume,
}; };
wp<NuPlayerDriver> mDriver; wp<NuPlayerDriver> mDriver;

View File

@@ -42,7 +42,8 @@ NuPlayer::Renderer::Renderer(
mFlushingVideo(false), mFlushingVideo(false),
mHasAudio(mAudioSink != NULL), mHasAudio(mAudioSink != NULL),
mHasVideo(true), mHasVideo(true),
mSyncQueues(mHasAudio && mHasVideo) { mSyncQueues(mHasAudio && mHasVideo),
mPaused(false) {
} }
NuPlayer::Renderer::~Renderer() { NuPlayer::Renderer::~Renderer() {
@@ -93,6 +94,14 @@ void NuPlayer::Renderer::signalTimeDiscontinuity() {
mSyncQueues = mHasAudio && mHasVideo; mSyncQueues = mHasAudio && mHasVideo;
} }
void NuPlayer::Renderer::pause() {
(new AMessage(kWhatPause, id()))->post();
}
void NuPlayer::Renderer::resume() {
(new AMessage(kWhatResume, id()))->post();
}
void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) { void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
switch (msg->what()) { switch (msg->what()) {
case kWhatDrainAudioQueue: case kWhatDrainAudioQueue:
@@ -151,6 +160,18 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
break; break;
} }
case kWhatPause:
{
onPause();
break;
}
case kWhatResume:
{
onResume();
break;
}
default: default:
TRESPASS(); TRESPASS();
break; break;
@@ -158,7 +179,7 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
} }
void NuPlayer::Renderer::postDrainAudioQueue() { void NuPlayer::Renderer::postDrainAudioQueue() {
if (mDrainAudioQueuePending || mSyncQueues) { if (mDrainAudioQueuePending || mSyncQueues || mPaused) {
return; return;
} }
@@ -254,7 +275,7 @@ void NuPlayer::Renderer::onDrainAudioQueue() {
} }
void NuPlayer::Renderer::postDrainVideoQueue() { void NuPlayer::Renderer::postDrainVideoQueue() {
if (mDrainVideoQueuePending || mSyncQueues) { if (mDrainVideoQueuePending || mSyncQueues || mPaused) {
return; return;
} }
@@ -528,5 +549,39 @@ void NuPlayer::Renderer::notifyPosition() {
notify->post(); notify->post();
} }
void NuPlayer::Renderer::onPause() {
CHECK(!mPaused);
mDrainAudioQueuePending = false;
++mAudioQueueGeneration;
mDrainVideoQueuePending = false;
++mVideoQueueGeneration;
if (mHasAudio) {
mAudioSink->pause();
}
mPaused = true;
}
void NuPlayer::Renderer::onResume() {
CHECK(mPaused);
if (mHasAudio) {
mAudioSink->start();
}
mPaused = false;
if (!mAudioQueue.empty()) {
postDrainAudioQueue();
}
if (!mVideoQueue.empty()) {
postDrainVideoQueue();
}
}
} // namespace android } // namespace android

View File

@@ -41,6 +41,9 @@ struct NuPlayer::Renderer : public AHandler {
void signalAudioSinkChanged(); void signalAudioSinkChanged();
void pause();
void resume();
enum { enum {
kWhatEOS, kWhatEOS,
kWhatFlushComplete, kWhatFlushComplete,
@@ -60,6 +63,8 @@ private:
kWhatQueueEOS, kWhatQueueEOS,
kWhatFlush, kWhatFlush,
kWhatAudioSinkChanged, kWhatAudioSinkChanged,
kWhatPause,
kWhatResume,
}; };
struct QueueEntry { struct QueueEntry {
@@ -91,6 +96,8 @@ private:
bool mHasVideo; bool mHasVideo;
bool mSyncQueues; bool mSyncQueues;
bool mPaused;
void onDrainAudioQueue(); void onDrainAudioQueue();
void postDrainAudioQueue(); void postDrainAudioQueue();
@@ -101,6 +108,8 @@ private:
void onQueueEOS(const sp<AMessage> &msg); void onQueueEOS(const sp<AMessage> &msg);
void onFlush(const sp<AMessage> &msg); void onFlush(const sp<AMessage> &msg);
void onAudioSinkChanged(); void onAudioSinkChanged();
void onPause();
void onResume();
void notifyEOS(bool audio); void notifyEOS(bool audio);
void notifyFlushComplete(bool audio); void notifyFlushComplete(bool audio);