Plasma
mpris.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mpris.h"
00020 #include "mpris_p.h"
00021 #include <mpris_interface.h>
00022
00023 #include <QtDBus>
00024 #include <QFile>
00025
00026 #include <kdebug.h>
00027 #include <KIO/NetAccess>
00028
00029
00030
00031 MprisFactory::MprisFactory(QObject* parent)
00032 : DBusPlayerFactory(parent)
00033 {
00034 }
00035
00036 Player::Ptr MprisFactory::create(const QVariantList& args)
00037 {
00038 if (args.isEmpty()) {
00039 return Player::Ptr(0);
00040 }
00041 QString dbusName(args.first().toString());
00042 if (dbusName.isEmpty()) {
00043 return Player::Ptr(0);
00044 }
00045 Mpris* player = new Mpris(dbusName, this);
00046 if (!player->isRunning()) {
00047 delete player;
00048 player = 0;
00049 }
00050 return Player::Ptr(player);
00051 }
00052
00053 bool MprisFactory::matches(const QString& serviceName)
00054 {
00055 return serviceName.startsWith("org.mpris");
00056 }
00057
00058
00059
00060 Mpris::Mpris(const QString& name, PlayerFactory* factory)
00061 : QObject(),
00062 Player(factory),
00063 m_player(0),
00064 m_playerName(name)
00065 {
00066 if (!name.startsWith("org.mpris")) {
00067 m_playerName = "org.mpris." + name;
00068 }
00069 setName(m_playerName);
00070 setup();
00071 }
00072
00073 Mpris::~Mpris()
00074 {
00075 delete m_player;
00076 }
00077
00078 void Mpris::setup() {
00079 delete m_player;
00080 m_player = new OrgFreedesktopMediaPlayerInterface(
00081 m_playerName,
00082 "/Player",
00083 QDBusConnection::sessionBus());
00084
00085 m_metadata.clear();
00086 m_state = Stopped;
00087 m_caps = NO_CAPS;
00088
00089 if (m_player->isValid()) {
00090 connect(m_player, SIGNAL(CapsChange(int)),
00091 this, SLOT(capsChanged(int)));
00092 connect(m_player, SIGNAL(TrackChange(QVariantMap)),
00093 this, SLOT(trackChanged(QVariantMap)));
00094 connect(m_player, SIGNAL(StatusChange(int)),
00095 this, SLOT(stateChanged(int)));
00096
00097 capsChanged(m_player->GetCaps());
00098 trackChanged(m_player->GetMetadata());
00099 stateChanged(m_player->GetStatus());
00100 }
00101 }
00102
00103 bool Mpris::isRunning()
00104 {
00105 if (!m_player->isValid()) {
00106 setup();
00107 }
00108 return m_player->isValid();
00109 }
00110
00111 Player::State Mpris::state()
00112 {
00113 return m_state;
00114 }
00115
00116 QString Mpris::artist()
00117 {
00118 if (m_metadata.contains("artist")) {
00119 return m_metadata["artist"].toString();
00120 }
00121 return QString();
00122 }
00123
00124 QString Mpris::album()
00125 {
00126 if (m_metadata.contains("album")) {
00127 return m_metadata["album"].toString();
00128 }
00129 return QString();
00130 }
00131
00132 QString Mpris::title()
00133 {
00134 if (m_metadata.contains("title")) {
00135 return m_metadata["title"].toString();
00136 }
00137 return QString();
00138 }
00139
00140 int Mpris::trackNumber()
00141 {
00142 if (m_metadata.contains("trackNumber")) {
00143 QString track = m_metadata["trackNumber"].toString();
00144 int pos = track.indexOf('/');
00145 if (pos >= 0) {
00146 track.truncate(pos);
00147 }
00148 return track.toInt();
00149 }
00150 return 0;
00151 }
00152
00153 QString Mpris::comment()
00154 {
00155 if (m_metadata.contains("comment")) {
00156 return m_metadata["comment"].toString();
00157 }
00158 return QString();
00159 }
00160
00161 QString Mpris::genre()
00162 {
00163 if (m_metadata.contains("genre")) {
00164 return m_metadata["genre"].toString();
00165 }
00166 return QString();
00167 }
00168
00169 int Mpris::length()
00170 {
00171 if (m_metadata.contains("time")) {
00172 return m_metadata["time"].toInt();
00173 } else if (m_metadata.contains("length")) {
00174
00175 return m_metadata["length"].toInt()/1000;
00176 }
00177 return 0;
00178 }
00179
00180 int Mpris::position()
00181 {
00182 if (m_player->isValid()) {
00183 return m_player->PositionGet() / 1000;
00184 }
00185 return 0;
00186 }
00187
00188 float Mpris::volume()
00189 {
00190 if (m_player->isValid()) {
00191 return ((float)m_player->VolumeGet()) / 100;
00192 }
00193 return 0;
00194 }
00195
00196 QPixmap Mpris::artwork()
00197 {
00198 if (m_metadata.contains("arturl")) {
00199 QString arturl = m_metadata["arturl"].toString();
00200 if (!arturl.isEmpty()) {
00201 if (!m_artfiles.contains(arturl) ||
00202 !QFile::exists(m_artfiles[arturl])) {
00203 QString artfile;
00204 if (!KIO::NetAccess::download(arturl, artfile, 0)) {
00205 kWarning() << KIO::NetAccess::lastErrorString();
00206 return QPixmap();
00207 }
00208 m_artfiles[arturl] = artfile;
00209 }
00210 return QPixmap(m_artfiles[arturl]);
00211 }
00212 }
00213 return QPixmap();
00214 }
00215
00216 bool Mpris::canPlay()
00217 {
00218 return m_caps & CAN_PLAY;
00219 }
00220
00221 void Mpris::play()
00222 {
00223 if (m_player->isValid()) {
00224 m_player->Play();
00225 }
00226 }
00227
00228 bool Mpris::canPause()
00229 {
00230 return m_caps & CAN_PAUSE;
00231 }
00232
00233 void Mpris::pause()
00234 {
00235 if (m_player->isValid()) {
00236 m_player->Pause();
00237 }
00238 }
00239
00240 bool Mpris::canStop()
00241 {
00242 return m_state != Stopped;
00243 }
00244
00245 void Mpris::stop()
00246 {
00247 if (m_player->isValid()) {
00248 m_player->Stop();
00249 }
00250 }
00251
00252 bool Mpris::canGoPrevious()
00253 {
00254 return m_caps & CAN_GO_PREV;
00255 }
00256
00257 void Mpris::previous()
00258 {
00259 if (m_player->isValid()) {
00260 m_player->Prev();
00261 }
00262 }
00263
00264 bool Mpris::canGoNext()
00265 {
00266 return m_caps & CAN_GO_NEXT;
00267 }
00268
00269 void Mpris::next()
00270 {
00271 if (m_player->isValid()) {
00272 m_player->Next();
00273 }
00274 }
00275
00276 bool Mpris::canSetVolume()
00277 {
00278 return true;
00279 }
00280
00281 void Mpris::setVolume(float volume)
00282 {
00283 if (m_player->isValid()) {
00284 m_player->VolumeSet((int)(volume * 100));
00285 }
00286 }
00287
00288 bool Mpris::canSeek()
00289 {
00290 return m_caps & CAN_SEEK;
00291 }
00292
00293 void Mpris::seek(int time)
00294 {
00295 if (m_player->isValid()) {
00296
00297 m_player->PositionSet(time * 1000);
00298 }
00299 }
00300
00301
00302
00303 void Mpris::trackChanged(const QVariantMap& metadata)
00304 {
00305 kDebug() << m_playerName << "metadata:" << metadata;
00306 m_metadata = metadata;
00307 }
00308
00309 void Mpris::stateChanged(int state)
00310 {
00311 kDebug() << m_playerName << "state:" << state;
00312 switch (state) {
00313 case 0:
00314 m_state = Playing;
00315 break;
00316 case 1:
00317 m_state = Paused;
00318 break;
00319 case 2:
00320 m_state = Stopped;
00321 break;
00322 default:
00323 kDebug() << m_playerName << "unexpected state" << state;
00324 }
00325 }
00326
00327 void Mpris::capsChanged(int caps)
00328 {
00329 kDebug() << m_playerName << "capabilities:" << caps;
00330 m_caps = static_cast<Caps>(caps);
00331 if (!caps & CAN_PROVIDE_METADATA) {
00332 m_metadata.clear();
00333 }
00334 }
00335
00336
00337 #include "mpris.moc"
00338 #include "mpris_p.moc"