Final polisihing for KDE4:
[kdemultimedia.git] / libkcompactdisc / kcompactdisc.cpp
blob99fd8e3e0066f57607d505045eb95efd3baf6520
1 /*
2 * KCompactDisc - A CD drive interface for the KDE Project.
4 * Copyright (C) 2005 Shaheedur R. Haque <srhaque@iee.org>
5 * Copyright (C) 2007 Alexander Kern <alex.kern@gmx.de>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include "kcompactdisc.h"
23 #include "kcompactdisc_p.h"
25 #include <QtDBus>
27 #include <kdebug.h>
28 #include <kurl.h>
29 #include <klocale.h>
31 #include <solid/device.h>
32 #include <solid/block.h>
33 #include <solid/opticaldrive.h>
35 static QMap<QString, KUrl> cdromsNameToDeviceUrl;
36 static QMap<QString, QString> cdromsNameToUdi;
37 static QString ___null = QString();
39 static void refreshListOfCdromDevices()
41 cdromsNameToDeviceUrl.clear();
42 cdromsNameToUdi.clear();
43 QString name, type;
44 KUrl url;
46 //get a list of all devices that are Cdrom
47 foreach(Solid::Device device, Solid::Device::listFromType(Solid::DeviceInterface::OpticalDrive)) {
48 kDebug() << device.udi().toLatin1().constData();
49 Solid::Block *b = device.as<Solid::Block>();
50 Solid::OpticalDrive *o = device.as<Solid::OpticalDrive>();
51 Solid::OpticalDrive::MediumTypes mediumType = o->supportedMedia();
53 url = KUrl::fromPath(b->device().toLatin1());
55 if(mediumType < Solid::OpticalDrive::Cdrw) {
56 type = "CD-ROM";
57 } else if(mediumType < Solid::OpticalDrive::Dvd) {
58 type = "CDRW";
59 } else if(mediumType < Solid::OpticalDrive::Dvdr) {
60 type = "DVD-ROM";
61 } else if(mediumType < Solid::OpticalDrive::Bd) {
62 type = "DVDRW";
63 } else if(mediumType < Solid::OpticalDrive::HdDvd) {
64 type = "Blu-ray";
65 } else {
66 type = "High Density DVD";
69 if(!device.vendor().isEmpty())
70 name = (QString('[') + type + " - " + device.vendor() + " - " + device.product() + "]");
71 else
72 name = (QString('[') + type + " - unknown vendor - " + device.product() + "]");
74 cdromsNameToDeviceUrl.insert(name, url);
75 cdromsNameToUdi.insert(name, device.udi());
77 #if 0
78 if(cdromsNameToDeviceUrl.empty()) {
79 cdromsNameToDeviceUrl.insert(QString("Generic CDROM []"), KUrl::fromPath(wm_drive_default_device()));
81 #endif
84 static QMap<QString, KUrl> &getListOfCdromDevicesNamesAndUrl()
86 if(cdromsNameToDeviceUrl.empty())
87 refreshListOfCdromDevices();
89 return cdromsNameToDeviceUrl;
92 static QMap<QString, QString> &getListOfCdromDevicesNamesAndUdi()
94 if(cdromsNameToUdi.empty())
95 refreshListOfCdromDevices();
97 return cdromsNameToUdi;
100 QString KCompactDisc::urlToDevice(const KUrl& deviceUrl)
102 if(deviceUrl.protocol() == "media" || deviceUrl.protocol() == "system") {
103 kDebug() << "Asking mediamanager for " << deviceUrl.fileName();
105 QDBusInterface mediamanager( "org.kde.kded", "/modules/mediamanager", "org.kde.MediaManager" );
106 QDBusReply<QStringList> reply = mediamanager.call("properties", deviceUrl.fileName());
108 QStringList properties = reply;
109 if(!reply.isValid() || properties.count() < 6) {
110 kError() << "Invalid reply from mediamanager" << endl;
111 return deviceUrl.path();
112 } else {
113 kDebug() << "Reply from mediamanager " << properties[5];
114 return properties[5];
116 } else if(deviceUrl.protocol() == "file") {
117 return deviceUrl.path();
118 } else {
119 return QString();
123 const QStringList KCompactDisc::audioSystems()
125 QStringList list;
127 list << "phonon"
128 #ifdef USE_ARTS
129 << "arts"
130 #endif
131 #if defined(HAVE_LIBASOUND2)
132 << "alsa"
133 #endif
134 #if defined(sun) || defined(__sun__)
135 << "sun"
136 #endif
138 return list;
141 const QStringList KCompactDisc::cdromDeviceNames()
143 return getListOfCdromDevicesNamesAndUrl().keys();
146 const QString KCompactDisc::defaultCdromDeviceName()
148 return getListOfCdromDevicesNamesAndUrl().keys().at(0);
151 const KUrl KCompactDisc::defaultCdromDeviceUrl()
153 return getListOfCdromDevicesNamesAndUrl().values().at(0);
156 const KUrl KCompactDisc::cdromDeviceUrl(const QString &cdromDeviceName)
158 return getListOfCdromDevicesNamesAndUrl().value(cdromDeviceName, KCompactDisc::defaultCdromDeviceUrl());
161 const QString KCompactDisc::defaultCdromDeviceUdi()
163 return getListOfCdromDevicesNamesAndUdi().values().at(0);
166 const QString KCompactDisc::cdromDeviceUdi(const QString &cdromDeviceName)
168 return getListOfCdromDevicesNamesAndUdi().value(cdromDeviceName, KCompactDisc::defaultCdromDeviceUdi());
171 KCompactDisc::KCompactDisc(InformationMode infoMode) :
172 d_ptr(new KCompactDiscPrivate(this, KCompactDisc::defaultCdromDeviceName()))
174 Q_D(KCompactDisc);
175 dummy_ptr = d;
176 d->m_infoMode = infoMode;
179 KCompactDisc::~KCompactDisc()
181 stop();
184 const QString &KCompactDisc::deviceVendor()
186 Q_D(KCompactDisc);
187 return d->m_deviceVendor;
190 const QString &KCompactDisc::deviceModel()
192 Q_D(KCompactDisc);
193 return d->m_deviceModel;
196 const QString &KCompactDisc::deviceRevision()
198 Q_D(KCompactDisc);
199 return d->m_deviceRevision;
202 const QString &KCompactDisc::deviceName()
204 Q_D(KCompactDisc);
205 return d->m_deviceName;
208 const KUrl KCompactDisc::deviceUrl()
210 Q_D(KCompactDisc);
211 return KCompactDisc::cdromDeviceUrl(d->m_deviceName);
214 unsigned KCompactDisc::discId()
216 Q_D(KCompactDisc);
217 return d->m_discId;
220 const QList<unsigned> &KCompactDisc::discSignature()
222 Q_D(KCompactDisc);
223 return d->m_trackStartFrames;
226 const QString &KCompactDisc::discArtist()
228 Q_D(KCompactDisc);
229 if (!d->m_tracks)
230 return ___null;
231 return d->m_trackArtists[0];
234 const QString &KCompactDisc::discTitle()
236 Q_D(KCompactDisc);
237 if (!d->m_tracks)
238 return ___null;
239 return d->m_trackTitles[0];
242 unsigned KCompactDisc::discLength()
244 Q_D(KCompactDisc);
245 if (!d->m_tracks)
246 return 0;
247 return d->m_discLength;
250 unsigned KCompactDisc::discPosition()
252 Q_D(KCompactDisc);
253 return d->m_discPosition;
256 KCompactDisc::DiscStatus KCompactDisc::discStatus()
258 Q_D(KCompactDisc);
259 return d->m_status;
262 QString KCompactDisc::discStatusString(KCompactDisc::DiscStatus status)
264 return KCompactDiscPrivate::discStatusI18n(status);
267 QString KCompactDisc::trackArtist()
269 Q_D(KCompactDisc);
270 return trackArtist(d->m_track);
273 QString KCompactDisc::trackArtist(unsigned track)
275 Q_D(KCompactDisc);
276 if (!track)
277 return QString();
278 return d->m_trackArtists[track];
281 QString KCompactDisc::trackTitle()
283 Q_D(KCompactDisc);
284 return trackTitle(d->m_track);
287 QString KCompactDisc::trackTitle(unsigned track)
289 Q_D(KCompactDisc);
290 if (!track)
291 return QString();
292 return d->m_trackTitles[track];
295 unsigned KCompactDisc::trackLength()
297 Q_D(KCompactDisc);
298 return trackLength(d->m_track);
301 unsigned KCompactDisc::trackLength(unsigned track)
303 Q_D(KCompactDisc);
304 if (!track)
305 return 0;
306 return d->trackLength(track);
309 unsigned KCompactDisc::track()
311 Q_D(KCompactDisc);
312 return d->m_track;
315 unsigned KCompactDisc::trackPosition()
317 Q_D(KCompactDisc);
318 return d->m_trackPosition;
321 unsigned KCompactDisc::tracks()
323 Q_D(KCompactDisc);
324 return d->m_tracks;
327 bool KCompactDisc::isPlaying()
329 Q_D(KCompactDisc);
330 return (d->m_status == KCompactDisc::Playing);
333 bool KCompactDisc::isPaused()
335 Q_D(KCompactDisc);
336 return (d->m_status == KCompactDisc::Paused);
339 bool KCompactDisc::isNoDisc()
341 Q_D(KCompactDisc);
342 return (d->m_status == KCompactDisc::NoDisc);
345 bool KCompactDisc::isAudio(unsigned track)
347 Q_D(KCompactDisc);
348 if (!track)
349 return 0;
350 return d->isTrackAudio(track);
353 void KCompactDisc::playTrack(unsigned track)
355 Q_D(KCompactDisc);
357 d->m_statusExpected = KCompactDisc::Playing;
358 d->m_trackExpectedPosition = 0;
359 d->m_seek = abs(d->m_trackExpectedPosition - trackPosition());
361 d->playTrackPosition(track, 0);
364 void KCompactDisc::playPosition(unsigned position)
366 Q_D(KCompactDisc);
368 d->m_statusExpected = Playing;
369 d->m_trackExpectedPosition = position;
370 d->m_seek = abs(d->m_trackExpectedPosition - trackPosition());
372 d->playTrackPosition(d->m_track, position);
375 void KCompactDisc::play()
377 doCommand(KCompactDisc::Play);
380 void KCompactDisc::next()
382 doCommand(KCompactDisc::Next);
385 void KCompactDisc::prev()
387 doCommand(KCompactDisc::Prev);
390 void KCompactDisc::pause()
392 doCommand(KCompactDisc::Pause);
395 void KCompactDisc::stop()
397 doCommand(KCompactDisc::Stop);
400 void KCompactDisc::eject()
402 doCommand(KCompactDisc::Eject);
405 void KCompactDisc::loop()
407 doCommand(KCompactDisc::Loop);
410 void KCompactDisc::random()
412 doCommand(KCompactDisc::Random);
415 void KCompactDisc::doCommand(KCompactDisc::DiscCommand cmd)
417 Q_D(KCompactDisc);
418 unsigned track;
420 switch(cmd) {
421 case Play:
422 if(d->m_status == KCompactDisc::Playing)
423 return;
424 next();
425 break;
427 case Next:
428 track = d->getNextTrackInPlaylist();
429 if(track)
430 playTrack(track);
431 break;
433 case Prev:
434 track = d->getPrevTrackInPlaylist();
435 if(track)
436 playTrack(track);
437 break;
439 case Pause:
440 if(d->m_status == KCompactDisc::Paused)
441 d->m_statusExpected = KCompactDisc::Playing;
442 else
443 d->m_statusExpected = KCompactDisc::Paused;
445 d->pause();
446 break;
448 case Stop:
449 d->m_statusExpected = KCompactDisc::Stopped;
450 d->stop();
451 break;
453 case Eject:
454 if(d->m_status != KCompactDisc::Ejected) {
455 if(d->m_status != KCompactDisc::Stopped) {
456 d->m_statusExpected = KCompactDisc::Ejected;
457 d->stop();
458 } else {
459 d->eject();
461 } else {
462 d->m_statusExpected = KCompactDisc::Stopped;
463 d->closetray();
465 break;
467 case Loop:
468 setLoopPlaylist(!d->m_loopPlaylist);
469 break;
471 case Random:
472 setRandomPlaylist(!d->m_randomPlaylist);
473 break;
477 void KCompactDisc::metadataLookup()
479 Q_D(KCompactDisc);
480 d->queryMetadata();
483 void KCompactDisc::setRandomPlaylist(bool random)
485 Q_D(KCompactDisc);
486 d->m_randomPlaylist = random;
487 d->make_playlist();
488 emit randomPlaylistChanged(d->m_randomPlaylist);
491 void KCompactDisc::setLoopPlaylist(bool loop)
493 Q_D(KCompactDisc);
494 d->m_loopPlaylist = loop;
495 emit loopPlaylistChanged(d->m_loopPlaylist);
498 void KCompactDisc::setAutoMetadataLookup(bool autoMetadata)
500 Q_D(KCompactDisc);
501 d->m_autoMetadata = autoMetadata;
502 if(d->m_autoMetadata)
503 metadataLookup();
506 bool KCompactDisc::setDevice(const QString &deviceName, unsigned volume,
507 bool digitalPlayback, const QString &audioSystem, const QString &audioDevice)
509 QString as = digitalPlayback ? audioSystem : QString("cdin");
510 QString ad = digitalPlayback ? audioDevice : QString();
511 kDebug() << "Device init: " << deviceName << ", " << as << ", " << ad;
513 if(dummy_ptr->moveInterface(deviceName, as, ad)) {
514 setVolume(volume);
515 return 1;
516 } else {
517 // Severe (OS-level) error.
518 return 0;
522 void KCompactDisc::setVolume(unsigned volume)
524 Q_D(KCompactDisc);
525 kDebug() << "change volume: " << volume;
526 d->setVolume(volume);
529 void KCompactDisc::setBalance(unsigned balance)
531 Q_D(KCompactDisc);
532 kDebug() << "change balance: " << balance;
533 d->setBalance(balance);
536 #include "kcompactdisc.moc"