diff options
| author | 2008-08-29 12:49:05 +0000 | |
|---|---|---|
| committer | 2008-08-29 12:49:05 +0000 | |
| commit | 5c99e57fc7e8f48eaa956c26b93c7167cae09984 (patch) | |
| tree | 1873e6601e0c87e84325f859a0c05ae87d817efc /src/modules/mediaplayer/mp_mprisinterface.cpp | |
| parent | fix logic - return true only if library was loaded (diff) | |
| download | KVIrc-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.cpp | 235 |
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 |
