aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/mediaplayer/mp_mprisinterface.cpp
diff options
context:
space:
mode:
authorGravatar Tomasz Moń2008-08-29 12:49:05 +0000
committerGravatar Tomasz Moń2008-08-29 12:49:05 +0000
commit5c99e57fc7e8f48eaa956c26b93c7167cae09984 (patch)
tree1873e6601e0c87e84325f859a0c05ae87d817efc /src/modules/mediaplayer/mp_mprisinterface.cpp
parentfix logic - return true only if library was loaded (diff)
downloadKVIrc-5c99e57fc7e8f48eaa956c26b93c7167cae09984.tar.gz
KVIrc-5c99e57fc7e8f48eaa956c26b93c7167cae09984.tar.bz2
KVIrc-5c99e57fc7e8f48eaa956c26b93c7167cae09984.zip
KviMPRISInterface is ough to be reference implementation, any player-specific misbehaviours should be handled in derived classes
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@2347 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules/mediaplayer/mp_mprisinterface.cpp')
-rw-r--r--src/modules/mediaplayer/mp_mprisinterface.cpp235
1 files changed, 144 insertions, 91 deletions
diff --git a/src/modules/mediaplayer/mp_mprisinterface.cpp b/src/modules/mediaplayer/mp_mprisinterface.cpp
index 8bd4a6bbc..48707bd57 100644
--- a/src/modules/mediaplayer/mp_mprisinterface.cpp
+++ b/src/modules/mediaplayer/mp_mprisinterface.cpp
@@ -26,28 +26,6 @@
#if (!defined(COMPILE_ON_WINDOWS) && !defined(COMPILE_ON_MAC) && !defined(COMPILE_ON_MINGW))
#include "kvi_locale.h"
-MP_IMPLEMENT_DESCRIPTOR(
- KviAudaciousInterface,
- "audacious",
- __tr2qs_ctx(
- "An interface to the popular audacious media player.\n" \
- "Download it from http://audacious-media-player.org\n"
- ,
- "mediaplayer"
- )
-)
-
-MP_IMPLEMENT_DESCRIPTOR(
- KviBmpxInterface,
- "bmpx",
- __tr2qs_ctx(
- "An interface to BMPx.\n" \
- "Download it from http://bmpx.backtrace.info\n"
- ,
- "mediaplayer"
- )
-)
-
KviMPRISInterface::KviMPRISInterface()
: KviMediaPlayerInterface()
{
@@ -57,18 +35,6 @@ KviMPRISInterface::~KviMPRISInterface()
{
}
-KviAudaciousInterface::KviAudaciousInterface()
-: KviMPRISInterface()
-{
- m_szServiceName = "org.mpris.audacious";
-}
-
-KviBmpxInterface::KviBmpxInterface()
-: KviMPRISInterface()
-{
- m_szServiceName = "org.mpris.bmp";
-}
-
int KviMPRISInterface::detect(bool bStart)
{
QDBusReply<QStringList> reply = QDBusConnection::sessionBus().interface()->registeredServiceNames();
@@ -82,8 +48,8 @@ int KviMPRISInterface::detect(bool bStart)
return 1; /* dbus works, player may be closed */
}
-#define MPRIS_SIMPLE_CALL(__action) \
- QDBusInterface dbus_iface(m_szServiceName, "/Player", \
+#define MPRIS_SIMPLE_CALL(__path, __action) \
+ QDBusInterface dbus_iface(m_szServiceName, __path, \
"org.freedesktop.MediaPlayer", QDBusConnection::sessionBus()); \
QDBusMessage reply = dbus_iface.call(QDBus::Block, __action); \
if (reply.type() == QDBusMessage::ErrorMessage) { \
@@ -95,32 +61,32 @@ int KviMPRISInterface::detect(bool bStart)
bool KviMPRISInterface::prev()
{
- MPRIS_SIMPLE_CALL("Prev")
+ MPRIS_SIMPLE_CALL("/Player", "Prev")
}
bool KviMPRISInterface::next()
{
- MPRIS_SIMPLE_CALL("Next")
+ MPRIS_SIMPLE_CALL("/Player", "Next")
}
bool KviMPRISInterface::play()
{
- MPRIS_SIMPLE_CALL("Play")
+ MPRIS_SIMPLE_CALL("/Player", "Play")
}
bool KviMPRISInterface::stop()
{
- MPRIS_SIMPLE_CALL("Stop")
+ MPRIS_SIMPLE_CALL("/Player", "Stop")
}
bool KviMPRISInterface::pause()
{
- MPRIS_SIMPLE_CALL("Pause")
+ MPRIS_SIMPLE_CALL("/Player", "Pause")
}
-bool KviAudaciousInterface::quit()
+bool KviMPRISInterface::quit()
{
- MPRIS_SIMPLE_CALL("Quit")
+ MPRIS_SIMPLE_CALL("/", "Quit")
}
#define MPRIS_CALL_METHOD(__method, __return_if_fail) \
@@ -142,11 +108,10 @@ bool KviAudaciousInterface::quit()
QVariant v = qdbus_cast<QVariantMap>(arg); \
if (v.userType() == QVariant::Map) { \
const QVariantMap map = v.toMap(); \
- QVariantMap::ConstIterator it = map.constBegin(); \
- for ( ; it != map.constEnd(); ++it) { \
- if (it.key() == __field) \
- return it.value().toString(); \
- } \
+ QVariantMap::ConstIterator it = map.find(__field); \
+ if (it != map.end() && it.key() == __field) { \
+ return it.value().toString(); \
+ } \
} \
} \
return "";
@@ -199,54 +164,61 @@ QString KviMPRISInterface::mrl()
QVariant v = qdbus_cast<QVariantMap>(arg);
if (v.userType() == QVariant::Map) {
const QVariantMap map = v.toMap();
- QVariantMap::ConstIterator it = map.constBegin();
- for ( ; it != map.constEnd(); ++it) {
- if (it.key() == "URI")
- return it.value().toString();
+ QVariantMap::ConstIterator it = map.find("location");
+ if (it != map.end() && it.key() == "location") {
+ return it.value().toString();
}
}
}
return "";
}
-bool KviAudaciousInterface::setVol(kvs_int_t &iVol)
+QString KviMPRISInterface::title()
{
- MPRIS_CALL_METHOD_WITH_ARG("VolumeSet", QVariant((int)(100*iVol/255)), false);
- return true;
+ MPRIS_GET_METADATA_FIELD("title")
}
-int KviAudaciousInterface::getVol()
+QString KviMPRISInterface::artist()
{
- MPRIS_CALL_METHOD("VolumeGet", -1)
+ MPRIS_GET_METADATA_FIELD("artist")
+}
- int iVol = reply.arguments().first().toInt();
- return iVol * 255 /100;
+QString KviMPRISInterface::genre()
+{
+ MPRIS_GET_METADATA_FIELD("genre")
}
-KviMediaPlayerInterface::PlayerStatus KviAudaciousInterface::status()
+QString KviMPRISInterface::comment()
{
- QDBusInterface dbus_iface(m_szServiceName, "/Player",
- "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus());
- if (!dbus_iface.isValid())
- return KviMediaPlayerInterface::Unknown;
+ MPRIS_GET_METADATA_FIELD("comment")
+}
- QDBusMessage reply = dbus_iface.call(QDBus::Block, "GetStatus");
+QString KviMPRISInterface::album()
+{
+ MPRIS_GET_METADATA_FIELD("album")
+}
- switch (reply.arguments().first().toInt()) {
- case 0: return KviMediaPlayerInterface::Playing;
- case 1: return KviMediaPlayerInterface::Paused;
- case 2: return KviMediaPlayerInterface::Stopped;
- default: return KviMediaPlayerInterface::Unknown;
- }
+bool KviMPRISInterface::setVol(kvs_int_t &iVol)
+{
+ MPRIS_CALL_METHOD_WITH_ARG("VolumeSet", QVariant((int)(100*iVol/255)), false);
+ return true;
+}
+
+int KviMPRISInterface::getVol()
+{
+ MPRIS_CALL_METHOD("VolumeGet", -1)
+
+ int iVol = reply.arguments().first().toInt();
+ return iVol * 255 /100;
}
-int KviAudaciousInterface::position()
+int KviMPRISInterface::position()
{
MPRIS_CALL_METHOD("PositionGet", -1)
return reply.arguments().first().toInt();
}
-int KviAudaciousInterface::length()
+int KviMPRISInterface::length()
{
MPRIS_CALL_METHOD("GetMetadata", -1)
@@ -257,7 +229,7 @@ int KviAudaciousInterface::length()
const QVariantMap map = v.toMap();
QVariantMap::ConstIterator it = map.constBegin();
for ( ; it != map.constEnd(); ++it) {
- if (it.key() == "length")
+ if (it.key() == "time")
return it.value().toInt();
}
}
@@ -265,44 +237,101 @@ int KviAudaciousInterface::length()
return -1;
}
-bool KviAudaciousInterface::jumpTo(int &iPos)
+bool KviMPRISInterface::jumpTo(int &iPos)
{
MPRIS_CALL_METHOD_WITH_ARG("PositionSet", QVariant(iPos), false)
return true;
}
-QString KviAudaciousInterface::title()
+/* audacious interface */
+MP_IMPLEMENT_DESCRIPTOR(
+ KviAudaciousInterface,
+ "audacious",
+ __tr2qs_ctx(
+ "An interface to the popular audacious media player.\n" \
+ "Download it from http://audacious-media-player.org\n"
+ ,
+ "mediaplayer"
+ )
+)
+
+KviAudaciousInterface::KviAudaciousInterface()
+: KviMPRISInterface()
{
- MPRIS_GET_METADATA_FIELD("title")
+ m_szServiceName = "org.mpris.audacious";
}
-QString KviAudaciousInterface::artist()
+int KviAudaciousInterface::getPlayListPos()
{
- MPRIS_GET_METADATA_FIELD("artist")
+ QDBusInterface dbus_iface("org.mpris.audacious", "/org/atheme/audacious",
+ "org.atheme.audacious", QDBusConnection::sessionBus());
+ QDBusReply<uint> pos = dbus_iface.call(QDBus::Block, "Position");
+ return pos;
}
-QString KviAudaciousInterface::genre()
+
+bool KviAudaciousInterface::quit()
{
- MPRIS_GET_METADATA_FIELD("genre")
+ MPRIS_SIMPLE_CALL("/Player", "Quit")
}
-QString KviAudaciousInterface::comment()
+QString KviAudaciousInterface::mrl()
{
- MPRIS_GET_METADATA_FIELD("comment")
+ MPRIS_CALL_METHOD("GetMetadata", "")
+
+ foreach (QVariant v, reply.arguments()) {
+ QDBusArgument arg = qvariant_cast<QDBusArgument>(v);
+ QVariant v = qdbus_cast<QVariantMap>(arg);
+ if (v.userType() == QVariant::Map) {
+ const QVariantMap map = v.toMap();
+ QVariantMap::ConstIterator it = map.find("location");
+ if (it != map.end() && it.key() == "location") {
+ return it.value().toString();
+ }
+ /* Some audacious versions send URI instead of location */
+ it = map.find("URI");
+ if (it != map.end() && it.key() == "URI") {
+ return it.value().toString();
+ }
+ }
+ }
+ return "";
}
-QString KviAudaciousInterface::album()
+KviMediaPlayerInterface::PlayerStatus KviAudaciousInterface::status()
{
- MPRIS_GET_METADATA_FIELD("album")
+ QDBusInterface dbus_iface(m_szServiceName, "/Player",
+ "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus());
+ if (!dbus_iface.isValid())
+ return KviMediaPlayerInterface::Unknown;
+
+ QDBusMessage reply = dbus_iface.call(QDBus::Block, "GetStatus");
+
+ switch (reply.arguments().first().toInt()) {
+ case 0: return KviMediaPlayerInterface::Playing;
+ case 1: return KviMediaPlayerInterface::Paused;
+ case 2: return KviMediaPlayerInterface::Stopped;
+ default: return KviMediaPlayerInterface::Unknown;
+ }
}
-/* audacious specific interface */
-int KviAudaciousInterface::getPlayListPos()
+int KviAudaciousInterface::length()
{
- QDBusInterface dbus_iface("org.mpris.audacious", "/org/atheme/audacious",
- "org.atheme.audacious", QDBusConnection::sessionBus());
- QDBusReply<uint> pos = dbus_iface.call(QDBus::Block, "Position");
- return pos;
+ MPRIS_CALL_METHOD("GetMetadata", -1)
+
+ foreach (QVariant v, reply.arguments()) {
+ QDBusArgument arg = qvariant_cast<QDBusArgument>(v);
+ QVariant v = qdbus_cast<QVariantMap>(arg);
+ if (v.userType() == QVariant::Map) {
+ const QVariantMap map = v.toMap();
+ QVariantMap::ConstIterator it = map.constBegin();
+ for ( ; it != map.constEnd(); ++it) {
+ if (it.key() == "length")
+ return it.value().toInt();
+ }
+ }
+ }
+ return -1;
}
#define AUDACIOUS_GET_TUPLE_FIELD(__field) \
@@ -325,4 +354,28 @@ QString KviAudaciousInterface::mediaType()
AUDACIOUS_GET_TUPLE_FIELD("codec")
}
+/* BMPx interface */
+MP_IMPLEMENT_DESCRIPTOR(
+ KviBmpxInterface,
+ "bmpx",
+ __tr2qs_ctx(
+ "An interface to BMPx.\n" \
+ "Download it from http://bmpx.backtrace.info\n"
+ ,
+ "mediaplayer"
+ )
+)
+
+KviBmpxInterface::KviBmpxInterface()
+: KviMPRISInterface()
+{
+ m_szServiceName = "org.mpris.bmp";
+}
+
+/* BMPx doesn't provide GetStatus method, always assume Playing status */
+KviMediaPlayerInterface::PlayerStatus KviBmpxInterface::status()
+{
+ return KviMediaPlayerInterface::Playing;
+}
+
#endif //!COMPILE_ON_WINDOWS