qtmobility/plugins/multimedia/directshow/player/directshowplayercontrol.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 11 06b8e2af4411
--- a/qtmobility/plugins/multimedia/directshow/player/directshowplayercontrol.cpp	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/plugins/multimedia/directshow/player/directshowplayercontrol.cpp	Mon May 03 13:18:40 2010 +0300
@@ -79,8 +79,10 @@
     , m_updateProperties(0)
     , m_state(QMediaPlayer::StoppedState)
     , m_status(QMediaPlayer::UnknownMediaStatus)
+    , m_error(QMediaPlayer::NoError)
     , m_streamTypes(0)
     , m_muteVolume(-1)
+    , m_position(0)
     , m_duration(0)
     , m_playbackRate(0)
     , m_seekable(false)
@@ -110,7 +112,7 @@
 
 qint64 DirectShowPlayerControl::position() const
 {
-    return m_service->position();
+    return const_cast<qint64 &>(m_position) = m_service->position();
 }
 
 void DirectShowPlayerControl::setPosition(qint64 position)
@@ -237,12 +239,7 @@
 
     m_service->load(media, stream);
 
-    emit audioAvailableChanged(m_streamTypes & DirectShowPlayerService::AudioStream);
-    emit videoAvailableChanged(m_streamTypes & DirectShowPlayerService::VideoStream);
-    emit durationChanged(m_duration);
-    emit seekableChanged(m_seekable);
-    emit mediaStatusChanged(m_status);
-    emit stateChanged(m_state);
+    emitPropertyChanges();
 }
 
 void DirectShowPlayerControl::play()
@@ -266,28 +263,7 @@
 void DirectShowPlayerControl::customEvent(QEvent *event)
 {
     if (event->type() == QEvent::Type(PropertiesChanged)) {
-        int properties = m_updateProperties;
-        m_updateProperties = 0;
-
-        if (properties & PlaybackRateProperty)
-            emit playbackRateChanged(m_playbackRate);
-
-        if (properties & StreamTypesProperty) {
-            emit audioAvailableChanged(m_streamTypes & DirectShowPlayerService::AudioStream);
-            emit videoAvailableChanged(m_streamTypes & DirectShowPlayerService::VideoStream);
-        }
-
-        if (properties & DurationProperty)
-            emit durationChanged(m_duration);
-
-        if (properties & SeekableProperty)
-            emit seekableChanged(m_seekable);
-
-        if (properties & StatusProperty)
-            emit mediaStatusChanged(m_status);
-
-        if (properties & StateProperty)
-            emit stateChanged(m_state);
+        emitPropertyChanges();
 
         event->accept();
     } else {
@@ -295,6 +271,38 @@
     }
 }
 
+void DirectShowPlayerControl::emitPropertyChanges()
+{
+    int properties = m_updateProperties;
+    m_updateProperties = 0;
+
+    if ((properties & ErrorProperty) && m_error != QMediaPlayer::NoError)
+        emit error(m_error, m_errorString);
+
+    if (properties & PlaybackRateProperty)
+        emit playbackRateChanged(m_playbackRate);
+
+    if (properties & StreamTypesProperty) {
+        emit audioAvailableChanged(m_streamTypes & DirectShowPlayerService::AudioStream);
+        emit videoAvailableChanged(m_streamTypes & DirectShowPlayerService::VideoStream);
+    }
+
+    if (properties & PositionProperty)
+        emit positionChanged(m_position);
+
+    if (properties & DurationProperty)
+        emit durationChanged(m_duration);
+
+    if (properties & SeekableProperty)
+        emit seekableChanged(m_seekable);
+
+    if (properties & StatusProperty)
+        emit mediaStatusChanged(m_status);
+
+    if (properties & StateProperty)
+        emit stateChanged(m_state);
+}
+
 void DirectShowPlayerControl::scheduleUpdate(int properties)
 {
     if (m_updateProperties == 0)
@@ -360,5 +368,23 @@
     if (m_audio)
         m_audio->Release();
 
-    m_audio = com_cast<IBasicAudio>(filter);
+    m_audio = com_cast<IBasicAudio>(filter, IID_IBasicAudio);
 }
+
+void DirectShowPlayerControl::updateError(QMediaPlayer::Error error, const QString &errorString)
+{
+    m_error = error;
+    m_errorString = errorString;
+
+    if (m_error != QMediaPlayer::NoError)
+        scheduleUpdate(ErrorProperty);
+}
+
+void DirectShowPlayerControl::updatePosition(qint64 position)
+{
+    if (m_position != position) {
+        m_position = position;
+
+        scheduleUpdate(PositionProperty);
+    }
+}