SVN commit 799772 by mkretz: - the output/input infos don't need an order - the order is stored in the sorted indexes variable already - when unplugging a device, don't remove it but only mark it as unavailable - when plugging a device make sure the sorted indexes are not duplicated M +27 -16 devicelisting.cpp M +2 -2 devicelisting.h --- trunk/KDE/kdelibs/phonon/platform_kde/devicelisting.cpp #799771:799772 @@ -22,7 +22,7 @@ #include "../libkaudiodevicelist/audiodeviceenumerator.h" #include "../libkaudiodevicelist/audiodevice.h" -#include +#include #include #include #include @@ -166,7 +166,7 @@ } } else { // remove all OSS devices - QMutableMapIterator > it(m_outputInfos); + QMutableHashIterator > it(m_outputInfos); while (it.hasNext()) { it.next(); if (it.value().value("driver") == QLatin1String("oss")) { @@ -238,36 +238,47 @@ kDebug(600) << dev.cardName(); if (dev.isPlaybackDevice()) { m_outputInfos.insert(-dev.index(), propertiesHashFor(dev)); - m_sortedOutputIndexes.insert(-m_outputInfos[-dev.index()].value("initialPreference").toInt(), -dev.index()); + const int initialPreference = m_outputInfos[-dev.index()].value("initialPreference").toInt(); + if (!m_sortedOutputIndexes.contains(-initialPreference, -dev.index())) { + m_sortedOutputIndexes.insert(-initialPreference, -dev.index()); + } m_signalTimer.start(0, this); } if (dev.isCaptureDevice()) { m_inputInfos.insert(-dev.index(), propertiesHashFor(dev)); - m_sortedInputIndexes.insert(-m_inputInfos[-dev.index()].value("initialPreference").toInt(), -dev.index()); + const int initialPreference = m_inputInfos[-dev.index()].value("initialPreference").toInt(); + if (!m_sortedInputIndexes.contains(-initialPreference, -dev.index())) { + m_sortedInputIndexes.insert(-initialPreference, -dev.index()); + } m_signalTimer.start(0, this); } } +static bool markAsUnavailable(QHash > &infos, int index) +{ + QHash >::iterator it = infos.find(index); + if (it != infos.end()) { + it.value().insert("description", i18n("This device is currently not available " + "(either it is unplugged or the driver is not loaded).")); + it.value().insert("available", false); + it.value().insert("deviceIds", QStringList()); + return true; + } + return false; +} + void DeviceListing::deviceUnplugged(const Phonon::AudioDevice &dev) { kDebug(600) << dev.cardName(); if (dev.isPlaybackDevice()) { - QMap >::iterator it = m_outputInfos.find(-dev.index()); - if (it != m_outputInfos.end()) { - const int initialPreference = it.value().value("initialPreference").toInt(); - m_sortedOutputIndexes.remove(-initialPreference, it.key()); - m_outputInfos.erase(it); + if (markAsUnavailable(m_outputInfos, -dev.index())) { + m_signalTimer.start(0, this); } - m_signalTimer.start(0, this); } if (dev.isCaptureDevice()) { - QMap >::iterator it = m_inputInfos.find(-dev.index()); - if (it != m_inputInfos.end()) { - const int initialPreference = it.value().value("initialPreference").toInt(); - m_sortedInputIndexes.remove(-initialPreference, it.key()); - m_inputInfos.erase(it); + if (markAsUnavailable(m_inputInfos, -dev.index())) { + m_signalTimer.start(0, this); } - m_signalTimer.start(0, this); } } --- trunk/KDE/kdelibs/phonon/platform_kde/devicelisting.h #799771:799772 @@ -64,8 +64,8 @@ void checkAudioInputs(); QMultiMap m_sortedOutputIndexes; QMultiMap m_sortedInputIndexes; - QMap > m_outputInfos; - QMap > m_inputInfos; + QHash > m_outputInfos; + QHash > m_inputInfos; QBasicTimer m_signalTimer; bool m_useOss : 1; };