From 58512e8a340359703a5015ef9250da726a51fb1a Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 23 Jan 2009 20:23:24 +0100 Subject: [PATCH] First version working again. Thread handling is not stable and stop hangs though --- src/gui/controller/playback-controller.cpp | 29 ++++++++++++++-------- src/gui/controller/playback-controller.hpp | 2 +- src/lumiera/main.cpp | 3 +++ src/proc/play/dummy-player-service.cpp | 8 +++--- src/proc/play/dummy-player-service.hpp | 2 +- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/gui/controller/playback-controller.cpp b/src/gui/controller/playback-controller.cpp index 27028dbfb..bad1ebcc1 100644 --- a/src/gui/controller/playback-controller.cpp +++ b/src/gui/controller/playback-controller.cpp @@ -28,6 +28,7 @@ namespace gui { namespace controller { PlaybackController::PlaybackController() : + thread(0), finish_playback_thread(false), playing(false), playHandle(0) @@ -36,9 +37,7 @@ PlaybackController::PlaybackController() : PlaybackController::~PlaybackController() { - quit_playback_thread(); - if (thread) - thread->join(); + end_playback_thread(); } void @@ -47,10 +46,15 @@ PlaybackController::play() Lock sync(this); try { - playHandle = & (proc::DummyPlayer::facade().start()); - start_playback_thread(); - playing = true; - + if (playing && thread && playHandle) playHandle->pause(false); + else + { + playHandle = & (proc::DummyPlayer::facade().start()); + if (thread) + end_playback_thread(); + start_playback_thread(); + playing = true; + } } catch (lumiera::error::State& err) { @@ -74,6 +78,8 @@ PlaybackController::stop() { Lock sync(this); playing = false; + end_playback_thread(); + playHandle = 0; // TODO: stop player somehow? } @@ -88,15 +94,19 @@ void PlaybackController::start_playback_thread() { dispatcher.connect(sigc::mem_fun(this, &PlaybackController::on_frame)); + finish_playback_thread = false; thread = Glib::Thread::create (sigc::mem_fun( this, &PlaybackController::playback_thread), true); } void -PlaybackController::quit_playback_thread() +PlaybackController::end_playback_thread() { Lock sync(this); finish_playback_thread = true; + if (thread) + thread->join(); + thread = 0; } void @@ -120,8 +130,7 @@ PlaybackController::playback_thread() if(is_playing()) pull_frame(); - ////////////////////////////////TODO: usleep - Glib::Thread::yield(); + usleep(40000); // ca 25 frames pre second } } diff --git a/src/gui/controller/playback-controller.hpp b/src/gui/controller/playback-controller.hpp index 142737dfd..9cab6d968 100644 --- a/src/gui/controller/playback-controller.hpp +++ b/src/gui/controller/playback-controller.hpp @@ -64,7 +64,7 @@ private: void start_playback_thread(); - void quit_playback_thread(); + void end_playback_thread(); void playback_thread(); diff --git a/src/lumiera/main.cpp b/src/lumiera/main.cpp index 9d0317102..05e732a9f 100644 --- a/src/lumiera/main.cpp +++ b/src/lumiera/main.cpp @@ -30,6 +30,7 @@ #include "backend/enginefacade.hpp" #include "backend/netnodefacade.hpp" #include "backend/scriptrunnerfacade.hpp" +#include "include/dummy-player-facade.h" #include "proc/facade.hpp" #include "gui/guifacade.hpp" @@ -42,6 +43,7 @@ namespace { Subsys& engine = backend::EngineFacade::getDescriptor(); Subsys& netNode = backend::NetNodeFacade::getDescriptor(); Subsys& script = backend::ScriptRunnerFacade::getDescriptor(); + Subsys& player = proc::DummyPlayer::getDescriptor(); Subsys& builder = proc::Facade::getBuilderDescriptor(); Subsys& session = proc::Facade::getSessionDescriptor(); Subsys& lumigui = gui::GuiFacade::getDescriptor(); @@ -66,6 +68,7 @@ main (int argc, const char* argv[]) netNode.depends (engine); // lumigui.depends (session); //////TODO commented out in order to be able to start up a dummy GuiStarterPlugin // lumigui.depends (engine); + lumigui.depends (player); script.depends (session); script.depends (engine); diff --git a/src/proc/play/dummy-player-service.cpp b/src/proc/play/dummy-player-service.cpp index 378d7d7ff..4ec1a87ad 100644 --- a/src/proc/play/dummy-player-service.cpp +++ b/src/proc/play/dummy-player-service.cpp @@ -258,7 +258,7 @@ namespace proc { DummyPlayer::Process& DummyPlayerService::start() { - REQUIRE (!theProcess_.isActive()); + // REQUIRE (!theProcess_.isActive()); //////////////TODO: reactivate this check when we have really independent processes which can be stopped! theProcess_.setRate(25); return theProcess_; @@ -269,7 +269,7 @@ namespace proc { void ProcessImpl::setRate (uint fps) { - REQUIRE (fps==0 || fps_==0 ); + // REQUIRE (fps==0 || fps_==0 ); //////////////TODO: reactivate this check when we have really independent processes which can be stopped! REQUIRE (fps==0 || !play_ ); fps_ = fps; @@ -282,10 +282,10 @@ namespace proc { void - ProcessImpl::pause(bool doPlay) + ProcessImpl::pause(bool doPause) { REQUIRE (isActive()); - play_ = doPlay; + play_ = !doPause; } diff --git a/src/proc/play/dummy-player-service.hpp b/src/proc/play/dummy-player-service.hpp index 8f7a045e6..ae8b3161e 100644 --- a/src/proc/play/dummy-player-service.hpp +++ b/src/proc/play/dummy-player-service.hpp @@ -60,7 +60,7 @@ namespace proc { class ProcessImpl : public DummyPlayer::Process { - void pause(bool doPlay); + void pause(bool doPause); void* const getFrame(); uint fps_;