All pastes #795830 Raw Edit

Something

public text v1 · immutable
#795830 ·published 2007-11-24 14:38 UTC
rendered paste body
Index: libkaudiodevicelist/audiodevice_p.h
===================================================================
--- libkaudiodevicelist/audiodevice_p.h (revision 740936)
+++ libkaudiodevicelist/audiodevice_p.h (working copy)
@@ -65,6 +65,7 @@
             int subdevice;
         } alsaId;
         int index;
+        QString cardId;
         int deviceNumber;
         int initialPreference;
         bool available : 1;
Index: libkaudiodevicelist/audiodeviceenumerator_p.h
===================================================================
--- libkaudiodevicelist/audiodeviceenumerator_p.h       (revision 740936)
+++ libkaudiodevicelist/audiodeviceenumerator_p.h       (working copy)
@@ -40,6 +40,7 @@
         QList<AudioDevice> playbackdevicelist;
         QList<AudioDevice> capturedevicelist;
         void findDevices();
+        void renameDevices(QList<AudioDevice> *devicelist);

         KSharedConfig::Ptr config;

Index: libkaudiodevicelist/audiodevice.cpp
===================================================================
--- libkaudiodevicelist/audiodevice.cpp (revision 740936)
+++ libkaudiodevicelist/audiodevice.cpp (working copy)
@@ -209,6 +209,7 @@
         }
         QString x_phononId = QLatin1String("x-phonon:CARD=") + handles.first().toString(); // the first is either an int (card number) or a QString (card id)
         QString fallbackId = QLatin1String("plughw:CARD=")   + handles.first().toString(); // the first is either an int (card number) or a QString (card id)
+        d->cardId = handles.first().toString();
         if (handles.size() > 1 && handles.at(1).isValid()) {
             d->deviceNumber = handles.at(1).toInt();
             if (d->deviceNumber == 0) {
Index: libkaudiodevicelist/audiodeviceenumerator.cpp
===================================================================
--- libkaudiodevicelist/audiodeviceenumerator.cpp       (revision 740936)
+++ libkaudiodevicelist/audiodeviceenumerator.cpp       (working copy)
@@ -129,6 +129,9 @@
     // ~/.asoundrc and /etc/asound.conf
     findVirtualDevices();

+    renameDevices(&playbackdevicelist);
+    renameDevices(&capturedevicelist);
+
 //X     QFileSystemWatcher *watcher = new QFileSystemWatcher(QCoreApplication::instance());
 //X     watcher->addPath(QDir::homePath() + QLatin1String("/.asoundrc"));
 //X     watcher->addPath(QLatin1String("/etc/asound.conf"));
@@ -264,6 +267,40 @@
 #endif //HAS_LIBASOUND_DEVICE_NAME_HINT / HAVE_LIBASOUND2
 }

+void AudioDeviceEnumeratorPrivate::renameDevices(QList<AudioDevice> *devicelist)
+{
+    // This looks horrible but allows us to quickly find out if AudioDevices
+    // with the same name come from different cards, different devices or both
+    QHash<Solid::AudioInterface::AudioDriver, QHash<QString, QHash<QString, int> > > cardNames;
+    foreach (AudioDevice dev, *devicelist) {
+        cardNames[dev.d->driver][dev.d->cardName][dev.d->cardId]++;
+    }
+
+    // We then go through and rename devices by appending card#:device# as appropriate
+    QList<AudioDevice>::Iterator device;
+    for (device = devicelist->begin(); device != devicelist->end(); ++device) {
+        bool appendCardId = cardNames[device->d->driver][device->d->cardName].count() > 1;
+        bool appendDeviceNumber = false;
+        if (device->d->deviceNumber != -1) {
+            foreach (QString cardId, cardNames[device->d->driver][device->d->cardName].keys()) {
+                if (cardNames[device->d->driver][device->d->cardName][cardId] > 1) {
+                    appendDeviceNumber = true;
+                }
+            }
+        }
+
+        if (appendCardId || appendDeviceNumber) {
+            device->d->cardName += QLatin1String(" ");
+        }
+        if (appendCardId) {
+            device->d->cardName += device->d->cardId;
+        }
+        if (appendDeviceNumber) {
+            device->d->cardName += QLatin1String(":") + QString::number(device->d->deviceNumber);
+        }
+    }
+}
+
 void AudioDeviceEnumeratorPrivate::_k_asoundrcChanged(const QString &file)
 {
     Q_UNUSED(file);