diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-01-01 14:32:36 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-01-01 14:32:36 +0000 |
| commit | bcf5e290508d81d21e6e6f5ce79483390ac926d0 (patch) | |
| tree | 52ed2f058bd46734d5f1b6d52ded700b1b208356 /src/plugins/General/mpris | |
| parent | a36e04a07b70b793dd755eb9c68441b0b31c9098 (diff) | |
| download | qmmp-bcf5e290508d81d21e6e6f5ce79483390ac926d0.tar.gz qmmp-bcf5e290508d81d21e6e6f5ce79483390ac926d0.tar.bz2 qmmp-bcf5e290508d81d21e6e6f5ce79483390ac926d0.zip | |
fixed several mpris2 bugs (Fixes issue 570)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3112 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/General/mpris')
| -rw-r--r-- | src/plugins/General/mpris/mpris2/player2object.cpp | 126 | ||||
| -rw-r--r-- | src/plugins/General/mpris/mpris2/player2object.h | 6 | ||||
| -rw-r--r-- | src/plugins/General/mpris/mpris2/root2object.cpp | 3 |
3 files changed, 72 insertions, 63 deletions
diff --git a/src/plugins/General/mpris/mpris2/player2object.cpp b/src/plugins/General/mpris/mpris2/player2object.cpp index d3dc81171..94ecca20f 100644 --- a/src/plugins/General/mpris/mpris2/player2object.cpp +++ b/src/plugins/General/mpris/mpris2/player2object.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010-2012 by Ilya Kotov * + * Copyright (C) 2010-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -36,7 +36,6 @@ Player2Object::Player2Object(QObject *parent) : QDBusAbstractAdaptor(parent) m_core = SoundCore::instance(); m_player = MediaPlayer::instance(); m_pl_manager = m_player->playListManager(); - connect(m_core, SIGNAL(stateChanged (Qmmp::State)), SLOT(emitPropertiesChanged())); connect(m_core, SIGNAL(metaDataChanged ()), SLOT(updateId())); connect(m_core, SIGNAL(metaDataChanged ()), SLOT(emitPropertiesChanged())); connect(m_core, SIGNAL(stateChanged (Qmmp::State)), SLOT(emitPropertiesChanged())); @@ -45,7 +44,11 @@ Player2Object::Player2Object(QObject *parent) : QDBusAbstractAdaptor(parent) connect(m_core, SIGNAL(elapsedChanged(qint64)), SLOT(checkSeeking(qint64))); connect(m_pl_manager, SIGNAL(repeatableListChanged(bool)), SLOT(emitPropertiesChanged())); connect(m_pl_manager, SIGNAL(shuffleChanged(bool)), SLOT(emitPropertiesChanged())); + connect(m_pl_manager, SIGNAL(currentPlayListChanged(PlayListModel*,PlayListModel*)), + SLOT(setModel(PlayListModel*,PlayListModel*))); connect(m_player, SIGNAL(repeatableChanged(bool)), SLOT(emitPropertiesChanged())); + setModel(m_pl_manager->currentPlayList(), 0); + updateId(); syncProperties(); } @@ -120,9 +123,12 @@ QVariantMap Player2Object::metadata() const if(!item || m_core->metaData(Qmmp::URL).isEmpty()) return QVariantMap(); QVariantMap map; - map["mpris:length"] = m_core->totalTime() * 1000; + map["mpris:length"] = qMax(m_core->totalTime() * 1000 , qint64(0)); if(!MetaDataManager::instance()->getCoverPath(m_core->metaData(Qmmp::URL)).isEmpty()) - map["mpris:artUrl"] = MetaDataManager::instance()->getCoverPath(m_core->metaData(Qmmp::URL)); + { + map["mpris:artUrl"] = QString("file://") + + MetaDataManager::instance()->getCoverPath(m_core->metaData(Qmmp::URL)); + } if(!m_core->metaData(Qmmp::ALBUM).isEmpty()) map["xesam:album"] = m_core->metaData(Qmmp::ALBUM); if(!m_core->metaData(Qmmp::ARTIST).isEmpty()) @@ -136,10 +142,10 @@ QVariantMap Player2Object::metadata() const if(!m_core->metaData(Qmmp::GENRE).isEmpty()) map["xesam:genre"] = QStringList() << m_core->metaData(Qmmp::GENRE); if(!m_core->metaData(Qmmp::TITLE).isEmpty()) - map["xesam:title"] = QStringList() << m_core->metaData(Qmmp::TITLE); + map["xesam:title"] = m_core->metaData(Qmmp::TITLE); if(!m_core->metaData(Qmmp::TRACK).isEmpty()) - map["xesam:trackNumber"] = m_core->metaData(Qmmp::TRACK); - map["mpris:trackid"] = m_trackID; + map["xesam:trackNumber"] = m_core->metaData(Qmmp::TRACK).toInt(); + map["mpris:trackid"] = QVariant::fromValue<QDBusObjectPath>(m_trackID); map["xesam:url"] = m_core->metaData(Qmmp::URL); return map; } @@ -160,7 +166,7 @@ QString Player2Object::playbackStatus() const qlonglong Player2Object::position() const { - return m_core->elapsed() * 1000; + return qMax(m_core->elapsed() * 1000, qint64(0)); } double Player2Object::rate() const @@ -249,7 +255,7 @@ void Player2Object::Seek(qlonglong Offset) } void Player2Object::SetPosition(const QDBusObjectPath &TrackId, qlonglong Position) { - if(m_trackID == TrackId.path()) + if(m_trackID == TrackId) m_core->seek(Position/1000); else qWarning("Player2Object: SetPosition() called with a invalid trackId"); @@ -263,51 +269,47 @@ void Player2Object::Stop() void Player2Object::emitPropertiesChanged() { QList<QByteArray> changedProps; - if(m_props["canGoNext"] != canGoNext()) - changedProps << "canGoNext"; - if(m_props["canGoPrevious"] != canGoPrevious()) - changedProps << "canGoPrevious"; - if(m_props["canPause"] != canPause()) - changedProps << "canPause"; - if(m_props["canPlay"] != canPlay()) - changedProps << "canPlay"; - if(m_props["canSeek"] != canSeek()) - changedProps << "canSeek"; - if(m_props["loopStatus"] != loopStatus()) - changedProps << "loopStatus"; - if(m_props["maximumRate"] != maximumRate()) - changedProps << "maximumRate"; - if(m_props["minimumRate"] != minimumRate()) - changedProps << "minimumRate"; - if(m_props["playbackStatus"] != playbackStatus()) - changedProps << "playbackStatus"; - if(m_props["position"] != position()) - changedProps << "position"; - if(m_props["rate"] != rate()) - changedProps << "rate"; - if(m_props["shuffle"] != shuffle()) - changedProps << "shuffle"; - if(m_props["volume"] != volume()) - changedProps << "volume"; - if(m_props["metadata"] != metadata()) - changedProps << "metadata"; - - syncProperties(); + if(m_props["CanGoNext"] != canGoNext()) + changedProps << "CanGoNext"; + if(m_props["CanGoPrevious"] != canGoPrevious()) + changedProps << "CanGoPrevious"; + if(m_props["CanPause"] != canPause()) + changedProps << "CanPause"; + if(m_props["CanPlay"] != canPlay()) + changedProps << "CanPlay"; + if(m_props["CanSeek"] != canSeek()) + changedProps << "CanSeek"; + if(m_props["LoopStatus"] != loopStatus()) + changedProps << "LoopStatus"; + if(m_props["MaximumRate"] != maximumRate()) + changedProps << "MaximumRate"; + if(m_props["MinimumRate"] != minimumRate()) + changedProps << "MinimumRate"; + if(m_props["PlaybackStatus"] != playbackStatus()) + changedProps << "PlaybackStatus"; + if(m_props["Rate"] != rate()) + changedProps << "Rate"; + if(m_props["Shuffle"] != shuffle()) + changedProps << "Shuffle"; + if(m_props["Volume"] != volume()) + changedProps << "Volume"; + if(m_props["Metadata"] != metadata()) + changedProps << "Metadata"; if(changedProps.isEmpty()) return; + syncProperties(); + QVariantMap map; foreach(QByteArray name, changedProps) map.insert(name, m_props.value(name)); QDBusMessage msg = QDBusMessage::createSignal("/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "PropertiesChanged"); - QVariantList args = QVariantList() - << "org.mpris.MediaPlayer2.Player" - << map - << QStringList(); - msg.setArguments(args); + msg << "org.mpris.MediaPlayer2.Player"; + msg << map; + msg << QStringList(); QDBusConnection::sessionBus().send(msg); } @@ -315,7 +317,7 @@ void Player2Object::updateId() { if(m_prev_item != m_pl_manager->currentPlayList()->currentItem()) { - m_trackID = QString("%1/Track/%2").arg("/org/mpris/MediaPlayer2").arg(qrand()); + m_trackID = QDBusObjectPath(QString("%1/Track/%2").arg("/org/qmmp/MediaPlayer2").arg(qrand())); m_prev_item = m_pl_manager->currentPlayList()->currentItem(); } } @@ -352,20 +354,26 @@ void Player2Object::disconnectPl() this, SLOT(playItem(PlayListItem*))); } +void Player2Object::setModel(PlayListModel *selected, PlayListModel *previous) +{ + if(previous) + disconnect(previous, 0, this, 0); //disconnect previous model + connect(selected, SIGNAL(listChanged()), SLOT(emitPropertiesChanged())); +} + void Player2Object::syncProperties() { - m_props["canGoNext"] = canGoNext(); - m_props["canGoPrevious"] = canGoPrevious(); - m_props["canPause"] = canPause(); - m_props["canPlay"] = canPlay(); - m_props["canSeek"] = canSeek(); - m_props["loopStatus"] = loopStatus(); - m_props["maximumRate"] = maximumRate(); - m_props["minimumRate"] = minimumRate(); - m_props["playbackStatus"] = playbackStatus(); - m_props["position"] = position(); - m_props["rate"] = rate(); - m_props["shuffle"] = shuffle(); - m_props["volume"] = volume(); - m_props["metadata"] = metadata(); + m_props["CanGoNext"] = canGoNext(); + m_props["CanGoPrevious"] = canGoPrevious(); + m_props["CanPause"] = canPause(); + m_props["CanPlay"] = canPlay(); + m_props["CanSeek"] = canSeek(); + m_props["LoopStatus"] = loopStatus(); + m_props["MaximumRate"] = maximumRate(); + m_props["MinimumRate"] = minimumRate(); + m_props["PlaybackStatus"] = playbackStatus(); + m_props["Rate"] = rate(); + m_props["Shuffle"] = shuffle(); + m_props["Volume"] = volume(); + m_props["Metadata"] = metadata(); } diff --git a/src/plugins/General/mpris/mpris2/player2object.h b/src/plugins/General/mpris/mpris2/player2object.h index d79f822b7..37d332cf2 100644 --- a/src/plugins/General/mpris/mpris2/player2object.h +++ b/src/plugins/General/mpris/mpris2/player2object.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010 by Ilya Kotov * + * Copyright (C) 2010-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -31,6 +31,7 @@ class SoundCore; class MediaPlayer; class PlayListManager; class PlayListItem; +class PlayListModel; /** @author Ilya Kotov <forkotov02@hotmail.ru> @@ -98,6 +99,7 @@ private slots: void checkSeeking(qint64 elapsed); void playItem(PlayListItem *item); void disconnectPl(); + void setModel(PlayListModel *selected, PlayListModel *previous); private: @@ -106,7 +108,7 @@ private: MediaPlayer *m_player; PlayListManager *m_pl_manager; QMap<QString, QVariant> m_props; - QString m_trackID; + QDBusObjectPath m_trackID; PlayListItem *m_prev_item; qint64 m_previous_pos; diff --git a/src/plugins/General/mpris/mpris2/root2object.cpp b/src/plugins/General/mpris/mpris2/root2object.cpp index 1f789237d..5bf47e31f 100644 --- a/src/plugins/General/mpris/mpris2/root2object.cpp +++ b/src/plugins/General/mpris/mpris2/root2object.cpp @@ -58,8 +58,7 @@ bool Root2Object::hasTrackList() const } QString Root2Object::identity() const { - QString name = "Qmmp " + Qmmp::strVersion(); - return name; + return "Qmmp"; } QStringList Root2Object::supportedMimeTypes() const |
