From 9197aa2ddf1d3f1e2463ef66a391d151522c384a Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sat, 17 Jan 2009 17:37:06 +0000 Subject: [PATCH] WIP: PlaybackController can now push frames to the Viewer --- src/gui/controller/playback-controller.cpp | 13 ++++++++++++- src/gui/controller/playback-controller.hpp | 7 +++++++ src/gui/gtk-lumiera.hpp | 1 - src/gui/panels/viewer-panel.cpp | 21 ++++++++++++++++++++- src/gui/panels/viewer-panel.hpp | 4 ++++ src/gui/widgets/video-display-widget.cpp | 6 ++++++ src/gui/widgets/video-display-widget.hpp | 2 ++ 7 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/gui/controller/playback-controller.cpp b/src/gui/controller/playback-controller.cpp index a89036075..d69d3f7ce 100644 --- a/src/gui/controller/playback-controller.cpp +++ b/src/gui/controller/playback-controller.cpp @@ -29,7 +29,13 @@ namespace controller { void PlaybackController::play() { - g_message("Play"); + pull_frame(); +} + +void +PlaybackController::attach_viewer(const sigc::slot& on_frame) +{ + frame_signal.connect(on_frame); } void PlaybackController::playback_thread() @@ -39,7 +45,12 @@ void PlaybackController::playback_thread() void PlaybackController::pull_frame() { + unsigned char buffer[320 * 240 * 4]; + + for(int i = 0; i < 320*240*4; i++) + buffer[i] = rand(); + frame_signal.emit(buffer); } } // namespace controller diff --git a/src/gui/controller/playback-controller.hpp b/src/gui/controller/playback-controller.hpp index ea0f8dc96..601fb9d2b 100644 --- a/src/gui/controller/playback-controller.hpp +++ b/src/gui/controller/playback-controller.hpp @@ -23,6 +23,8 @@ ** This file contains the definition of the playback controller object */ +#include + #ifndef PLAYBACK_CONTROLLER_HPP #define PLAYBACK_CONTROLLER_HPP @@ -34,12 +36,17 @@ class PlaybackController public: void play(); + + void attach_viewer(const sigc::slot& on_frame); private: void playback_thread(); void pull_frame(); + +private: + sigc::signal frame_signal; }; } // namespace controller diff --git a/src/gui/gtk-lumiera.hpp b/src/gui/gtk-lumiera.hpp index 7f5a8cacd..a01bc5dc4 100644 --- a/src/gui/gtk-lumiera.hpp +++ b/src/gui/gtk-lumiera.hpp @@ -37,7 +37,6 @@ #include #include #include "lib/util.hpp" -#include "backend/thread-wrapper.hpp" extern "C" { #include diff --git a/src/gui/panels/viewer-panel.cpp b/src/gui/panels/viewer-panel.cpp index 7f68b39f3..f012a406e 100644 --- a/src/gui/panels/viewer-panel.cpp +++ b/src/gui/panels/viewer-panel.cpp @@ -23,8 +23,13 @@ #include "../gtk-lumiera.hpp" #include "viewer-panel.hpp" -using namespace gui::widgets; +#include "../workspace/workspace-window.hpp" +#include "../controller/controller.hpp" +#include "../controller/playback-controller.hpp" + using namespace Gtk; +using namespace gui::widgets; +using namespace gui::controller; namespace gui { namespace panels { @@ -34,6 +39,20 @@ ViewerPanel::ViewerPanel(workspace::WorkspaceWindow &workspace_window) : { //----- Pack in the Widgets -----// pack_start(display, PACK_EXPAND_WIDGET); + + PlaybackController &playback = + workspace_window.get_controller().get_playback_controller(); + + playback.attach_viewer(sigc::mem_fun(this, &ViewerPanel::on_frame)); +} + +void +ViewerPanel::on_frame(void *buffer) +{ + Displayer *displayer = display.get_displayer(); + REQUIRE(displayer); + + displayer->put(buffer); } } // namespace panels diff --git a/src/gui/panels/viewer-panel.hpp b/src/gui/panels/viewer-panel.hpp index a991014e9..b56fb3701 100644 --- a/src/gui/panels/viewer-panel.hpp +++ b/src/gui/panels/viewer-panel.hpp @@ -45,6 +45,10 @@ public: * @param workspace_window The window that owns this panel. **/ ViewerPanel(workspace::WorkspaceWindow &owner_window); + +protected: + + void on_frame(void *buffer); protected: diff --git a/src/gui/widgets/video-display-widget.cpp b/src/gui/widgets/video-display-widget.cpp index 0c396ed4d..1f9dca844 100644 --- a/src/gui/widgets/video-display-widget.cpp +++ b/src/gui/widgets/video-display-widget.cpp @@ -45,6 +45,12 @@ VideoDisplayWidget::~VideoDisplayWidget() delete displayer; } +Displayer* +VideoDisplayWidget::get_displayer() const +{ + return displayer; +} + void VideoDisplayWidget::on_realize() { diff --git a/src/gui/widgets/video-display-widget.hpp b/src/gui/widgets/video-display-widget.hpp index 6bf829f7a..5ea827d81 100644 --- a/src/gui/widgets/video-display-widget.hpp +++ b/src/gui/widgets/video-display-widget.hpp @@ -41,6 +41,8 @@ public: VideoDisplayWidget(); ~VideoDisplayWidget(); + + Displayer* get_displayer() const; /* ===== Overrides ===== */ private: