Index: media/tools/player_x11/player_x11.cc |
diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc |
index 84e08e605fcae55e4f6adc8717c337dc3214d17a..ace2ba6e64212479ded22d869476022ad59ab516 100644 |
--- a/media/tools/player_x11/player_x11.cc |
+++ b/media/tools/player_x11/player_x11.cc |
@@ -52,9 +52,17 @@ Display* g_display = NULL; |
Window g_window = 0; |
bool g_running = false; |
-void Quit(MessageLoop* message_loop) { |
- message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
-} |
+class MessageLoopQuitter { |
+ public: |
+ explicit MessageLoopQuitter(MessageLoop* loop) : loop_(loop) {} |
+ void Quit(media::PipelineStatus status) { |
+ loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
+ delete this; |
+ } |
+ private: |
+ MessageLoop* loop_; |
+ DISALLOW_COPY_AND_ASSIGN(MessageLoopQuitter); |
+}; |
// Initialize X11. Returns true if successful. This method creates the X11 |
// window. Further initialization is done in X11VideoRenderer. |
@@ -126,23 +134,20 @@ bool InitPipeline(MessageLoop* message_loop, |
else |
collection->AddAudioRenderer(new media::NullAudioRenderer()); |
- // Create and start the pipeline. |
+ // Create the pipeline and start it. |
*pipeline = new media::PipelineImpl(message_loop); |
- (*pipeline)->Start(collection.release(), filename, NULL); |
+ media::PipelineStatusNotification note; |
+ (*pipeline)->Start(collection.release(), filename, note.Callback()); |
// Wait until the pipeline is fully initialized. |
- while (true) { |
- base::PlatformThread::Sleep(100); |
- if ((*pipeline)->IsInitialized()) |
- break; |
- if ((*pipeline)->GetError() != media::PIPELINE_OK) { |
- std::cout << "InitPipeline: " << (*pipeline)->GetError() << std::endl; |
- (*pipeline)->Stop(NULL); |
- return false; |
- } |
+ note.Wait(); |
+ if (note.status() != media::PIPELINE_OK) { |
+ std::cout << "InitPipeline: " << note.status() << std::endl; |
+ (*pipeline)->Stop(NULL); |
+ return false; |
} |
- // And starts the playback. |
+ // And start the playback. |
(*pipeline)->SetPlaybackRate(1.0f); |
return true; |
} |
@@ -156,10 +161,10 @@ void PeriodicalUpdate( |
MessageLoop* message_loop, |
bool audio_only) { |
if (!g_running) { |
- // interrupt signal is received during lat time period. |
+ // interrupt signal was received during last time period. |
// Quit message_loop only when pipeline is fully stopped. |
- pipeline->Stop(media::TaskToCallbackAdapter::NewCallback( |
- NewRunnableFunction(Quit, message_loop))); |
+ MessageLoopQuitter* quitter = new MessageLoopQuitter(message_loop); |
+ pipeline->Stop(NewCallback(quitter, &MessageLoopQuitter::Quit)); |
return; |
} |
@@ -199,8 +204,8 @@ void PeriodicalUpdate( |
if (key == XK_Escape) { |
g_running = false; |
// Quit message_loop only when pipeline is fully stopped. |
- pipeline->Stop(media::TaskToCallbackAdapter::NewCallback( |
- NewRunnableFunction(Quit, message_loop))); |
+ MessageLoopQuitter* quitter = new MessageLoopQuitter(message_loop); |
+ pipeline->Stop(NewCallback(quitter, &MessageLoopQuitter::Quit)); |
return; |
} else if (key == XK_space) { |
if (pipeline->GetPlaybackRate() < 0.01f) // paused |