rendered paste bodyIndex: 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;