--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: kde-runtime: With homedirs on NFS, KDE complains about removed sound devices when logging into different hardware
- From: Edgar Fuß <ef@math.uni-bonn.de>
- Date: Thu, 7 Aug 2014 15:49:33 +0200
- Message-id: <20140807134925.GA615@math.uni-bonn.de>
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);
}
--- End Message ---