diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-11-25 22:24:48 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-11-25 22:24:48 +0000 |
| commit | c55ed6ab2a2839be7f4bbd490268948d103d8a4a (patch) | |
| tree | 8636626395b4e5fc5b06b54e906f44c8b03b8fb5 | |
| parent | b232de14d10f6c09c7c15410fa468054695baaa6 (diff) | |
| download | qmmp-c55ed6ab2a2839be7f4bbd490268948d103d8a4a.tar.gz qmmp-c55ed6ab2a2839be7f4bbd490268948d103d8a4a.tar.bz2 qmmp-c55ed6ab2a2839be7f4bbd490268948d103d8a4a.zip | |
some mpris plugin improvements
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@638 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/General/mpris/playerobject.cpp | 81 | ||||
| -rw-r--r-- | src/plugins/General/mpris/playerobject.h | 44 | ||||
| -rw-r--r-- | src/plugins/General/mpris/rootobject.cpp | 27 | ||||
| -rw-r--r-- | src/plugins/General/mpris/rootobject.h | 8 |
4 files changed, 137 insertions, 23 deletions
diff --git a/src/plugins/General/mpris/playerobject.cpp b/src/plugins/General/mpris/playerobject.cpp index 21c296dec..6a4aeb025 100644 --- a/src/plugins/General/mpris/playerobject.cpp +++ b/src/plugins/General/mpris/playerobject.cpp @@ -19,15 +19,45 @@ ***************************************************************************/ #include <QFile> +#include <QDBusMetaType> +#include <QDBusArgument> #include <qmmp/soundcore.h> #include "playerobject.h" + +//register << operator +QDBusArgument &operator << (QDBusArgument &arg, const PlayerStatus &status) +{ + arg.beginStructure(); + arg << status.state; + arg << status.random; + arg << status.repeat; + arg << status.repeatPlayList; + arg.endStructure(); + return arg; +} + +//register >> operator +const QDBusArgument &operator >> (const QDBusArgument &arg, PlayerStatus &status) +{ + arg.beginStructure(); + arg >> status.state; + arg >> status.random; + arg >> status.repeat; + arg >> status.repeatPlayList; + arg.endStructure(); + return arg; +} + PlayerObject::PlayerObject(QObject *parent) - : QDBusAbstractAdaptor(parent) + : QObject(parent) { - setAutoRelaySignals(TRUE); + qDBusRegisterMetaType<PlayerStatus>(); m_core = SoundCore::instance(); + connect(m_core, SIGNAL(stateChanged (Qmmp::State)), SLOT(updateCaps())); + connect(m_core, SIGNAL(metaDataChanged ()), SLOT(updateTrack())); + connect(m_core, SIGNAL(stateChanged (Qmmp::State)), SLOT(updateStatus())); } PlayerObject::~PlayerObject() @@ -55,17 +85,26 @@ void PlayerObject::Stop() void PlayerObject::Play() { - //m_core->play(); + QMetaObject::invokeMethod(parent(), "play"); } PlayerStatus PlayerObject::GetStatus() { PlayerStatus st; - st.state = 2; - if (m_core->state() == Qmmp::Playing) + switch (m_core->state()) + { + case Qmmp::Stopped: + case Qmmp::NormalError: + case Qmmp::FatalError: + st.state = 2; + break; + case Qmmp::Playing: + case Qmmp::Buffering: st.state = 0; - else if (m_core->state() == Qmmp::Paused) + break; + case Qmmp::Paused: st.state = 1; + }; st.random = 0; //TODO playlist support st.repeat = 0; st.repeatPlayList = 0; @@ -94,6 +133,19 @@ QVariantMap PlayerObject::GetMetadata() return map; } +int PlayerObject::GetCaps() +{ + int caps = NONE; + if (GetStatus().state == 0) + caps |= CAN_PAUSE; + else + caps |= CAN_PLAY; + if (GetStatus().state < 2) + caps |= CAN_SEEK; + caps |= CAN_PROVIDE_METADATA; + return caps; +} + void PlayerObject::VolumeSet(int volume) { int balance = (m_core->rightVolume() - m_core->leftVolume()) * 100/VolumeGet(); @@ -111,7 +163,22 @@ void PlayerObject::PositionSet(int pos) m_core->seek(pos / 1000); } -qint64 PlayerObject::PositionGet() +int PlayerObject::PositionGet() { return m_core->elapsed() * 1000; } + +void PlayerObject::updateCaps() +{ + emit CapsChange(GetCaps()); +} + +void PlayerObject::updateTrack() +{ + emit TrackChange(GetMetadata()); +} + +void PlayerObject::updateStatus() +{ + emit StatusChange(GetStatus()); +} diff --git a/src/plugins/General/mpris/playerobject.h b/src/plugins/General/mpris/playerobject.h index 09f112728..0f60c85c9 100644 --- a/src/plugins/General/mpris/playerobject.h +++ b/src/plugins/General/mpris/playerobject.h @@ -20,14 +20,13 @@ #ifndef PLAYEROBJECT_H #define PLAYEROBJECT_H -#include <QtDBus> -#include <QString> -#include <QVariant> +#include <QObject> +#include <QVariantMap> class SoundCore; /** - @author Ilya Kotov <forkotov02@hotmail.ru> + @author Ilya Kotov <forkotov02@hotmail.ru> */ struct PlayerStatus @@ -38,17 +37,33 @@ struct PlayerStatus int repeatPlayList; // 0 = Stop playing once the last element has been played, 1 = Never give up playing }; +Q_DECLARE_METATYPE(PlayerStatus); -class PlayerObject : public QDBusAbstractAdaptor +class PlayerObject : public QObject { -Q_OBJECT -Q_CLASSINFO("D-Bus Interface", "org.freedesktop.MediaPlayer") + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.freedesktop.MediaPlayer") public: PlayerObject(QObject *parent = 0); ~PlayerObject(); + + enum PlayerCaps + { + + NONE = 0, + CAN_GO_NEXT = 1 << 0, + CAN_GO_PREV = 1 << 1, + CAN_PAUSE = 1 << 2, + CAN_PLAY = 1 << 3, + CAN_SEEK = 1 << 4, + CAN_PROVIDE_METADATA = 1 << 5, + CAN_HAS_TRACKLIST = 1 << 6 + }; + + public slots: void Next(); void Prev(); @@ -58,16 +73,21 @@ public slots: //void Repeat(); PlayerStatus GetStatus(); QVariantMap GetMetadata(); - //GetCaps + int GetCaps(); void VolumeSet(int in0); int VolumeGet(); void PositionSet(int in0); - qint64 PositionGet(); + int PositionGet(); signals: - //TrackChange - //StatusChange - //CapsChange + void CapsChange(int); + void TrackChange(QVariantMap); + void StatusChange(PlayerStatus); + +private slots: + void updateCaps(); + void updateTrack(); + void updateStatus(); private: SoundCore *m_core; diff --git a/src/plugins/General/mpris/rootobject.cpp b/src/plugins/General/mpris/rootobject.cpp index 4869fd862..d5dc1af9d 100644 --- a/src/plugins/General/mpris/rootobject.cpp +++ b/src/plugins/General/mpris/rootobject.cpp @@ -17,11 +17,36 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ + +#include <QDBusMetaType> +#include <QDBusArgument> + #include "rootobject.h" +//register << operator +QDBusArgument &operator << (QDBusArgument &arg, const Version &v) +{ + arg.beginStructure(); + arg << v.major; + arg << v.minor; + arg.endStructure(); + return arg; +} + +//register >> operator +const QDBusArgument &operator >> (const QDBusArgument &arg, Version &v) +{ + arg.beginStructure(); + arg >> v.major; + arg >> v.minor; + arg.endStructure(); + return arg; +} + RootObject::RootObject(QObject *parent) - : QDBusAbstractAdaptor(parent) + : QObject(parent) { + qDBusRegisterMetaType<Version>(); } diff --git a/src/plugins/General/mpris/rootobject.h b/src/plugins/General/mpris/rootobject.h index 1bae78e4c..378d9f51a 100644 --- a/src/plugins/General/mpris/rootobject.h +++ b/src/plugins/General/mpris/rootobject.h @@ -20,8 +20,8 @@ #ifndef ROOTOBJECT_H #define ROOTOBJECT_H -#include <QDBusAbstractAdaptor> -#include <QString> +#include <QObject> +#include <QVariantMap> /** @author Ilya Kotov <forkotov02@hotmail.ru> @@ -34,7 +34,9 @@ struct Version quint16 minor; }; -class RootObject : public QDBusAbstractAdaptor +Q_DECLARE_METATYPE(Version); + +class RootObject : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.freedesktop.MediaPlayer") |
