From d962e54294f2b9e952cd013ba5fb12764d0ac0dc Mon Sep 17 00:00:00 2001
From: Christian Esken <esken@kde.org>
Date: Mon, 4 Feb 2013 23:20:57 +0100
Subject: [PATCH 1/8] MPRIS2 backend now does a asynchonous DBUS instrospection
CCBUGS: 311189
---
backends/mixer_mpris2.cpp | 51 +++++++++++++++++++++++++++++++----------------
1 file changed, 34 insertions(+), 17 deletions(-)
diff --git a/backends/mixer_mpris2.cpp b/backends/mixer_mpris2.cpp
index 9b2adca..88e0a86 100644
--- a/backends/mixer_mpris2.cpp
+++ b/backends/mixer_mpris2.cpp
@@ -27,6 +27,7 @@
#include <QStringList>
#include <QDBusReply>
#include <QString>
+#include <qvariant.h>
#include <KLocale>
@@ -241,18 +242,34 @@ int Mixer_MPRIS2::addAllRunningPlayersAndInitHotplug()
* There is no simple solution (reversing could have the problem of not-adding), so we live for now with it.
*/
- QDBusReply<QStringList> repl = dbusConn.interface()->registeredServiceNames();
+ /*
+ * Bug 311189: Introspecting via "dbusConn.interface()->registeredServiceNames()" does not work too well in
+ * specific scenarios. Thus I now do a hand crafted 3-line asynchronous version of registeredServiceNames().
+ */
+ QDBusInterface dbusIfc("org.freedesktop.DBus", "/org/freedesktop/DBus",
+ "org.freedesktop.DBus", dbusConn);
+ QDBusPendingReply<QStringList> repl = dbusIfc.asyncCall("ListNames");
+ repl.waitForFinished();
+
if ( repl.isValid() )
{
+ qDebug() << "Attaching Media Players";
QStringList result = repl.value();
QString s;
foreach ( s , result )
{
if ( s.startsWith("org.mpris.MediaPlayer2") )
+ {
addMprisControl(dbusConn, s);
+ kDebug() << "Attached " << s;
+ }
}
}
+ else
+ {
+ kError() << "Invalid reply while listing Media Players" << repl.error();
+ }
return 0;
@@ -275,19 +292,19 @@ void Mixer_MPRIS2::addMprisControl(QDBusConnection& conn, QString busDestination
int lastDot = busDestination.lastIndexOf('.');
QString id = ( lastDot == -1 ) ? busDestination : busDestination.mid(lastDot+1);
kDebug(67100) << "Get control of " << busDestination << "id=" << id;
- if (id.startsWith("clementine"))
- {
- // Bug 311189: Clementine hangs
- QString text;
- text =
- i18n(
- "Media player '%1' is not compatible with KMix. Integration skipped.",
- id);
- // We cannot do GUI stuff in the backend, so lets only log it for now
-// KMixToolBox::notification("Unsupported Media Player", text);
- kWarning() << text;
- return;
- }
+// if (id.startsWith("clementine"))
+// {
+// // Bug 311189: Clementine hangs
+// QString text;
+// text =
+// i18n(
+// "Media player '%1' is not compatible with KMix. Integration skipped.",
+// id);
+// // We cannot do GUI stuff in the backend, so lets only log it for now
+//// KMixToolBox::notification("Unsupported Media Player", text);
+// kWarning() << text;
+// return;
+// }
QDBusInterface *qdbiProps = new QDBusInterface(QString(busDestination), QString("/org/mpris/MediaPlayer2"), "org.freedesktop.DBus.Properties", conn, this);
@@ -302,8 +319,8 @@ void Mixer_MPRIS2::addMprisControl(QDBusConnection& conn, QString busDestination
QString readableName = id;
- if (id != "clementine")
- {
+// if (id != "clementine")
+// {
QList<QVariant> arg;
arg.append(QString("org.mpris.MediaPlayer2"));
arg.append(QString("Identity"));
@@ -328,7 +345,7 @@ void Mixer_MPRIS2::addMprisControl(QDBusConnection& conn, QString busDestination
{
qWarning() << "Error (" << msg.type() << "): " << msg.errorName() << " " << msg.errorMessage();
}
- }
+// }
// TODO This hardcoded application list is a quick hack. It should be generalized.
MixDevice::ChannelType ct = MixDevice::APPLICATION_STREAM;
--
1.8.1.4