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:
parent
6996c704eb
commit
49dcd70dd2
@ -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 )
|
||||
|
@ -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 ); }
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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"/>
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user