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)
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"
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();
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
) {
57 } else if(mediumType
< Solid::OpticalDrive::Dvd
) {
59 } else if(mediumType
< Solid::OpticalDrive::Dvdr
) {
61 } else if(mediumType
< Solid::OpticalDrive::Bd
) {
63 } else if(mediumType
< Solid::OpticalDrive::HdDvd
) {
66 type
= "High Density DVD";
69 if(!device
.vendor().isEmpty())
70 name
= (QString('[') + type
+ " - " + device
.vendor() + " - " + device
.product() + "]");
72 name
= (QString('[') + type
+ " - unknown vendor - " + device
.product() + "]");
74 cdromsNameToDeviceUrl
.insert(name
, url
);
75 cdromsNameToUdi
.insert(name
, device
.udi());
78 if(cdromsNameToDeviceUrl
.empty()) {
79 cdromsNameToDeviceUrl
.insert(QString("Generic CDROM []"), KUrl::fromPath(wm_drive_default_device()));
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();
113 kDebug() << "Reply from mediamanager " << properties
[5];
114 return properties
[5];
116 } else if(deviceUrl
.protocol() == "file") {
117 return deviceUrl
.path();
123 const QStringList
KCompactDisc::audioSystems()
131 #if defined(HAVE_LIBASOUND2)
134 #if defined(sun) || defined(__sun__)
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()))
176 d
->m_infoMode
= infoMode
;
179 KCompactDisc::~KCompactDisc()
184 const QString
&KCompactDisc::deviceVendor()
187 return d
->m_deviceVendor
;
190 const QString
&KCompactDisc::deviceModel()
193 return d
->m_deviceModel
;
196 const QString
&KCompactDisc::deviceRevision()
199 return d
->m_deviceRevision
;
202 const QString
&KCompactDisc::deviceName()
205 return d
->m_deviceName
;
208 const KUrl
KCompactDisc::deviceUrl()
211 return KCompactDisc::cdromDeviceUrl(d
->m_deviceName
);
214 unsigned KCompactDisc::discId()
220 const QList
<unsigned> &KCompactDisc::discSignature()
223 return d
->m_trackStartFrames
;
226 const QString
&KCompactDisc::discArtist()
231 return d
->m_trackArtists
[0];
234 const QString
&KCompactDisc::discTitle()
239 return d
->m_trackTitles
[0];
242 unsigned KCompactDisc::discLength()
247 return d
->m_discLength
;
250 unsigned KCompactDisc::discPosition()
253 return d
->m_discPosition
;
256 KCompactDisc::DiscStatus
KCompactDisc::discStatus()
262 QString
KCompactDisc::discStatusString(KCompactDisc::DiscStatus status
)
264 return KCompactDiscPrivate::discStatusI18n(status
);
267 QString
KCompactDisc::trackArtist()
270 return trackArtist(d
->m_track
);
273 QString
KCompactDisc::trackArtist(unsigned track
)
278 return d
->m_trackArtists
[track
];
281 QString
KCompactDisc::trackTitle()
284 return trackTitle(d
->m_track
);
287 QString
KCompactDisc::trackTitle(unsigned track
)
292 return d
->m_trackTitles
[track
];
295 unsigned KCompactDisc::trackLength()
298 return trackLength(d
->m_track
);
301 unsigned KCompactDisc::trackLength(unsigned track
)
306 return d
->trackLength(track
);
309 unsigned KCompactDisc::track()
315 unsigned KCompactDisc::trackPosition()
318 return d
->m_trackPosition
;
321 unsigned KCompactDisc::tracks()
327 bool KCompactDisc::isPlaying()
330 return (d
->m_status
== KCompactDisc::Playing
);
333 bool KCompactDisc::isPaused()
336 return (d
->m_status
== KCompactDisc::Paused
);
339 bool KCompactDisc::isNoDisc()
342 return (d
->m_status
== KCompactDisc::NoDisc
);
345 bool KCompactDisc::isAudio(unsigned track
)
350 return d
->isTrackAudio(track
);
353 void KCompactDisc::playTrack(unsigned track
)
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
)
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
)
422 if(d
->m_status
== KCompactDisc::Playing
)
428 track
= d
->getNextTrackInPlaylist();
434 track
= d
->getPrevTrackInPlaylist();
440 if(d
->m_status
== KCompactDisc::Paused
)
441 d
->m_statusExpected
= KCompactDisc::Playing
;
443 d
->m_statusExpected
= KCompactDisc::Paused
;
449 d
->m_statusExpected
= KCompactDisc::Stopped
;
454 if(d
->m_status
!= KCompactDisc::Ejected
) {
455 if(d
->m_status
!= KCompactDisc::Stopped
) {
456 d
->m_statusExpected
= KCompactDisc::Ejected
;
462 d
->m_statusExpected
= KCompactDisc::Stopped
;
468 setLoopPlaylist(!d
->m_loopPlaylist
);
472 setRandomPlaylist(!d
->m_randomPlaylist
);
477 void KCompactDisc::metadataLookup()
483 void KCompactDisc::setRandomPlaylist(bool random
)
486 d
->m_randomPlaylist
= random
;
488 emit
randomPlaylistChanged(d
->m_randomPlaylist
);
491 void KCompactDisc::setLoopPlaylist(bool loop
)
494 d
->m_loopPlaylist
= loop
;
495 emit
loopPlaylistChanged(d
->m_loopPlaylist
);
498 void KCompactDisc::setAutoMetadataLookup(bool autoMetadata
)
501 d
->m_autoMetadata
= autoMetadata
;
502 if(d
->m_autoMetadata
)
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
)) {
517 // Severe (OS-level) error.
522 void KCompactDisc::setVolume(unsigned volume
)
525 kDebug() << "change volume: " << volume
;
526 d
->setVolume(volume
);
529 void KCompactDisc::setBalance(unsigned balance
)
532 kDebug() << "change balance: " << balance
;
533 d
->setBalance(balance
);
536 #include "kcompactdisc.moc"