From cb0deae5f159044a7231e038381a4e7dba2e696e Mon Sep 17 00:00:00 2001 From: Tats Date: Mon, 23 Jun 2014 16:54:44 -0400 Subject: [PATCH] Base implementation of play/pause/rewind (working, still adjustments to do in the GUI) --- MainWindow.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ MainWindow.h | 11 ++++++++++- MediaImpl.cpp | 47 +++++++++++++++++++++------------------------ MediaImpl.h | 5 +++-- Paint.cpp | 15 +++++++++++++++ Paint.h | 17 +++++++++++++++++ 6 files changed, 119 insertions(+), 28 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index 091b2e6..2a49b92 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -420,6 +420,27 @@ void MainWindow::addEllipse() addMappingItem(mappingId); } +void MainWindow::play() +{ + // Start all paints. + for (int i=0; inPaints(); i++) + mappingManager->getPaint(i)->play(); +} + +void MainWindow::pause() +{ + // Pause all paints. + for (int i=0; inPaints(); i++) + mappingManager->getPaint(i)->pause(); +} + +void MainWindow::rewind() +{ + // Rewind all paints. + for (int i=0; inPaints(); i++) + mappingManager->getPaint(i)->rewind(); +} + void MainWindow::about() { // Stop video playback to avoid lags. XXX Hack @@ -997,6 +1018,27 @@ void MainWindow::createActions() connect(addEllipseAction, SIGNAL(triggered()), this, SLOT(addEllipse())); addEllipseAction->setEnabled(false); + // Play. + playAction = new QAction(tr("Play"), this); + playAction->setShortcut(tr("CTRL+P")); + playAction->setIcon(QIcon(":/images/draw-ellipse-2.png")); + playAction->setStatusTip(tr("Play")); + connect(playAction, SIGNAL(triggered()), this, SLOT(play())); + + // Pause. + pauseAction = new QAction(tr("Pause"), this); + pauseAction->setShortcut(tr("CTRL+P")); + pauseAction->setIcon(QIcon(":/images/draw-ellipse-2.png")); + pauseAction->setStatusTip(tr("Pause")); + connect(pauseAction, SIGNAL(triggered()), this, SLOT(pause())); + + // Pause. + rewindAction = new QAction(tr("Rewind"), this); + rewindAction->setShortcut(tr("CTRL+R")); + rewindAction->setIcon(QIcon(":/images/draw-ellipse-2.png")); + rewindAction->setStatusTip(tr("Rewind")); + connect(rewindAction, SIGNAL(triggered()), this, SLOT(rewind())); + // Toggle display of output window. displayOutputWindow = new QAction(tr("&Display output window"), this); displayOutputWindow->setShortcut(tr("Ctrl+D")); @@ -1070,6 +1112,12 @@ void MainWindow::createMenus() viewMenu->addAction(outputWindowFullScreen); viewMenu->addAction(displayCanvasControls); + // Run. + runMenu = menuBar->addMenu(tr("&Run")); + runMenu->addAction(playAction); + runMenu->addAction(pauseAction); + runMenu->addAction(rewindAction); + // selectSubMenu = editMenu->addMenu(tr("&Select")); // selectSubMenu->addAction(selectRowAction); // selectSubMenu->addAction(selectColumnAction); @@ -1114,6 +1162,10 @@ void MainWindow::createToolBars() fileToolBar->addAction(addMeshAction); fileToolBar->addAction(addTriangleAction); fileToolBar->addAction(addEllipseAction); + fileToolBar->addSeparator(); + fileToolBar->addAction(playAction); + fileToolBar->addAction(pauseAction); + fileToolBar->addAction(rewindAction); // editToolBar = addToolBar(tr("&Edit")); // editToolBar->addAction(cutAction); diff --git a/MainWindow.h b/MainWindow.h index 0e81e98..9e9617f 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -97,6 +97,10 @@ private slots: void addTriangle(); void addEllipse(); + void play(); + void pause(); + void rewind(); + // Other. void windowModified(); void pollOscInterface(); @@ -211,8 +215,9 @@ private: // QMenu *selectSubMenu; // QMenu *toolsMenu; // QMenu *optionsMenu; - QMenu *viewMenu; QMenu *editMenu; + QMenu *viewMenu; + QMenu *runMenu; QMenu *helpMenu; // Toolbar. @@ -237,6 +242,10 @@ private: QAction *addTriangleAction; QAction *addEllipseAction; + QAction *playAction; + QAction *pauseAction; + QAction *rewindAction; + QAction *displayOutputWindow; QAction *outputWindowFullScreen; QAction *displayCanvasControls; diff --git a/MediaImpl.cpp b/MediaImpl.cpp index 784fa58..e2d3dcc 100644 --- a/MediaImpl.cpp +++ b/MediaImpl.cpp @@ -422,7 +422,7 @@ bool MediaImpl::loadMovie(QString filename) _bus = gst_element_get_bus (_pipeline); // Start playing. - if (!_setPlayState(true)) + if (!setPlayState(true)) return false; qDebug() << "Pipeline started."; @@ -431,7 +431,6 @@ bool MediaImpl::loadMovie(QString filename) return true; } - bool MediaImpl::runVideo() { // if (!_VIDEO_OUT->connected()) @@ -475,6 +474,25 @@ bool MediaImpl::runVideo() { return bitsChanged; } +bool MediaImpl::setPlayState(bool play) +{ + if (_pipeline == NULL) + return false; + + GstStateChangeReturn ret = gst_element_set_state (_pipeline, (play ? GST_STATE_PLAYING : GST_STATE_PAUSED)); + if (ret == GST_STATE_CHANGE_FAILURE) + { + qDebug() << "Unable to set the pipeline to the playing state."; + unloadMovie(); + return false; + } + else + { + _setReady(play); + + return true; + } +} //void VideoImpl::runAudio() { // @@ -618,27 +636,6 @@ void MediaImpl::_postRun() } } - -bool MediaImpl::_setPlayState(bool play) -{ - if (_pipeline == NULL) - return false; - - GstStateChangeReturn ret = gst_element_set_state (_pipeline, (play ? GST_STATE_PLAYING : GST_STATE_PAUSED)); - if (ret == GST_STATE_CHANGE_FAILURE) - { - qDebug() << "Unable to set the pipeline to the playing state."; - unloadMovie(); - return false; - } - else - { - _setReady(play); - - return true; - } -} - void MediaImpl::_setReady(bool ready) { _movieReady = ready; @@ -762,12 +759,12 @@ exit: void MediaImpl::internalPrePlay() { // Start/resume playback. - _setPlayState(true); + setPlayState(true); } void MediaImpl::internalPostPlay() { // Pause playback. - _setPlayState(false); + setPlayState(false); } diff --git a/MediaImpl.h b/MediaImpl.h index 3de0edc..f35336f 100644 --- a/MediaImpl.h +++ b/MediaImpl.h @@ -60,10 +60,12 @@ public: // void runAudio(); bool loadMovie(QString filename); + bool setPlayState(bool play); + void resetMovie(); + protected: void unloadMovie(); void freeResources(); - void resetMovie(); void internalPrePlay(); void internalPostPlay(); @@ -76,7 +78,6 @@ private: bool _preRun(); void _postRun(); - bool _setPlayState(bool play); void _setReady(bool ready); void _setFinished(bool finished); diff --git a/Paint.cpp b/Paint.cpp index b201781..8ea95c8 100644 --- a/Paint.cpp +++ b/Paint.cpp @@ -80,6 +80,21 @@ void Media::update() { bitsChanged = true; } +void Media::play() +{ + impl_->setPlayState(true); +} + +void Media::pause() +{ + impl_->setPlayState(false); +} + +void Media::rewind() +{ + impl_->resetMovie(); +} + const uchar* Media::_getBits() const { return this->impl_->getBits(); diff --git a/Paint.h b/Paint.h index 19579cb..4c97681 100644 --- a/Paint.h +++ b/Paint.h @@ -67,6 +67,15 @@ public: /// This method should be called at each call of draw(). virtual void update() {} + /// Starts playback. + virtual void play() {} + + /// Pauses playback. + virtual void pause() {} + + /// Rewinds. + virtual void rewind() {} + void setName(const QString& name) { _name = name; } QString getName() const { return _name; } uid getId() const { return _id; } @@ -192,6 +201,14 @@ public: bool setUri(const QString &uri); virtual void build(); virtual void update(); + + /// Starts playback. + virtual void play(); + /// Pauses playback. + virtual void pause(); + /// Rewinds. + virtual void rewind(); + virtual QString getType() const { return "media";