All pastes #783988 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-11-19 13:49 UTC
rendered paste body
Index: phonon/libkaudiodevicelist/audiodeviceenumerator.cpp
===================================================================
--- phonon/libkaudiodevicelist/audiodeviceenumerator.cpp        (revision 738537)
+++ phonon/libkaudiodevicelist/audiodeviceenumerator.cpp        (working copy)
@@ -129,6 +129,11 @@
     // ~/.asoundrc and /etc/asound.conf
     findVirtualDevices();

+    // now let's ensure that the user-visible names of devices are unique
+    renameDevices(&playbackdevicelist);
+    renameDevices(&capturedevicelist);
+
+    QMap<QString, AudioDevice> devicesByName;
 //X     QFileSystemWatcher *watcher = new QFileSystemWatcher(QCoreApplication::instance());
 //X     watcher->addPath(QDir::homePath() + QLatin1String("/.asoundrc"));
 //X     watcher->addPath(QLatin1String("/etc/asound.conf"));
@@ -261,6 +266,36 @@
 #endif //HAS_LIBASOUND_DEVICE_NAME_HINT / HAVE_LIBASOUND2
 }

+void AudioDeviceEnumeratorPrivate::renameDevices(QList<AudioDevice> *devicelist)
+{
+    QHash< Solid::AudioInterface::AudioDriver, QMap<QString, AudioDevice> > partitioned;
+
+    // The backend takes care of ensuring names are unique when there
+    // is more than one driver for a device, so we only make sure names
+    // are unique per driver here.
+    while (!devicelist->isEmpty()) {
+        AudioDevice dev = devicelist->takeLast();
+        partitioned[dev.d->driver].insertMulti(dev.udi(), dev);
+    }
+
+    foreach (Solid::AudioInterface::AudioDriver driver, partitioned.keys()) {
+        QSet<QString> uniqueNames;
+        // When a UDI is not unique, keys() will return multiple entries for that UDI
+        foreach (QString udi, partitioned[driver].keys()) {
+            AudioDevice dev = partitioned[driver].take(udi);
+            if (uniqueNames.contains(dev.d->cardName)) {
+                int cardNumber = 2;
+                while (uniqueNames.contains(dev.d->cardName + " #" + QString::number(cardNumber))) {
+                    cardNumber++;
+                }
+                dev.d->cardName += " #" + QString::number(cardNumber);
+            }
+            uniqueNames.insert(dev.d->cardName);
+            devicelist->append(dev);
+        }
+    }
+}
+
 void AudioDeviceEnumeratorPrivate::_k_asoundrcChanged(const QString &file)
 {
 #ifdef HAVE_LIBASOUND2
Index: phonon/libkaudiodevicelist/audiodeviceenumerator_p.h
===================================================================
--- phonon/libkaudiodevicelist/audiodeviceenumerator_p.h        (revision 738537)
+++ phonon/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;