mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-25 11:22:55 +00:00
216 lines
5.9 KiB
C++
216 lines
5.9 KiB
C++
/***************************************************************************
|
|
* Copyright 2008 by Marco Martin <notmart@gmail.com> *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
|
|
***************************************************************************/
|
|
|
|
#include "playerdbushandler.h"
|
|
#include "playeradaptor.h"
|
|
|
|
#include <QDBusConnection>
|
|
|
|
#include <phonon/audiooutput.h>
|
|
|
|
// Marshall the DBusStatus data into a D-BUS argument
|
|
QDBusArgument &operator<<(QDBusArgument &argument, const DBusStatus &status)
|
|
{
|
|
argument.beginStructure();
|
|
argument << status.Play;
|
|
argument << status.Random;
|
|
argument << status.Repeat;
|
|
argument << status.RepeatPlaylist;
|
|
argument.endStructure();
|
|
return argument;
|
|
}
|
|
|
|
// Retrieve the DBusStatus data from the D-BUS argument
|
|
const QDBusArgument &operator>>(const QDBusArgument &argument, DBusStatus &status)
|
|
{
|
|
argument.beginStructure();
|
|
argument >> status.Play;
|
|
argument >> status.Random;
|
|
argument >> status.Repeat;
|
|
argument >> status.RepeatPlaylist;
|
|
argument.endStructure();
|
|
return argument;
|
|
}
|
|
|
|
PlayerDBusHandler::PlayerDBusHandler(QObject *parent, Phonon::MediaObject *media, Phonon::AudioOutput *audioOutput)
|
|
: QObject(parent),
|
|
m_mediaObject(media),
|
|
m_audioOutput(audioOutput)
|
|
{
|
|
qDBusRegisterMetaType<DBusStatus>();
|
|
|
|
new PlayerAdaptor(this);
|
|
setObjectName("PlayerDBusHandler");
|
|
QDBusConnection dbus = QDBusConnection::sessionBus();
|
|
dbus.registerObject("/Player", this);
|
|
|
|
connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State,Phonon::State)));
|
|
|
|
connect(m_mediaObject, SIGNAL(seekableChanged(bool)), this, SLOT(seekableChanged(bool)));
|
|
|
|
connect(m_mediaObject, SIGNAL(metaDataChanged()), this, SLOT(trackChanged()));
|
|
}
|
|
|
|
|
|
PlayerDBusHandler::~PlayerDBusHandler()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
void PlayerDBusHandler::PlayPause()
|
|
{
|
|
if (m_mediaObject->state() == Phonon::PlayingState) {
|
|
m_mediaObject->pause();
|
|
} else {
|
|
m_mediaObject->play();
|
|
}
|
|
}
|
|
|
|
void PlayerDBusHandler::Play()
|
|
{
|
|
if (m_mediaObject->state() != Phonon::PlayingState) {
|
|
m_mediaObject->play();
|
|
}
|
|
}
|
|
|
|
void PlayerDBusHandler::Pause()
|
|
{
|
|
if (m_mediaObject->state() == Phonon::PlayingState) {
|
|
m_mediaObject->pause();
|
|
}
|
|
}
|
|
|
|
void PlayerDBusHandler::Stop()
|
|
{
|
|
m_mediaObject->stop();
|
|
}
|
|
|
|
DBusStatus PlayerDBusHandler::GetStatus()
|
|
{
|
|
DBusStatus status;
|
|
|
|
//0 = Playing, 1 = Paused, 2 = Stopped.
|
|
switch (m_mediaObject->state()) {
|
|
case Phonon::PlayingState:
|
|
status.Play = 0;
|
|
break;
|
|
case Phonon::PausedState:
|
|
status.Play = 1;
|
|
break;
|
|
case Phonon::StoppedState:
|
|
default:
|
|
status.Play = 2;
|
|
}
|
|
|
|
status.Random = 0;
|
|
status.Repeat = 0;
|
|
status.RepeatPlaylist = 0;
|
|
|
|
return status;
|
|
}
|
|
|
|
int PlayerDBusHandler::GetCaps()
|
|
{
|
|
int caps = NONE;
|
|
if (m_mediaObject->state() == Phonon::PlayingState) {
|
|
caps |= CAN_PAUSE;
|
|
}
|
|
if (m_mediaObject->state() == Phonon::PausedState) {
|
|
caps |= CAN_PLAY;
|
|
}
|
|
|
|
if (m_mediaObject->isSeekable()) {
|
|
caps |= CAN_SEEK;
|
|
}
|
|
|
|
caps |= CAN_HAS_TRACKLIST;
|
|
caps |= CAN_PROVIDE_METADATA; //though it might be empty...
|
|
return caps;
|
|
}
|
|
|
|
//see http://wiki.xmms2.xmms.se/index.php/MPRIS_Metadata
|
|
//derived from DragonPlayer
|
|
QVariantMap PlayerDBusHandler::GetMetadata()
|
|
{
|
|
QVariantMap ret;
|
|
QMultiMap<QString, QString> stringMap = m_mediaObject->metaData();
|
|
QMultiMap<QString, QString>::const_iterator i = stringMap.constBegin();
|
|
|
|
while (i != stringMap.constEnd()) {
|
|
bool number = false;
|
|
int value = i.value().toInt(&number);
|
|
|
|
//tracknumber always string, according to MPRIS spec
|
|
if (number && (i.key().toLower() != "tracknumber")) {
|
|
ret[i.key().toLower()] = value;
|
|
} else {
|
|
ret[i.key().toLower()] = QVariant(i.value());
|
|
}
|
|
++i;
|
|
}
|
|
|
|
ret["time"] = m_mediaObject->totalTime()/1000;
|
|
|
|
ret["location"] = m_mediaObject->currentSource().url().toString();
|
|
return ret;
|
|
}
|
|
|
|
void PlayerDBusHandler::stateChanged(Phonon::State newState, Phonon::State oldState)
|
|
{
|
|
Q_UNUSED(oldState)
|
|
Q_UNUSED(newState)
|
|
|
|
emit StatusChange(GetStatus());
|
|
emit CapsChange(GetCaps());
|
|
}
|
|
|
|
void PlayerDBusHandler::seekableChanged(bool isSeekable)
|
|
{
|
|
Q_UNUSED(isSeekable)
|
|
|
|
emit CapsChange(GetCaps());
|
|
}
|
|
|
|
void PlayerDBusHandler::trackChanged()
|
|
{
|
|
emit TrackChange(GetMetadata());
|
|
}
|
|
|
|
void PlayerDBusHandler::PositionSet(int progress)
|
|
{
|
|
m_mediaObject->seek(progress);
|
|
}
|
|
|
|
qint64 PlayerDBusHandler::PositionGet() const
|
|
{
|
|
return m_mediaObject->currentTime();
|
|
}
|
|
|
|
void PlayerDBusHandler::VolumeSet(int value)
|
|
{
|
|
m_audioOutput->setVolume(qreal(value)/100.0);
|
|
}
|
|
|
|
int PlayerDBusHandler::VolumeGet() const
|
|
{
|
|
return m_audioOutput->volume()*100;
|
|
}
|
|
|
|
#include "moc_playerdbushandler.cpp"
|