Revert "Alsa: fix crash when detecting devices."
authorYoann Lopes <yoann.lopes@theqtcompany.com>
Wed, 11 Mar 2015 13:32:17 +0000 (14:32 +0100)
committerYoann Lopes <yoann.lopes@theqtcompany.com>
Wed, 11 Mar 2015 14:17:14 +0000 (14:17 +0000)
This reverts commit 0ab81ef59f35d103ec8174834c4fc2a4dcced453.
The workaround causes software devices not to appear in the list
of available devices. Besides, since the crash is caused by a bug
in older versions of Alsa, the workaround was probably a bad idea
in the first place. People should update Alsa instead.

Task-number: QTBUG-42326
Change-Id: I37923a87180d1c5abc18d52d84f633e14ba46860
Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
src/gsttools/qgstreameraudioinputselector.cpp
src/plugins/alsa/qalsaaudiodeviceinfo.cpp

index 31634f0..a0ced33 100644 (file)
@@ -111,36 +111,33 @@ void QGstreamerAudioInputSelector::updateAlsaDevices()
 {
 #ifdef HAVE_ALSA
     void **hints, **n;
-    int card = -1;
-
-    while (snd_card_next(&card) == 0 && card >= 0) {
-        if (snd_device_name_hint(card, "pcm", &hints) < 0)
-            continue;
-
-        n = hints;
-        while (*n != NULL) {
-            char *name = snd_device_name_get_hint(*n, "NAME");
-            char *descr = snd_device_name_get_hint(*n, "DESC");
-            char *io = snd_device_name_get_hint(*n, "IOID");
-
-            if ((name != NULL) && (descr != NULL)) {
-                if ( io == NULL || qstrcmp(io,"Input") == 0 ) {
-                    m_names.append(QLatin1String("alsa:")+QString::fromUtf8(name));
-                    m_descriptions.append(QString::fromUtf8(descr));
-                }
-            }
+    if (snd_device_name_hint(-1, "pcm", &hints) < 0) {
+        qWarning()<<"no alsa devices available";
+        return;
+    }
+    n = hints;
 
-            if (name != NULL)
-                free(name);
-            if (descr != NULL)
-                free(descr);
-            if (io != NULL)
-                free(io);
-            ++n;
+    while (*n != NULL) {
+        char *name = snd_device_name_get_hint(*n, "NAME");
+        char *descr = snd_device_name_get_hint(*n, "DESC");
+        char *io = snd_device_name_get_hint(*n, "IOID");
+
+        if ((name != NULL) && (descr != NULL)) {
+            if ( io == NULL || qstrcmp(io,"Input") == 0 ) {
+                m_names.append(QLatin1String("alsa:")+QString::fromUtf8(name));
+                m_descriptions.append(QString::fromUtf8(descr));
+            }
         }
 
-        snd_device_name_free_hint(hints);
+        if (name != NULL)
+            free(name);
+        if (descr != NULL)
+            free(descr);
+        if (io != NULL)
+            free(io);
+        n++;
     }
+    snd_device_name_free_hint(hints);
 #endif
 }
 
index 349999c..ce7fb70 100644 (file)
@@ -337,9 +337,14 @@ QList<QByteArray> QAlsaAudioDeviceInfo::availableDevices(QAudio::Mode mode)
 
 #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
     // Create a list of all current audio devices that support mode
-    void **hints;
+    void **hints, **n;
     char *name, *descr, *io;
-    int card = -1;
+
+    if(snd_device_name_hint(-1, "pcm", &hints) < 0) {
+        qWarning() << "no alsa devices available";
+        return devices;
+    }
+    n = hints;
 
     if(mode == QAudio::AudioInput) {
         filter = "Input";
@@ -347,35 +352,28 @@ QList<QByteArray> QAlsaAudioDeviceInfo::availableDevices(QAudio::Mode mode)
         filter = "Output";
     }
 
-    while (snd_card_next(&card) == 0 && card >= 0) {
-        if (snd_device_name_hint(card, "pcm", &hints) < 0)
-            continue;
-
-        void **n = hints;
-        while (*n != NULL) {
-            name = snd_device_name_get_hint(*n, "NAME");
-            if (name != 0 && qstrcmp(name, "null") != 0) {
-                descr = snd_device_name_get_hint(*n, "DESC");
-                io = snd_device_name_get_hint(*n, "IOID");
-
-                if ((descr != NULL) && ((io == NULL) || (io == filter))) {
-                    QString deviceName = QLatin1String(name);
-                    QString deviceDescription = QLatin1String(descr);
-                    if (deviceDescription.contains(QLatin1String("Default Audio Device")))
-                        devices.prepend(deviceName.toLocal8Bit().constData());
-                    else
-                        devices.append(deviceName.toLocal8Bit().constData());
-                }
-
-                free(descr);
-                free(io);
+    while (*n != NULL) {
+        name = snd_device_name_get_hint(*n, "NAME");
+        if (name != 0 && qstrcmp(name, "null") != 0) {
+            descr = snd_device_name_get_hint(*n, "DESC");
+            io = snd_device_name_get_hint(*n, "IOID");
+
+            if ((descr != NULL) && ((io == NULL) || (io == filter))) {
+                QString deviceName = QLatin1String(name);
+                QString deviceDescription = QLatin1String(descr);
+                if (deviceDescription.contains(QLatin1String("Default Audio Device")))
+                    devices.prepend(deviceName.toLocal8Bit().constData());
+                else
+                    devices.append(deviceName.toLocal8Bit().constData());
             }
-            free(name);
-            ++n;
-        }
 
-        snd_device_name_free_hint(hints);
+            free(descr);
+            free(io);
+        }
+        free(name);
+        ++n;
     }
+    snd_device_name_free_hint(hints);
 #else
     int idx = 0;
     char* name;
@@ -416,41 +414,38 @@ void QAlsaAudioDeviceInfo::checkSurround()
     surround51 = false;
     surround71 = false;
 
-    void **hints;
+    void **hints, **n;
     char *name, *descr, *io;
-    int card = -1;
 
-    while (snd_card_next(&card) == 0 && card >= 0) {
-        if (snd_device_name_hint(card, "pcm", &hints) < 0)
-            continue;
+    if(snd_device_name_hint(-1, "pcm", &hints) < 0)
+        return;
 
-        void **n = hints;
-        while (*n != NULL) {
-            name = snd_device_name_get_hint(*n, "NAME");
-            descr = snd_device_name_get_hint(*n, "DESC");
-            io = snd_device_name_get_hint(*n, "IOID");
-            if((name != NULL) && (descr != NULL)) {
-                QString deviceName = QLatin1String(name);
-                if (mode == QAudio::AudioOutput) {
-                    if(deviceName.contains(QLatin1String("surround40")))
-                        surround40 = true;
-                    if(deviceName.contains(QLatin1String("surround51")))
-                        surround51 = true;
-                    if(deviceName.contains(QLatin1String("surround71")))
-                        surround71 = true;
-                }
+    n = hints;
+
+    while (*n != NULL) {
+        name = snd_device_name_get_hint(*n, "NAME");
+        descr = snd_device_name_get_hint(*n, "DESC");
+        io = snd_device_name_get_hint(*n, "IOID");
+        if((name != NULL) && (descr != NULL)) {
+            QString deviceName = QLatin1String(name);
+            if (mode == QAudio::AudioOutput) {
+                if(deviceName.contains(QLatin1String("surround40")))
+                    surround40 = true;
+                if(deviceName.contains(QLatin1String("surround51")))
+                    surround51 = true;
+                if(deviceName.contains(QLatin1String("surround71")))
+                    surround71 = true;
             }
-            if(name != NULL)
-                free(name);
-            if(descr != NULL)
-                free(descr);
-            if(io != NULL)
-                free(io);
-            ++n;
         }
-
-        snd_device_name_free_hint(hints);
+        if(name != NULL)
+            free(name);
+        if(descr != NULL)
+            free(descr);
+        if(io != NULL)
+            free(io);
+        ++n;
     }
+    snd_device_name_free_hint(hints);
 }
 
 QT_END_NAMESPACE