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 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 *devicelist) +{ + QHash< Solid::AudioInterface::AudioDriver, QMap > 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 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 playbackdevicelist; QList capturedevicelist; void findDevices(); + void renameDevices(QList *devicelist); KSharedConfig::Ptr config;