diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2010-10-06 03:57:32 +0200 |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2010-10-06 03:57:32 +0200 |
commit | 83087feb485a4b297123b453765e6f9add2e40b9 (patch) | |
tree | 525005cad8a1a91d047d91fc37600f470d0e44d4 | |
parent | 96a57b8d759dec23d5100ebbc4793a4371c83e29 (diff) | |
parent | 806002dbb1323397b37db8d29a04e94bb097099d (diff) |
Merge branch '1.0' of scm.dev.nokia.troll.no:qtmobility/qtm-multimedia into 1.0-integration
* '1.0' of scm.dev.nokia.troll.no:qtmobility/qtm-multimedia:
Fix replaying media from a state of status changed signal. [WMP]
Fix the return value of duration in the WMP media player backend.
Set the correct status at end of media in the WMP media player backend.
-rw-r--r-- | plugins/multimedia/wmp/qwmpplayercontrol.cpp | 147 | ||||
-rw-r--r-- | plugins/multimedia/wmp/qwmpplayercontrol.h | 14 |
2 files changed, 100 insertions, 61 deletions
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; |