[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#757368: kde-runtime: With homedirs on NFS, KDE complains about removed sound devices when logging into different hardware



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);
             }

Reply to: