diff options
| author | Andrew den Exter <andrew.den-exter@nokia.com> | 2010-10-07 16:17:30 +1000 |
|---|---|---|
| committer | Andrew den Exter <andrew.den-exter@nokia.com> | 2010-10-07 16:17:30 +1000 |
| commit | fe97907352f901bfe10b98aff9804d0a51f9ea9d (patch) | |
| tree | dfae53169c5ec785d5f9652c7143352af0fb469e | |
| parent | c9c52483e64d4b58b30f296a7bd4ba0822352f5f (diff) | |
| parent | cd828e68bd471232ad0010582ca8b3d3d848ad63 (diff) | |
Merge branch '1.0' into 1.1
Conflicts:
plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayersession.cpp
| -rw-r--r-- | examples/slideshow/slideshow.cpp | 103 | ||||
| -rw-r--r-- | examples/slideshow/slideshow.h | 14 | ||||
| -rw-r--r-- | plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayersession.cpp | 14 | ||||
| -rw-r--r-- | plugins/multimedia/wmp/qwmpplayercontrol.cpp | 147 | ||||
| -rw-r--r-- | plugins/multimedia/wmp/qwmpplayercontrol.h | 14 |
5 files changed, 157 insertions, 135 deletions
diff --git a/examples/slideshow/slideshow.cpp b/examples/slideshow/slideshow.cpp index c9d688c8d2..733eee9294 100644 --- a/examples/slideshow/slideshow.cpp +++ b/examples/slideshow/slideshow.cpp @@ -47,13 +47,13 @@ #include <QtGui> SlideShow::SlideShow(QWidget *parent) - : QWidget(parent) + : QMainWindow(parent) , imageViewer(0) , playlist(0) , statusLabel(0) - , countdownLabel(0) - , playButton(0) - , stopButton(0) + , countdownAction(0) + , playAction(0) + , stopAction(0) , viewerLayout(0) { imageViewer = new QMediaImageViewer(this); @@ -92,61 +92,40 @@ SlideShow::SlideShow(QWidget *parent) viewerLayout->addWidget(videoWidget); viewerLayout->addWidget(statusLabel); - QMenu *openMenu = new QMenu(this); - openMenu->addAction(tr("Directory..."), this, SLOT(openDirectory())); - openMenu->addAction(tr("Playlist..."), this, SLOT(openPlaylist())); + menuBar()->addAction(tr("Open Directory..."), this, SLOT(openDirectory())); + menuBar()->addAction(tr("Open Playlist..."), this, SLOT(openPlaylist())); - QToolButton *openButton = new QToolButton; - openButton->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton)); - openButton->setMenu(openMenu); - openButton->setPopupMode(QToolButton::InstantPopup); + toolBar = new QToolBar; + toolBar->setMovable(false); + toolBar->setFloatable(false); + toolBar->setEnabled(false); - playButton = new QToolButton; - playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); - playButton->setEnabled(false); + toolBar->addAction( + style()->standardIcon(QStyle::SP_MediaSkipBackward), + tr("Previous"), + playlist, + SLOT(previous())); + stopAction = toolBar->addAction( + style()->standardIcon(QStyle::SP_MediaStop), tr("Stop"), imageViewer, SLOT(stop())); + playAction = toolBar->addAction( + style()->standardIcon(QStyle::SP_MediaPlay), tr("Play"), this, SLOT(play())); + toolBar->addAction( + style()->standardIcon(QStyle::SP_MediaSkipForward), tr("Next"), playlist, SLOT(next())); - connect(playButton, SIGNAL(clicked()), this, SLOT(play())); - connect(this, SIGNAL(enableButtons(bool)), playButton, SLOT(setEnabled(bool))); + QToolBar *countdownToolBar = new QToolBar; + countdownToolBar->setMovable(false); + countdownToolBar->setFloatable(false); + countdownToolBar->setToolButtonStyle(Qt::ToolButtonTextOnly); + countdownAction = countdownToolBar->addAction(QString()); - stopButton = new QToolButton; - stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop)); - stopButton->setEnabled(false); - connect(stopButton, SIGNAL(clicked()), imageViewer, SLOT(stop())); + addToolBar(Qt::BottomToolBarArea, toolBar); + addToolBar(Qt::BottomToolBarArea, countdownToolBar); - QAbstractButton *nextButton = new QToolButton; - nextButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward)); - nextButton->setEnabled(false); - - connect(nextButton, SIGNAL(clicked()), playlist, SLOT(next())); - connect(this, SIGNAL(enableButtons(bool)), nextButton, SLOT(setEnabled(bool))); - - QAbstractButton *previousButton = new QToolButton; - previousButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipBackward)); - previousButton->setEnabled(false); - - connect(previousButton, SIGNAL(clicked()), playlist, SLOT(previous())); - connect(this, SIGNAL(enableButtons(bool)), previousButton, SLOT(setEnabled(bool))); - - countdownLabel = new QLabel; - - QBoxLayout *controlLayout = new QHBoxLayout; - controlLayout->setMargin(0); - controlLayout->addWidget(openButton); - controlLayout->addStretch(1); - controlLayout->addWidget(previousButton); - controlLayout->addWidget(stopButton); - controlLayout->addWidget(playButton); - controlLayout->addWidget(nextButton); - controlLayout->addStretch(1); - controlLayout->addWidget(countdownLabel); - - QBoxLayout *layout = new QVBoxLayout; - layout->addLayout(viewerLayout); - layout->addLayout(controlLayout); - - setLayout(layout); + QWidget *centralWidget = new QWidget; + centralWidget->setLayout(viewerLayout); + setCentralWidget(centralWidget); } void SlideShow::openPlaylist() @@ -173,7 +152,7 @@ void SlideShow::openDirectory() statusChanged(imageViewer->mediaStatus()); - emit enableButtons(playlist->mediaCount() > 0); + toolBar->setEnabled(playlist->mediaCount() > 0); } } @@ -194,16 +173,16 @@ void SlideShow::stateChanged(QMediaImageViewer::State state) { switch (state) { case QMediaImageViewer::StoppedState: - stopButton->setEnabled(false); - playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + stopAction->setEnabled(false); + playAction->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; case QMediaImageViewer::PlayingState: - stopButton->setEnabled(true); - playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); + stopAction->setEnabled(true); + playAction->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); break; case QMediaImageViewer::PausedState: - stopButton->setEnabled(true); - playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + stopAction->setEnabled(true); + playAction->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; } } @@ -242,7 +221,7 @@ void SlideShow::playlistLoaded() { statusChanged(imageViewer->mediaStatus()); - emit enableButtons(playlist->mediaCount() > 0); + toolBar->setEnabled(playlist->mediaCount() > 0); } void SlideShow::playlistLoadFailed() @@ -250,14 +229,14 @@ void SlideShow::playlistLoadFailed() statusLabel->setText(playlist->errorString()); viewerLayout->setCurrentIndex(1); - emit enableButtons(false); + toolBar->setEnabled(false); } void SlideShow::elapsedTimeChanged(int time) { const int remaining = (imageViewer->timeout() - time) / 1000; - countdownLabel->setText(tr("%1:%2") + countdownAction->setText(tr("%1:%2") .arg(remaining / 60, 2, 10, QLatin1Char('0')) .arg(remaining % 60, 2, 10, QLatin1Char('0'))); } diff --git a/examples/slideshow/slideshow.h b/examples/slideshow/slideshow.h index d86a064ba9..d077be0757 100644 --- a/examples/slideshow/slideshow.h +++ b/examples/slideshow/slideshow.h @@ -41,7 +41,7 @@ #ifndef SLIDESHOW_H #define SLIDESHOW_H -#include <QWidget> +#include <QMainWindow> #include <qmediaimageviewer.h> QT_BEGIN_NAMESPACE @@ -54,15 +54,12 @@ QT_END_NAMESPACE QT_USE_NAMESPACE -class SlideShow : public QWidget +class SlideShow : public QMainWindow { Q_OBJECT public: SlideShow(QWidget *parent = 0); -signals: - void enableButtons(bool enable); - private slots: void openPlaylist(); void openDirectory(); @@ -81,9 +78,10 @@ private: QMediaImageViewer *imageViewer; QMediaPlaylist *playlist; QLabel *statusLabel; - QLabel *countdownLabel; - QAbstractButton *playButton; - QAbstractButton *stopButton; + QAction *countdownAction; + QAction *playAction; + QAction *stopAction; + QToolBar *toolBar; QStackedLayout *viewerLayout; }; diff --git a/plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayersession.cpp b/plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayersession.cpp index dce0803ae9..6b7f4671dc 100644 --- a/plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayersession.cpp +++ b/plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayersession.cpp @@ -857,10 +857,6 @@ void QGstreamerPlayerSession::busMessage(const QGstreamerMessage &message) m_playbackRate = 1.0; setPlaybackRate(rate); } - - if (m_renderer) - m_renderer->precessNewStream(); - } if (m_state != prevState) @@ -972,6 +968,16 @@ void QGstreamerPlayerSession::busMessage(const QGstreamerMessage &message) default: break; } + } else if (m_videoSink + && m_renderer + && GST_MESSAGE_SRC(gm) == GST_OBJECT_CAST(m_videoSink) + && GST_MESSAGE_TYPE(gm) == GST_MESSAGE_STATE_CHANGED) { + GstState oldState; + GstState newState; + gst_message_parse_state_changed(gm, &oldState, &newState, 0); + + if (oldState == GST_STATE_READY && newState == GST_STATE_PAUSED) + m_renderer->precessNewStream(); } } } diff --git a/plugins/multimedia/wmp/qwmpplayercontrol.cpp b/plugins/multimedia/wmp/qwmpplayercontrol.cpp index ed3b4e0998..be8f107b8a 100644 --- a/plugins/multimedia/wmp/qwmpplayercontrol.cpp +++ b/plugins/multimedia/wmp/qwmpplayercontrol.cpp @@ -49,7 +49,8 @@ #include <qmediaplayer.h> #include <qmediaplaylist.h> -#include <QtCore/qdebug.h> +#include <QtCore/qcoreapplication.h> +#include <QtCore/qcoreevent.h> #include <QtCore/qurl.h> #include <QtCore/qvariant.h> @@ -59,7 +60,7 @@ QWmpPlayerControl::QWmpPlayerControl(IWMPCore3 *player, QWmpEvents *events, QObj , m_controls(0) , m_settings(0) , m_state(QMediaPlayer::StoppedState) - , m_duration(0) + , m_changes(0) , m_buffering(false) , m_audioAvailable(false) , m_videoAvailable(false) @@ -108,16 +109,15 @@ qint64 QWmpPlayerControl::duration() const IWMPMedia *media = 0; if (m_controls && m_controls->get_currentItem(&media) == S_OK) { media->get_duration(&duration); - media->Release(); } - return m_duration * 1000; + return duration * 1000; } qint64 QWmpPlayerControl::position() const { - double position; + double position = 0.0; if (m_controls) m_controls->get_currentPosition(&position); @@ -277,25 +277,49 @@ void QWmpPlayerControl::setMedia(const QMediaContent &content, QIODevice *stream setUrl(QUrl()); } +bool QWmpPlayerControl::event(QEvent *event) +{ + if (event->type() == QEvent::UpdateRequest) { + const int changes = m_changes; + m_changes = 0; + + if (changes & DurationChanged) + emit durationChanged(duration()); + if (changes & PositionChanged) + emit positionChanged(position()); + if (changes & StatusChanged) + emit mediaStatusChanged(m_status); + if (changes & StateChanged) + emit stateChanged(m_state); + + return true; + } else { + return QMediaPlayerControl::event(event); + } +} + +void QWmpPlayerControl::scheduleUpdate(int change) +{ + if (m_changes == 0) + QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest)); + + m_changes |= change; +} + void QWmpPlayerControl::bufferingEvent(VARIANT_BOOL buffering) { if (m_state != QMediaPlayer::StoppedState) { - emit mediaStatusChanged(m_status = buffering + m_status = buffering ? QMediaPlayer::BufferingMedia - : QMediaPlayer::BufferedMedia); + : QMediaPlayer::BufferedMedia; + + scheduleUpdate(StatusChanged); } } -void QWmpPlayerControl::currentItemChangeEvent(IDispatch *dispatch) +void QWmpPlayerControl::currentItemChangeEvent(IDispatch *) { - IWMPMedia *media = 0; - if (dispatch && dispatch->QueryInterface( - __uuidof(IWMPMedia), reinterpret_cast<void **>(&media)) == S_OK) { - double duration = 0; - - if (media->get_duration(&duration) == S_OK) - emit durationChanged(duration * 1000); - } + scheduleUpdate(DurationChanged); } void QWmpPlayerControl::mediaChangeEvent(IDispatch *dispatch) @@ -306,23 +330,18 @@ void QWmpPlayerControl::mediaChangeEvent(IDispatch *dispatch) IWMPMedia *currentMedia = 0; if (m_controls && m_controls->get_currentItem(¤tMedia) == S_OK) { VARIANT_BOOL isEqual = VARIANT_FALSE; - if (media->get_isIdentical(currentMedia, &isEqual) == S_OK && isEqual) { - double duration = 0; + if (media->get_isIdentical(currentMedia, &isEqual) == S_OK && isEqual) + scheduleUpdate(DurationChanged); - if (media->get_duration(&duration) == S_OK) - emit durationChanged(duration * 1000); - } currentMedia->Release(); } media->Release(); } } -void QWmpPlayerControl::positionChangeEvent(double from, double to) +void QWmpPlayerControl::positionChangeEvent(double , double) { - Q_UNUSED(from); - - emit positionChanged(to * 1000); + scheduleUpdate(PositionChanged); } void QWmpPlayerControl::playStateChangeEvent(long state) @@ -331,30 +350,31 @@ void QWmpPlayerControl::playStateChangeEvent(long state) case wmppsUndefined: m_state = QMediaPlayer::StoppedState; m_status = QMediaPlayer::UnknownMediaStatus; - - emit stateChanged(m_state); - emit mediaStatusChanged(m_status); + scheduleUpdate(StatusChanged | StateChanged); break; case wmppsStopped: if (m_state != QMediaPlayer::StoppedState) { m_state = QMediaPlayer::StoppedState; - m_status = QMediaPlayer::LoadedMedia; + scheduleUpdate(StateChanged); - emit stateChanged(m_state); - emit mediaStatusChanged(m_status); + if (m_status != QMediaPlayer::EndOfMedia) { + m_status = QMediaPlayer::LoadedMedia; + scheduleUpdate(StatusChanged); + } } break; case wmppsPaused: if (m_state != QMediaPlayer::PausedState && m_status != QMediaPlayer::BufferedMedia) { m_state = QMediaPlayer::PausedState; m_status = QMediaPlayer::BufferedMedia; - - emit stateChanged(m_state); - emit mediaStatusChanged(m_status); + scheduleUpdate(StatusChanged | StateChanged); } else if (m_state != QMediaPlayer::PausedState) { - emit stateChanged(m_state = QMediaPlayer::PausedState); + m_state = QMediaPlayer::PausedState; + scheduleUpdate(StateChanged); } else if (m_status != QMediaPlayer::BufferedMedia) { - emit mediaStatusChanged(m_status = QMediaPlayer::BufferedMedia); + m_status = QMediaPlayer::BufferedMedia; + + scheduleUpdate(StatusChanged); } break; case wmppsPlaying: @@ -363,49 +383,56 @@ void QWmpPlayerControl::playStateChangeEvent(long state) if (m_state != QMediaPlayer::PlayingState && m_status != QMediaPlayer::BufferedMedia) { m_state = QMediaPlayer::PlayingState; m_status = QMediaPlayer::BufferedMedia; - - emit stateChanged(m_state); - emit mediaStatusChanged(m_status); + scheduleUpdate(StatusChanged | StateChanged); } else if (m_state != QMediaPlayer::PlayingState) { - emit stateChanged(m_state = QMediaPlayer::PlayingState); + m_state = QMediaPlayer::PlayingState; + scheduleUpdate(StateChanged); } else if (m_status != QMediaPlayer::BufferedMedia) { - emit mediaStatusChanged(m_status = QMediaPlayer::BufferedMedia); + m_status = QMediaPlayer::BufferedMedia; + scheduleUpdate(StatusChanged); } - if (m_state != QMediaPlayer::PlayingState) - emit stateChanged(m_state = QMediaPlayer::PlayingState); - if (m_status != QMediaPlayer::BufferedMedia) - emit mediaStatusChanged(m_status = QMediaPlayer::BufferedMedia); + if (m_state != QMediaPlayer::PlayingState) { + m_state = QMediaPlayer::PlayingState; + scheduleUpdate(StateChanged); + } + if (m_status != QMediaPlayer::BufferedMedia) { + m_status = QMediaPlayer::BufferedMedia; + scheduleUpdate(StatusChanged); + } break; case wmppsBuffering: case wmppsWaiting: - if (m_status != QMediaPlayer::StalledMedia && m_state != QMediaPlayer::StoppedState) - emit mediaStatusChanged(m_status = QMediaPlayer::StalledMedia); + if (m_status != QMediaPlayer::StalledMedia && m_state != QMediaPlayer::StoppedState) { + m_status = QMediaPlayer::StalledMedia; + scheduleUpdate(StatusChanged); + } break; case wmppsMediaEnded: if (m_status != QMediaPlayer::EndOfMedia && m_state != QMediaPlayer::StoppedState) { m_state = QMediaPlayer::StoppedState; - m_status = QMediaPlayer::StalledMedia; - - emit stateChanged(m_state); - emit mediaStatusChanged(m_status); + m_status = QMediaPlayer::EndOfMedia; + scheduleUpdate(StatusChanged | StateChanged); } break; case wmppsTransitioning: - if (m_status != QMediaPlayer::LoadingMedia) - emit mediaStatusChanged(m_status = QMediaPlayer::LoadingMedia); break; case wmppsReady: - if (m_status != QMediaPlayer::LoadedMedia) - m_status = m_status = QMediaPlayer::LoadedMedia; + if (m_status != QMediaPlayer::LoadedMedia) { + m_status = QMediaPlayer::LoadedMedia; + scheduleUpdate(StatusChanged); + } - if (m_state != QMediaPlayer::StoppedState) - emit stateChanged(QMediaPlayer::StoppedState); - emit mediaStatusChanged(m_status); + if (m_state != QMediaPlayer::StoppedState) { + m_state = QMediaPlayer::StoppedState; + scheduleUpdate(StateChanged); + } break; case wmppsReconnecting: - if (m_status != QMediaPlayer::StalledMedia && m_state != QMediaPlayer::StoppedState) - emit mediaStatusChanged(m_status = QMediaPlayer::StalledMedia); + if (m_status != QMediaPlayer::StalledMedia && m_state != QMediaPlayer::StoppedState) { + m_status = QMediaPlayer::StalledMedia; + scheduleUpdate(StatusChanged); + } break; default: break; diff --git a/plugins/multimedia/wmp/qwmpplayercontrol.h b/plugins/multimedia/wmp/qwmpplayercontrol.h index 52bb3cbb95..d966b38b23 100644 --- a/plugins/multimedia/wmp/qwmpplayercontrol.h +++ b/plugins/multimedia/wmp/qwmpplayercontrol.h @@ -103,6 +103,8 @@ public: QUrl url() const; void setUrl(const QUrl &url); + bool event(QEvent *event); + using QMediaPlayerControl::positionChanged; private Q_SLOTS: @@ -114,13 +116,23 @@ private Q_SLOTS: void playStateChangeEvent(long state); private: + enum Change + { + StateChanged = 0x01, + StatusChanged = 0x02, + PositionChanged = 0x04, + DurationChanged = 0x08 + }; + + void scheduleUpdate(int change); + IWMPCore3 *m_player; IWMPControls *m_controls; IWMPSettings *m_settings; IWMPNetwork *m_network; QMediaPlayer::State m_state; QMediaPlayer::MediaStatus m_status; - qint64 m_duration; + int m_changes; bool m_buffering; bool m_audioAvailable; bool m_videoAvailable; |
