From c55ed6ab2a2839be7f4bbd490268948d103d8a4a Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Tue, 25 Nov 2008 22:24:48 +0000 Subject: some mpris plugin improvements git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@638 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/mpris/playerobject.cpp | 81 +++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 7 deletions(-) (limited to 'src/plugins/General/mpris/playerobject.cpp') 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 +#include +#include #include #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(); 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()); +} -- cgit v1.2.3-13-gbd6f