Package: kde-runtime Version: 4:4.8.4-2 Severity: normal Tags: upstream patch
On a setup with NFS-shared home directories, KDE will complain about allegedly removed sound devices if a user logs into a machine with a different hardware setup. This is due to Phonon remembering the hardware setup in ~/.kde/share/config/phonondevicesrc and not honoring a global /etc/kde4/phonondevicesrc. The attached patch (which we've been using for ages) makes Phonon load a global phonondevicesrc. You can then, on every machine, install a /etc/kde4/phonondevicesrc listing all that machine's devices (and even assign suitable preferences to them) so the user's ~/.kde/share/config/phonondevicesrc remains essentially empty. Then KDE stops notifying about hardware configuration changes because it will only ever use the machine's configuration plus an empty user's one. See, for example, https://bugs.kde.org/show_bug.cgi?id=218533, for an upstream report. -- System Information: Debian Release: 7.6 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.10.42.wap (SMP w/2 CPU cores) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages kde-runtime depends on: ii kde-runtime-data 4:4.8.4-2 ii kdelibs5-plugins 4:4.8.4-4 ii libasound2 1.0.25-4 ii libattica0 0.2.0-1 ii libc6 2.13-38+deb7u3 ii libcanberra0 0.28-6 ii libexiv2-12 0.23-1 ii libgcc1 1:4.7.2-5 ii libjpeg8 8d-1+deb7u1 ii libkcmutils4 4:4.8.4-4 ii libkdeclarative5 4:4.8.4-4 ii libkdecore5 4:4.8.4-4 ii libkdesu5 4:4.8.4-4 ii libkdeui5 4:4.8.4-4 ii libkdewebkit5 4:4.8.4-4 ii libkdnssd4 4:4.8.4-4 ii libkemoticons4 4:4.8.4-4 ii libkfile4 4:4.8.4-4 ii libkhtml5 4:4.8.4-4 ii libkidletime4 4:4.8.4-4 ii libkio5 4:4.8.4-4 ii libkmediaplayer4 4:4.8.4-4 ii libknewstuff3-4 4:4.8.4-4 ii libknotifyconfig4 4:4.8.4-4 ii libkparts4 4:4.8.4-4 ii libkpty4 4:4.8.4-4 ii libnepomuk4 4:4.8.4-4 ii libnepomukquery4a 4:4.8.4-4 ii libntrack-qt4-1 016-1.1 ii libopenexr6 1.6.1-6 ii libphonon4 4:4.6.0.0-3 ii libplasma3 4:4.8.4-4 ii libpulse-mainloop-glib0 2.0-6.1 ii libpulse0 2.0-6.1 ii libqt4-dbus 4:4.8.2+dfsg-11 ii libqt4-declarative 4:4.8.2+dfsg-11 ii libqt4-network 4:4.8.2+dfsg-11 ii libqt4-script 4:4.8.2+dfsg-11 ii libqt4-svg 4:4.8.2+dfsg-11 ii libqt4-xml 4:4.8.2+dfsg-11 ii libqtcore4 4:4.8.2+dfsg-11 ii libqtgui4 4:4.8.2+dfsg-11 ii libqtwebkit4 2.2.1-5 ii libsmbclient 2:3.6.6-6+deb7u4 ii libsolid4 4:4.8.4-4 ii libsoprano4 2.7.6+dfsg.1-2wheezy1 ii libssh-4 0.5.4-1+deb7u1 ii libstdc++6 4.7.2-5 ii libstreamanalyzer0 0.7.7-3 ii libstreams0 0.7.7-3 ii libx11-6 2:1.5.0-1+deb7u1 ii libxcursor1 1:1.1.13-1+deb7u1 ii oxygen-icon-theme 4:4.8.4-1 ii perl 5.14.2-21+deb7u1 ii phonon 4:4.6.0.0-3 ii plasma-scriptengine-javascript 4:4.8.4-2 ii shared-desktop-ontologies 0.10.0-1 Versions of packages kde-runtime recommends: ii virtuoso-minimal 6.1.4+dfsg1-7 Versions of packages kde-runtime suggests: ii djvulibre-bin 3.5.25.3-1 pn finger <none> pn icoutils <none> -- no debconf information
Index: phonon/kded-module/phononserver.h =================================================================== --- phonon/kded-module/phononserver.h (revision 3581) +++ phonon/kded-module/phononserver.h (revision 3603) @@ -63,6 +63,7 @@ void askToRemoveDevices(const QStringList &devList, int type, const QList<int> &indexes); private: + void loadDeviceConfig(const PS::DeviceKey &key, QString &cardName, QString &iconName, int &initialPreference, bool &isAdvanced); void findDevices(); void findVirtualDevices(); void updateDevicesCache(); Index: phonon/kded-module/phononserver.cpp =================================================================== --- phonon/kded-module/phononserver.cpp (revision 3581) +++ phonon/kded-module/phononserver.cpp (revision 3603) @@ -59,7 +59,7 @@ PhononServer::PhononServer(QObject *parent, const QList<QVariant> &) : KDEDModule(parent), - m_config(KSharedConfig::openConfig("phonondevicesrc", KConfig::SimpleConfig)) + m_config(KSharedConfig::openConfig("phonondevicesrc", KConfig::NoGlobals)) { findDevices(); connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString &)), SLOT(deviceAdded(const QString &))); @@ -152,6 +152,18 @@ return d; } +void PhononServer::loadDeviceConfig(const PS::DeviceKey &key, QString &cardName, QString &iconName, int &initialPreference, bool &isAdvanced) +{ + QString groupName = QLatin1String("AudioDevice_") + key.uniqueId; + if (m_config->hasGroup(groupName)) { + const KConfigGroup cGroup(m_config, groupName); + cardName = cGroup.readEntry("cardName", cardName); + iconName = cGroup.readEntry("iconName", iconName); + initialPreference = cGroup.readEntry("initialPreference", initialPreference); + isAdvanced = cGroup.readEntry("isAdvanced", isAdvanced); + } +} + void PhononServer::findVirtualDevices() { #ifdef HAVE_LIBASOUND2 @@ -299,6 +311,7 @@ if (playbackDevice) { const PS::DeviceKey key = { uniqueId + QLatin1String("_playback"), -1, -1 }; + loadDeviceConfig(key, cardName, iconName, initialPreference, isAdvanced); if (playbackDevices.contains(key)) { playbackDevices[key].addAccess(access); } else { @@ -310,6 +323,7 @@ if (captureDevice) { const PS::DeviceKey key = { uniqueId + QLatin1String("_capture"), -1, -1 }; + loadDeviceConfig(key, cardName, iconName, initialPreference, isAdvanced); if (captureDevices.contains(key)) { captureDevices[key].addAccess(access); } else { @@ -529,7 +543,7 @@ const bool needNewCaptureDevice = capture && !audioCaptureDevices.contains(ckey); if (needNewPlaybackDevice || needNewCaptureDevice) { - const QString &icon = hwDevice.icon(); + QString icon = hwDevice.icon(); // Adjust the device preference according to the soudcard type switch (audioIface->soundcardType()) { @@ -551,13 +565,17 @@ } if (needNewPlaybackDevice) { - PS::DeviceInfo dev(PS::DeviceInfo::Audio, audioIface->name(), icon, pkey, initialPreference, isAdvanced); + QString card = audioIface->name(); + loadDeviceConfig(pkey, card, icon, initialPreference, isAdvanced); + PS::DeviceInfo dev(PS::DeviceInfo::Audio, card, icon, pkey, initialPreference, isAdvanced); dev.addAccess(devAccess); audioPlaybackDevices.insert(pkey, dev); } if (needNewCaptureDevice) { - PS::DeviceInfo dev(PS::DeviceInfo::Audio, audioIface->name(), icon, ckey, initialPreference, isAdvanced); + QString card = audioIface->name(); + loadDeviceConfig(ckey, card, icon, initialPreference, isAdvanced); + PS::DeviceInfo dev(PS::DeviceInfo::Audio, card, icon, ckey, initialPreference, isAdvanced); dev.addAccess(devAccess); audioCaptureDevices.insert(ckey, dev); }