qtmobility/src/multimedia/qmediaserviceprovider.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
--- a/qtmobility/src/multimedia/qmediaserviceprovider.cpp	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/src/multimedia/qmediaserviceprovider.cpp	Mon May 03 13:18:40 2010 +0300
@@ -42,11 +42,11 @@
 #include <QtCore/qdebug.h>
 #include <QtCore/qmap.h>
 
-#include <qmediaservice.h>
-#include <qmediaserviceprovider.h>
-#include <qmediaserviceproviderplugin.h>
-#include <qmediapluginloader_p.h>
-#include <qmediaplayer.h>
+#include "qmediaservice.h"
+#include "qmediaserviceprovider.h"
+#include "qmediaserviceproviderplugin.h"
+#include "qmediapluginloader_p.h"
+#include "qmediaplayer.h"
 
 QTM_BEGIN_NAMESPACE
 
@@ -101,6 +101,9 @@
 
     \value RecordingSupport
             The service provides audio or video recording functions.
+
+    \value StreamPlayback
+            The service is capable of playing QIODevice based streams.
 */
 
 /*!
@@ -346,7 +349,7 @@
                             estimate = currentEstimate;
                             plugin = currentPlugin;
 
-                            if (currentEstimate == QtMedia::PreferedService)
+                            if (currentEstimate == QtMedia::PreferredService)
                                 break;
                         }
                     }
@@ -394,14 +397,25 @@
             QMediaServiceSupportedFormatsInterface *iface =
                     qobject_cast<QMediaServiceSupportedFormatsInterface*>(obj);
 
-            //if low latency playback was asked, skip services known
-            //not to provide low latency playback
-            if (flags & QMediaPlayer::LowLatency) {
+
+            if (flags) {
                 QMediaServiceFeaturesInterface *iface =
                         qobject_cast<QMediaServiceFeaturesInterface*>(obj);
 
-                if (iface && !(iface->supportedFeatures(serviceType) & QMediaServiceProviderHint::LowLatencyPlayback))
-                    continue;
+                if (iface) {
+                    QMediaServiceProviderHint::Features features = iface->supportedFeatures(serviceType);
+
+                    //if low latency playback was asked, skip services known
+                    //not to provide low latency playback
+                    if ((flags & QMediaPlayer::LowLatency) &&
+                        !(features & QMediaServiceProviderHint::LowLatencyPlayback))
+                            continue;
+
+                    //the same for QIODevice based streams support
+                    if ((flags & QMediaPlayer::StreamPlayback) &&
+                        !(features & QMediaServiceProviderHint::StreamPlayback))
+                            continue;
+                }
             }
 
             if (iface)
@@ -410,7 +424,7 @@
                 allServicesProvideInterface = false;
         }
 
-        //don't return PreferedService
+        //don't return PreferredService
         supportEstimate = qMin(supportEstimate, QtMedia::ProbablySupported);
 
         //Return NotSupported only if no services are available of serviceType
@@ -431,14 +445,25 @@
             QMediaServiceSupportedFormatsInterface *iface =
                     qobject_cast<QMediaServiceSupportedFormatsInterface*>(obj);
 
-            // If low latency playback was asked for, skip MIME types from services known
-            // not to provide low latency playback
+
             if (flags & QMediaPlayer::LowLatency) {
                 QMediaServiceFeaturesInterface *iface =
                         qobject_cast<QMediaServiceFeaturesInterface*>(obj);
 
-                if (iface && !(iface->supportedFeatures(serviceType) & QMediaServiceProviderHint::LowLatencyPlayback))
-                    continue;
+                if (iface) {
+                    QMediaServiceProviderHint::Features features = iface->supportedFeatures(serviceType);
+
+                    // If low latency playback was asked for, skip MIME types from services known
+                    // not to provide low latency playback
+                    if ((flags & QMediaPlayer::LowLatency) &&
+                        !(features & QMediaServiceProviderHint::LowLatencyPlayback))
+                        continue;
+
+                    //the same for QIODevice based streams support
+                    if ((flags & QMediaPlayer::StreamPlayback) &&
+                        !(features & QMediaServiceProviderHint::StreamPlayback))
+                            continue;
+                }
             }
 
             if (iface) {
@@ -563,12 +588,35 @@
     return QString();
 }
 
+
+#ifdef QT_BUILD_INTERNAL
+
+static QMediaServiceProvider *qt_defaultMediaServiceProvider = 0;
+
+/*!
+    Sets a media service \a provider as the default.
+
+    \internal
+*/
+void QMediaServiceProvider::setDefaultServiceProvider(QMediaServiceProvider *provider)
+{
+    qt_defaultMediaServiceProvider = provider;
+}
+
+#endif
+
 /*!
     Returns a default provider of media services.
 */
 QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider()
 {
+#ifdef QT_BUILD_INTERNAL
+    return qt_defaultMediaServiceProvider != 0
+            ? qt_defaultMediaServiceProvider
+            : static_cast<QMediaServiceProvider *>(pluginProvider());
+#else
     return pluginProvider();
+#endif
 }
 
 /*!