src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp
changeset 33 3e2da88830cd
parent 18 2f34d5167611
child 37 758a864f9613
--- a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -62,6 +62,8 @@
 
     device = QLatin1String(dev);
     this->mode = mode;
+
+    checkSurround();
 }
 
 QAudioDeviceInfoInternal::~QAudioDeviceInfoInternal()
@@ -389,6 +391,9 @@
     }
     channelz.append(1);
     channelz.append(2);
+    if (surround40) channelz.append(4);
+    if (surround51) channelz.append(6);
+    if (surround71) channelz.append(8);
     sizez.append(8);
     sizez.append(16);
     sizez.append(32);
@@ -483,4 +488,45 @@
     return devices.first();
 }
 
+void QAudioDeviceInfoInternal::checkSurround()
+{
+    QList<QByteArray> devices;
+    surround40 = false;
+    surround51 = false;
+    surround71 = false;
+
+    void **hints, **n;
+    char *name, *descr, *io;
+
+    if(snd_device_name_hint(-1, "pcm", &hints) < 0)
+        return;
+
+    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);
+}
+
 QT_END_NAMESPACE