1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-25 02:09:48 +01:00

Implement most MPRIS methods, minus metadata and related methods.

This commit is contained in:
Alejandro Wainzinger 2011-08-11 12:27:15 -07:00
parent 6996c704eb
commit 49dcd70dd2
8 changed files with 126 additions and 34 deletions

View File

@ -224,7 +224,7 @@ AudioEngine::next()
void
AudioEngine::seek( int ms )
AudioEngine::seek( qint64 ms )
{
if ( !m_playlist.isNull() && m_playlist.data()->seekRestrictions() == PlaylistInterface::NoSeek )
return;
@ -236,6 +236,11 @@ AudioEngine::seek( int ms )
}
}
void
AudioEngine::seek( int ms )
{
seek( (qint64) ms );
}
void
AudioEngine::setVolume( int percentage )

View File

@ -69,6 +69,9 @@ public:
Tomahawk::result_ptr currentTrack() const { return m_currentTrack; }
qint64 currentTime() const { return m_mediaObject->currentTime(); }
qint64 currentTrackTotalTime() const { return m_mediaObject->totalTime(); }
public slots:
void playPause();
void play();
@ -78,7 +81,8 @@ public slots:
void previous();
void next();
void seek( int ms );
void seek( qint64 ms );
void seek( int ms ); // for compatibility with seekbar in audiocontrols
void setVolume( int percentage );
void lowerVolume() { setVolume( volume() - AUDIO_VOLUME_STEP ); }
void raiseVolume() { setVolume( volume() + AUDIO_VOLUME_STEP ); }

View File

@ -16,8 +16,10 @@
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QApplication>
#include <QtDBus/QtDBus>
#include "audio/audioengine.h"
#include "infosystem/infosystemworker.h"
#include "artist.h"
#include "result.h"
@ -58,7 +60,7 @@ bool
MprisPlugin::canQuit() const
{
qDebug() << Q_FUNC_INFO;
return false;
return true;
}
bool
@ -109,6 +111,7 @@ MprisPlugin::Raise()
void
MprisPlugin::Quit()
{
QApplication::quit();
}
// org.mpris.MediaPlayer2.Player
@ -116,54 +119,83 @@ MprisPlugin::Quit()
bool
MprisPlugin::canControl() const
{
return false;
return true;
}
bool
MprisPlugin::canGoNext() const
{
return false;
return true;
}
bool
MprisPlugin::canGoPrevious() const
{
return false;
return true;
}
bool
MprisPlugin::canPause() const
{
return false;
return true;
}
bool
MprisPlugin::canPlay() const
{
return false;
return true;
}
bool
MprisPlugin::canSeek() const
{
return false;
return true;
}
QString
MprisPlugin::loopStatus() const
{
return QString("");
PlaylistInterface *p = AudioEngine::instance()->playlist();
if (!p)
return "None";
PlaylistInterface::RepeatMode mode = p->repeatMode();
switch( mode )
{
case PlaylistInterface::RepeatOne:
return "Track";
break;
case PlaylistInterface::RepeatAll:
return "Playlist";
break;
case PlaylistInterface::NoRepeat:
return "None";
break;
default:
return QString("None");
break;
}
return QString("None");
}
void
MprisPlugin::setLoopStatus(const QString &value)
MprisPlugin::setLoopStatus( const QString &value )
{
PlaylistInterface *p = AudioEngine::instance()->playlist();
if (!p)
return;
if( value == "Track")
p->setRepeatMode( PlaylistInterface::RepeatOne );
else if( value == "Playlist" )
p->setRepeatMode( PlaylistInterface::RepeatAll );
else if( value == "None" )
p->setRepeatMode( PlaylistInterface::NoRepeat );
}
double
MprisPlugin::maximumRate() const
{
return 0.0;
return 1.0;
}
QVariantMap
@ -175,92 +207,131 @@ MprisPlugin::metadata() const
double
MprisPlugin::minimumRate() const
{
return 0.0;
return 1.0;
}
QString
MprisPlugin::playbackStatus() const
{
if( AudioEngine::instance()->state() == AudioEngine::Playing )
return "Playing";
else if( AudioEngine::instance()->state() == AudioEngine::Paused )
return "Paused";
else if( AudioEngine::instance()->state() == AudioEngine::Stopped )
return "Stopped";
return QString("");
}
qlonglong
MprisPlugin::position() const
{
return 0;
// Convert Tomahawk's milliseconds to microseconds
return (qlonglong) ( AudioEngine::instance()->currentTime() * 1000 );
}
double
MprisPlugin::rate() const
{
return 0.0;
return 1.0;
}
void
MprisPlugin::setRate( double value )
{
Q_UNUSED( value );
}
bool
MprisPlugin::shuffle() const
{
return false;
PlaylistInterface *p = AudioEngine::instance()->playlist();
if (!p)
return false;
return p->shuffled();
}
void
MprisPlugin::setShuffle( bool value )
{
PlaylistInterface *p = AudioEngine::instance()->playlist();
if (!p)
return;
return p->setShuffled( value );
}
double
MprisPlugin::volume() const
{
return 0.0;
return AudioEngine::instance()->volume();
}
void
MprisPlugin::setVolume( double value )
{
AudioEngine::instance()->setVolume( value );
}
void
MprisPlugin::Next()
{
AudioEngine::instance()->next();
}
void
MprisPlugin::OpenUri(const QString &Uri)
{
// TODO
}
void
MprisPlugin::Pause()
{
AudioEngine::instance()->pause();
}
void
MprisPlugin::Play()
{
AudioEngine::instance()->play();
}
void
MprisPlugin::PlayPause()
{
AudioEngine::instance()->playPause();
}
void
MprisPlugin::Previous()
{
AudioEngine::instance()->previous();
}
void
MprisPlugin::Seek( qlonglong Offset )
{
qlonglong seekTime = position() + Offset;
if( seekTime < 0 )
AudioEngine::instance()->seek( 0 );
else if( seekTime > AudioEngine::instance()->currentTrackTotalTime() )
Next();
// seekTime is in microseconds, but we work internally in milliseconds
else
AudioEngine::instance()->seek( (qint64) ( seekTime / 1000 ) );
}
void
MprisPlugin::SetPosition( const QDBusObjectPath &TrackId, qlonglong Position )
{
// TODO
}
void
MprisPlugin::Stop()
{
AudioEngine::instance()->stop();
}
// InfoPlugin Methods

