aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/General/mpris/playerobject.cpp81
-rw-r--r--src/plugins/General/mpris/playerobject.h44
-rw-r--r--src/plugins/General/mpris/rootobject.cpp27
-rw-r--r--src/plugins/General/mpris/rootobject.h8
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")