Improve default audio plugin selection.
authorYoann Lopes <yoann.lopes@digia.com>
Tue, 20 May 2014 13:52:54 +0000 (15:52 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 5 Jun 2014 09:42:16 +0000 (11:42 +0200)
When no audio plugin is marked as default, use the first plugin
available.

Change-Id: Ide8db0fe55f43c4881c24505c1e2821b0fc176f6
Reviewed-by: Dyami Caliri <dyami@dragonframe.com>
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
src/multimedia/audio/qaudiodevicefactory.cpp

index a36ab39..50f4a76 100644 (file)
 
 QT_BEGIN_NAMESPACE
 
+static QString defaultKey()
+{
+    return QStringLiteral("default");
+}
+
 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
 Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, audioLoader,
         (QAudioSystemFactoryInterface_iid, QLatin1String("audio"), Qt::CaseInsensitive))
@@ -137,13 +142,18 @@ QList<QAudioDeviceInfo> QAudioDeviceFactory::availableDevices(QAudio::Mode mode)
 QAudioDeviceInfo QAudioDeviceFactory::defaultInputDevice()
 {
 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
-    QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(audioLoader()->instance(QLatin1String("default")));
-
+    QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(audioLoader()->instance(defaultKey()));
     if (plugin) {
         QList<QByteArray> list = plugin->availableDevices(QAudio::AudioInput);
         if (list.size() > 0)
-            return QAudioDeviceInfo(QLatin1String("default"), list.at(0), QAudio::AudioInput);
+            return QAudioDeviceInfo(defaultKey(), list.at(0), QAudio::AudioInput);
     }
+
+    // if no plugin is marked as default or if the default plugin doesn't have any input device,
+    // return the first input available from other plugins.
+    QList<QAudioDeviceInfo> inputDevices = availableDevices(QAudio::AudioInput);
+    if (!inputDevices.isEmpty())
+        return inputDevices.first();
 #endif
 
     return QAudioDeviceInfo();
@@ -152,13 +162,18 @@ QAudioDeviceInfo QAudioDeviceFactory::defaultInputDevice()
 QAudioDeviceInfo QAudioDeviceFactory::defaultOutputDevice()
 {
 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
-    QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(audioLoader()->instance(QLatin1String("default")));
-
+    QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(audioLoader()->instance(defaultKey()));
     if (plugin) {
         QList<QByteArray> list = plugin->availableDevices(QAudio::AudioOutput);
         if (list.size() > 0)
-            return QAudioDeviceInfo(QLatin1String("default"), list.at(0), QAudio::AudioOutput);
+            return QAudioDeviceInfo(defaultKey(), list.at(0), QAudio::AudioOutput);
     }
+
+    // if no plugin is marked as default or if the default plugin doesn't have any output device,
+    // return the first output available from other plugins.
+    QList<QAudioDeviceInfo> outputDevices = availableDevices(QAudio::AudioOutput);
+    if (!outputDevices.isEmpty())
+        return outputDevices.first();
 #endif
 
     return QAudioDeviceInfo();