• Skip to content
  • Skip to link menu
KDE 4.1 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

Plasma

mpris.cpp

Go to the documentation of this file.
00001 /*
00002  *   Copyright 2007 Alex Merry <alex.merry@kdemail.net>
00003  *
00004  *   This program is free software; you can redistribute it and/or modify
00005  *   it under the terms of the GNU Library General Public License version 2 as
00006  *   published by the Free Software Foundation
00007  *
00008  *   This program is distributed in the hope that it will be useful,
00009  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00010  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011  *   GNU General Public License for more details
00012  *
00013  *   You should have received a copy of the GNU Library General Public
00014  *   License along with this program; if not, write to the
00015  *   Free Software Foundation, Inc.,
00016  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
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         // stupid audacious...
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         // m_player->seek() wants milliseconds
00297         m_player->PositionSet(time * 1000);
00298     }
00299 }
00300 
00301 // SLOTS
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"

Plasma

Skip menu "Plasma"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • KWin
  •   KWin Libraries
  • Libraries
  •   libkworkspace
  •   libplasma
  •   libsolidcontrol
  •   libtaskmanager
  • Plasma
  •   Animators
  •   Applets
  •   Engines
  • Solid Modules
Generated for API Reference by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal