aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/mpris/playerobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/General/mpris/playerobject.cpp')
-rw-r--r--src/plugins/General/mpris/playerobject.cpp81
1 files changed, 74 insertions, 7 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());
+}