src/3rdparty/phonon/gstreamer/mediaobject.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
--- a/src/3rdparty/phonon/gstreamer/mediaobject.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/3rdparty/phonon/gstreamer/mediaobject.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -87,7 +87,7 @@
     m_name = "MediaObject" + QString::number(count++);
 
     if (!m_backend->isValid()) {
-        setError(tr("Cannot start playback. \n\nCheck your Gstreamer installation and make sure you "
+        setError(tr("Cannot start playback. \n\nCheck your GStreamer installation and make sure you "
                     "\nhave libgstreamer-plugins-base installed."), Phonon::FatalError);
     } else {
         m_root = this;
@@ -95,8 +95,8 @@
         m_backend->addBusWatcher(this);
         connect(m_tickTimer, SIGNAL(timeout()), SLOT(emitTick()));
     }
-    connect(this, SIGNAL(stateChanged(Phonon::State, Phonon::State)), 
-            this, SLOT(notifyStateChange(Phonon::State, Phonon::State)));
+    connect(this, SIGNAL(stateChanged(Phonon::State,Phonon::State)), 
+            this, SLOT(notifyStateChange(Phonon::State,Phonon::State)));
 
 }
 
@@ -226,6 +226,7 @@
     QString value = "unknown codec";
 
     // These functions require GStreamer > 0.10.12
+#ifndef QT_NO_LIBRARY
     static Ptr_gst_pb_utils_init p_gst_pb_utils_init = 0;
     static Ptr_gst_pb_utils_get_codec_description p_gst_pb_utils_get_codec_description = 0;
     if (!p_gst_pb_utils_init) {
@@ -239,10 +240,13 @@
         codecName = p_gst_pb_utils_get_codec_description (caps);
         value = QString::fromUtf8(codecName);
         g_free (codecName);
-    } else {
+    } else
+#endif //QT_NO_LIBRARY
+    {
         // For GStreamer versions < 0.10.12
         GstStructure *str = gst_caps_get_structure (caps, 0);
         value = QString::fromUtf8(gst_structure_get_name (str));
+
     }
     media->addMissingCodecName(value);
 }
@@ -340,7 +344,7 @@
     Q_UNUSED(decodebin);
     GstPad *decodepad = static_cast<GstPad*>(data);
     gst_pad_link (pad, decodepad);
-    gst_object_unref (decodepad);
+    //gst_object_unref (decodepad);
 }
 
 /**
@@ -370,9 +374,21 @@
         return false;
 
     // Set the device for MediaSource::Disc
-    QByteArray mediaDevice = QFile::encodeName(m_source.deviceName());
-    if (!mediaDevice.isEmpty())
-        g_object_set (m_datasource, "device", mediaDevice.constData(), (const char*)NULL);
+    if (m_source.type() == MediaSource::Disc) {
+
+        if (g_object_class_find_property (G_OBJECT_GET_CLASS (m_datasource), "device")) {
+            QByteArray mediaDevice = QFile::encodeName(m_source.deviceName());
+            if (!mediaDevice.isEmpty())
+                g_object_set (G_OBJECT (m_datasource), "device", mediaDevice.constData(), (const char*)NULL);
+        }
+
+        // Also Set optical disc speed to 2X for Audio CD
+        if (m_source.discType() == Phonon::Cd
+            && (g_object_class_find_property (G_OBJECT_GET_CLASS (m_datasource), "read-speed"))) {
+            g_object_set (G_OBJECT (m_datasource), "read-speed", 2, (const char*)NULL);
+            m_backend->logMessage(QString("new device speed : 2X"), Backend::Info, this);
+        }
+    }
 
     // Link data source into pipeline
     gst_bin_add(GST_BIN(m_pipeline), m_datasource);
@@ -392,6 +408,7 @@
  */
 bool MediaObject::createPipefromStream(const MediaSource &source)
 {
+#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
     // Remove any existing data source
     if (m_datasource) {
         gst_bin_remove(GST_BIN(m_pipeline), m_datasource);
@@ -413,6 +430,10 @@
         return false;
     }
     return true;
+#else //QT_NO_PHONON_ABSTRACTMEDIASTREAM
+    Q_UNUSED(source);
+    return false;
+#endif
 }
 
 void MediaObject::createPipeline()
@@ -907,23 +928,27 @@
             setError(tr("Could not open media source."));
         break;
 
-    case MediaSource::Disc: // CD tracks can be specified by setting the url in the following way uri=cdda:4
+    case MediaSource::Disc:
         {
-            QUrl url;
+            QString mediaUrl;
             switch (source.discType()) {
-                case Phonon::Cd:
-                    url = QUrl(QLatin1String("cdda://"));
-                    break;
-                case Phonon::Dvd:
-                    url = QUrl(QLatin1String("dvd://"));
-                    break;
-                case Phonon::Vcd:
-                    url = QUrl(QLatin1String("vcd://"));
-                    break;
-                default:
-                    break;
+            case Phonon::NoDisc:
+                qWarning() << "I should never get to see a MediaSource that is a disc but doesn't specify which one";
+                return;
+            case Phonon::Cd:  // CD tracks can be specified by setting the url in the following way uri=cdda:4
+                mediaUrl = QLatin1String("cdda://");
+                break;
+            case Phonon::Dvd:
+                mediaUrl = QLatin1String("dvd://");
+                break;
+            case Phonon::Vcd:
+                mediaUrl = QLatin1String("vcd://");
+                break;
+            default:
+                qWarning() <<  "media " << source.discType() << " not implemented";
+                return;
             }
-            if (!url.isEmpty() && createPipefromURL(url))
+            if (!mediaUrl.isEmpty() && createPipefromURL(QUrl(mediaUrl)))
                 m_loading = true;
             else
                 setError(tr("Could not open media source."));