View File

@ -109,8 +109,9 @@ public:
bool shuffle() const;
void setShuffle(bool value);
Q_PROPERTY(double Volume READ volume)
Q_PROPERTY(double Volume READ volume WRITE setVolume)
double volume() const;
void setVolume(double value);
public slots:
void namChangedSlot( QNetworkAccessManager* /*nam*/ ) {} // unused

View File

@ -141,6 +141,12 @@ double MprisPluginPlayerAdaptor::volume() const
return qvariant_cast< double >(parent()->property("Volume"));
}
void MprisPluginPlayerAdaptor::setVolume(double value)
{
// set the value of property Volume
parent()->setProperty("Volume", qVariantFromValue(value));
}
void MprisPluginPlayerAdaptor::Next()
{
// handle method call org.mpris.MediaPlayer2.Player.Next

View File

@ -9,8 +9,8 @@
* before re-generating it.
*/
#ifndef MPRISPLUGINPLAYERADAPTOR_H_1312900500
#define MPRISPLUGINPLAYERADAPTOR_H_1312900500
#ifndef MPRISPLUGINPLAYERADAPTOR_H_1313089554
#define MPRISPLUGINPLAYERADAPTOR_H_1313089554
#include <QtCore/QObject>
#include <QtDBus/QtDBus>
@ -37,17 +37,17 @@ class MprisPluginPlayerAdaptor: public QDBusAbstractAdaptor
" <method name=\"Stop\"/>\n"
" <method name=\"Play\"/>\n"
" <method name=\"Seek\">\n"
" <arg type=\"x\" name=\"Offset\"/>\n"
" <arg direction=\"in\" type=\"x\" name=\"Offset\"/>\n"
" </method>\n"
" <method name=\"SetPosition\">\n"
" <arg type=\"o\" name=\"TrackId\"/>\n"
" <arg type=\"x\" name=\"Position\"/>\n"
" <arg direction=\"in\" type=\"o\" name=\"TrackId\"/>\n"
" <arg direction=\"in\" type=\"x\" name=\"Position\"/>\n"
" </method>\n"
" <method name=\"OpenUri\">\n"
" <arg type=\"s\" name=\"Uri\"/>\n"
" <arg direction=\"in\" type=\"s\" name=\"Uri\"/>\n"
" </method>\n"
" <signal name=\"Seeked\">\n"
" <arg type=\"x\" name=\"Position\"/>\n"
" <arg direction=\"out\" type=\"x\" name=\"Position\"/>\n"
" </signal>\n"
" <property access=\"read\" type=\"s\" name=\"PlaybackStatus\"/>\n"
" <property access=\"readwrite\" type=\"s\" name=\"LoopStatus\"/>\n"
@ -56,7 +56,7 @@ class MprisPluginPlayerAdaptor: public QDBusAbstractAdaptor
" <property access=\"read\" type=\"a{sv}\" name=\"Metadata\">\n"
" <annotation value=\"QVariantMap\" name=\"com.trolltech.QtDBus.QtTypeName\"/>\n"
" </property>\n"
" <property access=\"read\" type=\"d\" name=\"Volume\"/>\n"
" <property access=\"readwrite\" type=\"d\" name=\"Volume\"/>\n"
" <property access=\"read\" type=\"x\" name=\"Position\"/>\n"
" <property access=\"read\" type=\"d\" name=\"MinimumRate\"/>\n"
" <property access=\"read\" type=\"d\" name=\"MaximumRate\"/>\n"
@ -118,8 +118,9 @@ public: // PROPERTIES
bool shuffle() const;
void setShuffle(bool value);
Q_PROPERTY(double Volume READ volume)
Q_PROPERTY(double Volume READ volume WRITE setVolume)
double volume() const;
void setVolume(double value);
public Q_SLOTS: // METHODS
void Next();

View File

@ -8,17 +8,17 @@
<method name="Stop"/>
<method name="Play"/>
<method name="Seek">
<arg name="Offset" type="x"/>
<arg type="x" name="Offset" direction="in" />
</method>
<method name="SetPosition">
<arg name="TrackId" type="o"/>
<arg name="Position" type="x"/>
<arg type="o" name="TrackId" direction="in" />
<arg type="x" name="Position" direction="in" />
</method>
<method name="OpenUri">
<arg name="Uri" type="s"/>
<arg type="s" name="Uri" direction="in" />
</method>
<signal name="Seeked">
<arg name="Position" type="x"/>
<arg type="x" name="Position" direction="out" />
</signal>
<property name="PlaybackStatus" type="s" access="read"/>
<property name="LoopStatus" type="s" access="readwrite"/>
@ -27,7 +27,7 @@
<property name="Metadata" type="a{sv}" access="read">
<annotation name="com.trolltech.QtDBus.QtTypeName" value="QVariantMap"/>
</property>
<property name="Volume" type="d" access="read"/>
<property name="Volume" type="d" access="readwrite"/>
<property name="Position" type="x" access="read"/>
<property name="MinimumRate" type="d" access="read"/>
<property name="MaximumRate" type="d" access="read"/>

View File

@ -36,12 +36,16 @@ class DLLEXPORT PlaylistInterface
public:
enum RepeatMode { NoRepeat, RepeatOne, RepeatAll };
Q_ENUMS( RepeatMode )
enum ViewMode { Unknown, Tree, Flat, Album };
enum SeekRestrictions { NoSeekRestrictions, NoSeek };
enum SkipRestrictions { NoSkipRestrictions, NoSkipForwards, NoSkipBackwards, NoSkip };
enum RetryMode { NoRetry, Retry };
PlaylistInterface( QObject* parent = 0 ) : m_object( parent ) {}
PlaylistInterface( QObject* parent = 0 ) : m_object( parent )
{
qRegisterMetaType<Tomahawk::PlaylistInterface::RepeatMode>( "Tomahawk::PlaylistInterface::RepeatMode" );
}
virtual ~PlaylistInterface() {}
virtual QList< Tomahawk::query_ptr > tracks() = 0;