qtmobility/plugins/multimedia/wmp/qwmpplayerservice.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
--- a/qtmobility/plugins/multimedia/wmp/qwmpplayerservice.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/multimedia/wmp/qwmpplayerservice.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -69,7 +69,7 @@
     , m_control(0)
     , m_metaData(0)
     , m_playlist(0)
-    , m_videoOutputControl(0)
+    , m_activeVideoOverlay(0)
     , m_oleVideoOverlay(0)
 #ifdef QWMP_EVR
     , m_evrVideoOverlay(0)
@@ -95,12 +95,7 @@
         }
 
         if (m_embedMode == LocalEmbed) {
-            m_videoOutputControl = new QWmpVideoOutputControl;
-            m_videoOutputControl->setAvailableOutputs(QList<QVideoOutputControl::Output>()
-                    << QVideoOutputControl::WindowOutput);
-
-            connect(m_videoOutputControl, SIGNAL(outputChanged(QVideoOutputControl::Output)),
-                    this, SLOT(videoOutputChanged(QVideoOutputControl::Output)));
+            m_oleVideoOverlay = new QWmpVideoOverlay(m_player, m_oleObject, this);
 #ifdef QWMP_EVR
             IWMPVideoRenderConfig *config = 0;
             if (m_player->QueryInterface(
@@ -114,16 +109,8 @@
 
                 config->Release();
             }
-
-            if (!m_evrVideoOverlay) {
-#else
-            {
 #endif
-                m_oleVideoOverlay = new QWmpVideoOverlay(m_player, m_oleObject, this);
-                m_player->put_uiMode(QAutoBStr(L"none"));
-            }
         }
-
         m_metaData = new QWmpMetaData(m_player, m_events);
         m_playlist = new QWmpPlaylistControl(m_player, m_events);
         m_control = new QWmpPlayerControl(m_player, m_events);
@@ -135,7 +122,6 @@
     delete m_control;
     delete m_metaData;
     delete m_playlist;
-    delete m_videoOutputControl;
     delete m_events;
 
     if (m_oleObject) {
@@ -155,44 +141,79 @@
     Q_ASSERT(m_ref == 1);
 }
 
-QMediaControl *QWmpPlayerService::control(const char *name) const
+QMediaControl *QWmpPlayerService::requestControl(const char *name)
 {
     if (qstrcmp(name, QMediaPlayerControl_iid) == 0) {
         return m_control;
-    } else if (qstrcmp(name, QMetaDataControl_iid) == 0) {
+    } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) {
         return m_metaData;
     } else if (qstrcmp(name, QMediaPlaylistControl_iid) == 0) {
         return m_playlist;
-    } else if (qstrcmp(name, QVideoOutputControl_iid) == 0) {
-        return m_videoOutputControl;
-    } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) {
+    } else if (qstrcmp(name, QVideoWindowControl_iid) == 0
+            && m_embedMode == LocalEmbed
+            && m_player
+            && !m_activeVideoOverlay) {
 #ifdef QWMP_EVR
-        if (m_evrVideoOverlay)
-            return m_evrVideoOverlay;
-#endif
-        return m_oleVideoOverlay;
-    } else {
-        return 0;
-    }
-}
-
-void QWmpPlayerService::videoOutputChanged(QVideoOutputControl::Output output)
-{
-    if (m_oleVideoOverlay) {
-        m_oleVideoOverlay->setEnabled(output == QVideoOutputControl::WindowOutput);
-#ifdef QWMP_EVR
-    } else if (m_evrVideoOverlay) {
         IWMPVideoRenderConfig *config = 0;
         if (m_player->QueryInterface(
                 __uuidof(IWMPVideoRenderConfig), reinterpret_cast<void **>(&config)) == S_OK) {
-            if (output == QVideoOutputControl::WindowOutput)
-                config->put_presenterActivate(static_cast<IMFActivate *>(m_evrVideoOverlay));
-            else
-                config->put_presenterActivate(0);
+            if (HINSTANCE evrHwnd = LoadLibrary(L"evr")) {
+                m_evrVideoOverlay = new QEvrVideoOverlay(evrHwnd);
 
+                if (SUCCEEDED(config->put_presenterActivate(
+                        static_cast<IMFActivate *>(m_evrVideoOverlay)))) {
+                    connect(m_events, SIGNAL(OpenStateChange(long)),
+                            m_evrVideoOverlay, SLOT(openStateChanged(long)));
+                } else {
+                    delete m_evrVideoOverlay;
+
+                    m_evrVideoOverlay = 0;
+                }
+            }
             config->Release();
         }
+
+        if (m_evrVideoOverlay) {
+            m_activeVideoOverlay = m_evrVideoOverlay;
+
+            return m_evrVideoOverlay;
+        } else
 #endif
+        if (SUCCEEDED(m_player->put_uiMode(QAutoBStr(L"none")))) {
+            m_oleVideoOverlay->setEnabled(true);
+
+            m_activeVideoOverlay = m_oleVideoOverlay;
+
+            return m_oleVideoOverlay;
+        }
+    }
+    return 0;
+}
+
+void QWmpPlayerService::releaseControl(QMediaControl *control)
+{
+    if (!control) {
+        qWarning("QMediaService::releaseControl():"
+                " Attempted release of null control");
+#ifdef QWMP_EVR
+    } else if (control == m_evrVideoOverlay) {
+
+        IWMPVideoRenderConfig *config = 0;
+        if (m_player->QueryInterface(
+                __uuidof(IWMPVideoRenderConfig), reinterpret_cast<void **>(&config)) == S_OK) {
+            config->put_presenterActivate(0);
+            config->Release();
+        }
+
+        delete m_evrVideoOverlay;
+
+        m_evrVideoOverlay = 0;
+        m_activeVideoOverlay = 0;
+#endif
+    } else if (control == m_oleVideoOverlay) {
+        m_player->put_uiMode(QAutoBStr(L"invisible"));
+
+        m_activeVideoOverlay = 0;
     }
 }