From 0d941f8a1fafca7f0af84b03efef4d55e26f66fd Mon Sep 17 00:00:00 2001 From: Tomasz Moń Date: Fri, 2 May 2008 15:36:12 +0000 Subject: initial work on MPRIS mediaplayer base class git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@1652 17fca916-40b9-46aa-a4ea-0a15b648b75c --- src/modules/mediaplayer/libkvimediaplayer.cpp | 1 + src/modules/mediaplayer/mp_audaciousinterface.cpp | 140 ++++++++++++---------- src/modules/mediaplayer/mp_audaciousinterface.h | 23 +++- 3 files changed, 98 insertions(+), 66 deletions(-) (limited to 'src/modules') diff --git a/src/modules/mediaplayer/libkvimediaplayer.cpp b/src/modules/mediaplayer/libkvimediaplayer.cpp index b05919974..80980f3a8 100644 --- a/src/modules/mediaplayer/libkvimediaplayer.cpp +++ b/src/modules/mediaplayer/libkvimediaplayer.cpp @@ -1610,6 +1610,7 @@ static bool mediaplayer_module_init( KviModule * m ) g_pDescriptorList->append(MP_CREATE_DESCRIPTOR(KviAudaciousClassicInterface)); g_pDescriptorList->append(MP_CREATE_DESCRIPTOR(KviXmmsInterface)); g_pDescriptorList->append(MP_CREATE_DESCRIPTOR(KviXmms2Interface)); + g_pDescriptorList->append(MP_CREATE_DESCRIPTOR(KviBmpxInterface)); #endif #ifdef COMPILE_ON_WINDOWS diff --git a/src/modules/mediaplayer/mp_audaciousinterface.cpp b/src/modules/mediaplayer/mp_audaciousinterface.cpp index e2f377855..53e53c66f 100644 --- a/src/modules/mediaplayer/mp_audaciousinterface.cpp +++ b/src/modules/mediaplayer/mp_audaciousinterface.cpp @@ -37,30 +37,53 @@ MP_IMPLEMENT_DESCRIPTOR( ) ) -KviAudaciousInterface::KviAudaciousInterface() +MP_IMPLEMENT_DESCRIPTOR( + KviBmpxInterface, + "bmpx", + __tr2qs_ctx( + "An interface to BMPx.\n" \ + "Download it from http://bmpx.backtrace.info\n" + , + "mediaplayer" + ) +) + +KviMPRISInterface::KviMPRISInterface() : KviMediaPlayerInterface() { } -KviAudaciousInterface::~KviAudaciousInterface() +KviMPRISInterface::~KviMPRISInterface() { } -int KviAudaciousInterface::detect(bool bStart) +KviAudaciousInterface::KviAudaciousInterface() +: KviMPRISInterface() +{ + m_szServiceName = "org.mpris.audacious"; +} + +KviBmpxInterface::KviBmpxInterface() +: KviMPRISInterface() +{ + m_szServiceName = "org.mpris.bmp"; +} + +int KviMPRISInterface::detect(bool bStart) { QDBusReply reply = QDBusConnection::sessionBus().interface()->registeredServiceNames(); if (!reply.isValid()) /* something fishy with dbus, it won't work */ return 0; foreach (QString name, reply.value()) - if (name == "org.mpris.audacious") /* audacious is running */ + if (name == m_szServiceName) /* player is running */ return 100; - return 1; /* dbus works, audacious may be closed */ + return 1; /* dbus works, player may be closed */ } -#define AUDACIOUS_SIMPLE_CALL(__action) \ - QDBusInterface dbus_iface("org.mpris.audacious", "/Player", \ +#define MPRIS_SIMPLE_CALL(__action) \ + QDBusInterface dbus_iface(m_szServiceName, "/Player", \ "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus()); \ QDBusMessage reply = dbus_iface.call(QDBus::Block, __action); \ if (reply.type() == QDBusMessage::ErrorMessage) { \ @@ -70,38 +93,38 @@ int KviAudaciousInterface::detect(bool bStart) } \ return TRUE; -bool KviAudaciousInterface::prev() +bool KviMPRISInterface::prev() { - AUDACIOUS_SIMPLE_CALL("Prev") + MPRIS_SIMPLE_CALL("Prev") } -bool KviAudaciousInterface::next() +bool KviMPRISInterface::next() { - AUDACIOUS_SIMPLE_CALL("Next") + MPRIS_SIMPLE_CALL("Next") } -bool KviAudaciousInterface::play() +bool KviMPRISInterface::play() { - AUDACIOUS_SIMPLE_CALL("Play") + MPRIS_SIMPLE_CALL("Play") } -bool KviAudaciousInterface::stop() +bool KviMPRISInterface::stop() { - AUDACIOUS_SIMPLE_CALL("Stop") + MPRIS_SIMPLE_CALL("Stop") } -bool KviAudaciousInterface::pause() +bool KviMPRISInterface::pause() { - AUDACIOUS_SIMPLE_CALL("Pause") + MPRIS_SIMPLE_CALL("Pause") } bool KviAudaciousInterface::quit() { - AUDACIOUS_SIMPLE_CALL("Quit") + MPRIS_SIMPLE_CALL("Quit") } -#define AUDACIOUS_CALL_METHOD(__method, __return_if_fail) \ - QDBusInterface dbus_iface("org.mpris.audacious", "/Player", \ +#define MPRIS_CALL_METHOD(__method, __return_if_fail) \ + QDBusInterface dbus_iface(m_szServiceName, "/Player", \ "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus()); \ QDBusMessage reply = dbus_iface.call(QDBus::Block, __method); \ if (reply.type() == QDBusMessage::ErrorMessage) { \ @@ -110,8 +133,26 @@ bool KviAudaciousInterface::quit() return __return_if_fail; \ } -#define AUDACIOUS_CALL_METHOD_WITH_ARG(__method, __arg, __return_if_fail) \ - QDBusInterface dbus_iface("org.mpris.audacious", "/Player", \ +#define MPRIS_GET_METADATA_FIELD(__field) \ + if (this->status() != KviMediaPlayerInterface::Playing) \ + return ""; \ + MPRIS_CALL_METHOD("GetMetadata", "") \ + foreach (QVariant v, reply.arguments()) { \ + QDBusArgument arg = qvariant_cast(v); \ + QVariant v = qdbus_cast(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(); \ + } \ + } \ + } \ + return ""; + +#define MPRIS_CALL_METHOD_WITH_ARG(__method, __arg, __return_if_fail) \ + QDBusInterface dbus_iface(m_szServiceName, "/Player", \ "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus()); \ QDBusMessage reply = dbus_iface.call(QDBus::Block, __method, __arg); \ if (reply.type() == QDBusMessage::ErrorMessage) { \ @@ -120,12 +161,12 @@ bool KviAudaciousInterface::quit() return __return_if_fail; \ } -QString KviAudaciousInterface::nowPlaying() +QString KviMPRISInterface::nowPlaying() { if (this->status() != KviMediaPlayerInterface::Playing) return ""; - AUDACIOUS_CALL_METHOD("GetMetadata", "") + MPRIS_CALL_METHOD("GetMetadata", "") QString artist; QString title; @@ -149,9 +190,9 @@ QString KviAudaciousInterface::nowPlaying() return ""; } -QString KviAudaciousInterface::mrl() +QString KviMPRISInterface::mrl() { - AUDACIOUS_CALL_METHOD("GetMetadata", "") + MPRIS_CALL_METHOD("GetMetadata", "") foreach (QVariant v, reply.arguments()) { QDBusArgument arg = qvariant_cast(v); @@ -170,13 +211,13 @@ QString KviAudaciousInterface::mrl() bool KviAudaciousInterface::setVol(kvs_int_t &iVol) { - AUDACIOUS_CALL_METHOD_WITH_ARG("VolumeSet", QVariant((int)(100*iVol/255)), false); + MPRIS_CALL_METHOD_WITH_ARG("VolumeSet", QVariant((int)(100*iVol/255)), false); return true; } int KviAudaciousInterface::getVol() { - AUDACIOUS_CALL_METHOD("VolumeGet", -1) + MPRIS_CALL_METHOD("VolumeGet", -1) int iVol = reply.arguments().first().toInt(); return iVol * 255 /100; @@ -184,7 +225,7 @@ int KviAudaciousInterface::getVol() KviMediaPlayerInterface::PlayerStatus KviAudaciousInterface::status() { - QDBusInterface dbus_iface("org.mpris.audacious", "/Player", + QDBusInterface dbus_iface(m_szServiceName, "/Player", "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus()); if (!dbus_iface.isValid()) return KviMediaPlayerInterface::Unknown; @@ -201,13 +242,13 @@ KviMediaPlayerInterface::PlayerStatus KviAudaciousInterface::status() int KviAudaciousInterface::position() { - AUDACIOUS_CALL_METHOD("PositionGet", -1) + MPRIS_CALL_METHOD("PositionGet", -1) return reply.arguments().first().toInt(); } int KviAudaciousInterface::length() { - AUDACIOUS_CALL_METHOD("GetMetadata", -1) + MPRIS_CALL_METHOD("GetMetadata", -1) foreach (QVariant v, reply.arguments()) { QDBusArgument arg = qvariant_cast(v); @@ -226,58 +267,33 @@ int KviAudaciousInterface::length() bool KviAudaciousInterface::jumpTo(int &iPos) { - AUDACIOUS_CALL_METHOD_WITH_ARG("PositionSet", QVariant(iPos), false) + MPRIS_CALL_METHOD_WITH_ARG("PositionSet", QVariant(iPos), false) return true; } -#define AUDACIOUS_GET_METADATA_FIELD(__field) \ - if (this->status() != KviMediaPlayerInterface::Playing) \ - return ""; \ - QDBusInterface dbus_iface("org.mpris.audacious", "/Player", \ - "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus()); \ - QDBusMessage reply = dbus_iface.call(QDBus::Block, "GetMetadata"); \ - if (reply.type() == QDBusMessage::ErrorMessage) { \ - QDBusError err = reply; \ - debug("Error: %s\n%s\n", qPrintable(err.name()), qPrintable(err.message())); \ - return ""; \ - } \ - foreach (QVariant v, reply.arguments()) { \ - QDBusArgument arg = qvariant_cast(v); \ - QVariant v = qdbus_cast(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(); \ - } \ - } \ - } \ - return ""; - QString KviAudaciousInterface::title() { - AUDACIOUS_GET_METADATA_FIELD("title") + MPRIS_GET_METADATA_FIELD("title") } QString KviAudaciousInterface::artist() { - AUDACIOUS_GET_METADATA_FIELD("artist") + MPRIS_GET_METADATA_FIELD("artist") } QString KviAudaciousInterface::genre() { - AUDACIOUS_GET_METADATA_FIELD("genre") + MPRIS_GET_METADATA_FIELD("genre") } QString KviAudaciousInterface::comment() { - AUDACIOUS_GET_METADATA_FIELD("comment") + MPRIS_GET_METADATA_FIELD("comment") } QString KviAudaciousInterface::album() { - AUDACIOUS_GET_METADATA_FIELD("album") + MPRIS_GET_METADATA_FIELD("album") } /* audacious specific interface */ diff --git a/src/modules/mediaplayer/mp_audaciousinterface.h b/src/modules/mediaplayer/mp_audaciousinterface.h index 95baeec25..00fc30f09 100644 --- a/src/modules/mediaplayer/mp_audaciousinterface.h +++ b/src/modules/mediaplayer/mp_audaciousinterface.h @@ -30,21 +30,29 @@ #if (!defined(COMPILE_ON_WINDOWS) && !defined(COMPILE_ON_MAC)) #include - class KviAudaciousInterface : public KviMediaPlayerInterface + class KviMPRISInterface : public KviMediaPlayerInterface { public: - KviAudaciousInterface(); - virtual ~KviAudaciousInterface(); + KviMPRISInterface(); + virtual ~KviMPRISInterface(); public: + QString m_szServiceName; virtual int detect(bool bStart); virtual bool prev(); virtual bool next(); virtual bool play(); virtual bool stop(); virtual bool pause(); - virtual bool quit(); virtual QString nowPlaying(); virtual QString mrl(); + }; + + class KviAudaciousInterface : public KviMPRISInterface + { + public: + KviAudaciousInterface(); + public: + virtual bool quit(); virtual bool setVol(kvs_int_t &iVol); virtual int getVol(); virtual KviMediaPlayerInterface::PlayerStatus status(); @@ -61,8 +69,15 @@ virtual QString year(); virtual QString mediaType(); }; + + class KviBmpxInterface : public KviMPRISInterface + { + public: + KviBmpxInterface(); + }; MP_DECLARE_DESCRIPTOR(KviAudaciousInterface) + MP_DECLARE_DESCRIPTOR(KviBmpxInterface) #endif //!COMPILE_ON_WINDOWS -- cgit v1.3.1-10-gc9f91