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(const Solid::Device &device, Solid::Device::listFromType(Solid::DeviceInterface::OpticalDrive)) {
48
kDebug() << device.udi().toLatin1().constData();
49
const Solid::Block *b = device.as<Solid::Block>();
55
const Solid::OpticalDrive *o = device.as<Solid::OpticalDrive>();
56
Solid::OpticalDrive::MediumTypes mediumType = o->supportedMedia();
58
url = KUrl::fromPath(QLatin1String( b->device().toLatin1() ));
59
//TODO translate them ?
60
if(mediumType < Solid::OpticalDrive::Cdrw) {
61
type = QLatin1String( "CD-ROM" );
62
} else if(mediumType < Solid::OpticalDrive::Dvd) {
63
type = QLatin1String( "CDRW" );
64
} else if(mediumType < Solid::OpticalDrive::Dvdr) {
65
type = QLatin1String( "DVD-ROM" );
66
} else if(mediumType < Solid::OpticalDrive::Bd) {
67
type = QLatin1String( "DVDRW" );
68
} else if(mediumType < Solid::OpticalDrive::HdDvd) {
69
type = QLatin1String( "Blu-ray" );
71
type = QLatin1String( "High Density DVD" );
74
if(!device.vendor().isEmpty())
75
name = (QLatin1Char('[') + type + QLatin1String( " - " ) + device.vendor() + QLatin1String( " - " ) + device.product() + QLatin1Char( ']' ));
77
name = (QLatin1Char('[') + type + QLatin1String( " - unknown vendor - " ) + device.product() + QLatin1Char( ']' ));
79
cdromsNameToDeviceUrl.insert(name, url);
80
cdromsNameToUdi.insert(name, device.udi());
83
if(cdromsNameToDeviceUrl.empty()) {
84
cdromsNameToDeviceUrl.insert(QString("Generic CDROM []"), KUrl::fromPath(wm_drive_default_device()));
89
static QMap<QString, KUrl> &getListOfCdromDevicesNamesAndUrl()
91
if(cdromsNameToDeviceUrl.empty())
92
refreshListOfCdromDevices();
94
return cdromsNameToDeviceUrl;
97
static QMap<QString, QString> &getListOfCdromDevicesNamesAndUdi()
99
if(cdromsNameToUdi.empty())
100
refreshListOfCdromDevices();
102
return cdromsNameToUdi;
105
QString KCompactDisc::urlToDevice(const KUrl& deviceUrl)
107
if(deviceUrl.protocol() == QLatin1String( "media" ) || deviceUrl.protocol() == QLatin1String( "system" )) {
108
kDebug() << "Asking mediamanager for " << deviceUrl.fileName();
110
QDBusInterface mediamanager( QLatin1String( "org.kde.kded" ), QLatin1String( "/modules/mediamanager" ), QLatin1String( "org.kde.MediaManager" ) );
111
QDBusReply<QStringList> reply = mediamanager.call(QLatin1String( "properties" ), deviceUrl.fileName());
113
QStringList properties = reply;
114
if(!reply.isValid() || properties.count() < 6) {
115
kError() << "Invalid reply from mediamanager" << endl;
116
return deviceUrl.path();
118
kDebug() << "Reply from mediamanager " << properties[5];
119
return properties[5];
121
} else if(deviceUrl.protocol() == QLatin1String( "file" )) {
122
return deviceUrl.path();
128
const QStringList KCompactDisc::audioSystems()
132
list << QLatin1String( "phonon" )
133
#if defined(HAVE_LIBASOUND2)
134
<< QLatin1String( "alsa" )
136
#if defined(sun) || defined(__sun__)
137
<< QLatin1String( "sun" )
143
const QStringList KCompactDisc::cdromDeviceNames()
145
return getListOfCdromDevicesNamesAndUrl().keys();
148
const QString KCompactDisc::defaultCdromDeviceName()
150
const QStringList names = getListOfCdromDevicesNamesAndUrl().keys();
151
if (!names.isEmpty()) return names[0];
152
else return QString();
155
const KUrl KCompactDisc::defaultCdromDeviceUrl()
157
const QList<KUrl> urls = getListOfCdromDevicesNamesAndUrl().values();
158
if (!urls.isEmpty()) return urls[0];
162
const KUrl KCompactDisc::cdromDeviceUrl(const QString &cdromDeviceName)
164
const QMap<QString, KUrl> &nameUrls = getListOfCdromDevicesNamesAndUrl();
165
KUrl result = nameUrls.value(cdromDeviceName);
166
if (!result.isValid())
168
const KUrl passedUrl(cdromDeviceName);
169
foreach(const KUrl &url, nameUrls)
171
if (url == passedUrl)
176
result = KCompactDisc::defaultCdromDeviceUrl();
181
const QString KCompactDisc::defaultCdromDeviceUdi()
183
const QStringList udis = getListOfCdromDevicesNamesAndUdi().values();
184
if (!udis.isEmpty()) return udis[0];
185
else return QString();
188
const QString KCompactDisc::cdromDeviceUdi(const QString &cdromDeviceName)
190
return getListOfCdromDevicesNamesAndUdi().value(cdromDeviceName, KCompactDisc::defaultCdromDeviceUdi());
193
KCompactDisc::KCompactDisc(InformationMode infoMode) :
194
d_ptr(new KCompactDiscPrivate(this, KCompactDisc::defaultCdromDeviceName()))
197
d->m_infoMode = infoMode;
200
KCompactDisc::~KCompactDisc()
206
const QString &KCompactDisc::deviceVendor()
209
return d->m_deviceVendor;
212
const QString &KCompactDisc::deviceModel()
215
return d->m_deviceModel;
218
const QString &KCompactDisc::deviceRevision()
221
return d->m_deviceRevision;
224
const QString &KCompactDisc::deviceName()
227
return d->m_deviceName;
230
const KUrl KCompactDisc::deviceUrl()
233
return KCompactDisc::cdromDeviceUrl(d->m_deviceName);
236
unsigned KCompactDisc::discId()
242
const QList<unsigned> &KCompactDisc::discSignature()
245
return d->m_trackStartFrames;
248
const QString &KCompactDisc::discArtist()
253
return d->m_trackArtists[0];
256
const QString &KCompactDisc::discTitle()
261
return d->m_trackTitles[0];
264
unsigned KCompactDisc::discLength()
269
return d->m_discLength;
272
unsigned KCompactDisc::discPosition()
275
return d->m_discPosition;
278
KCompactDisc::DiscStatus KCompactDisc::discStatus()
284
QString KCompactDisc::discStatusString(KCompactDisc::DiscStatus status)
286
return KCompactDiscPrivate::discStatusI18n(status);
289
QString KCompactDisc::trackArtist()
292
return trackArtist(d->m_track);
295
QString KCompactDisc::trackArtist(unsigned track)
300
return d->m_trackArtists[track];
303
QString KCompactDisc::trackTitle()
306
return trackTitle(d->m_track);
309
QString KCompactDisc::trackTitle(unsigned track)
314
return d->m_trackTitles[track];
317
unsigned KCompactDisc::trackLength()
320
return trackLength(d->m_track);
323
unsigned KCompactDisc::trackLength(unsigned track)
328
return d->trackLength(track);
331
unsigned KCompactDisc::track()
337
unsigned KCompactDisc::trackPosition()
340
return d->m_trackPosition;
343
unsigned KCompactDisc::tracks()
349
bool KCompactDisc::isPlaying()
352
return (d->m_status == KCompactDisc::Playing);
355
bool KCompactDisc::isPaused()
358
return (d->m_status == KCompactDisc::Paused);
361
bool KCompactDisc::isNoDisc()
364
return (d->m_status == KCompactDisc::NoDisc);
367
bool KCompactDisc::isAudio(unsigned track)
372
return d->isTrackAudio(track);
375
void KCompactDisc::playTrack(unsigned track)
379
d->m_statusExpected = KCompactDisc::Playing;
380
d->m_trackExpectedPosition = 0;
381
d->m_seek = abs( (double) d->m_trackExpectedPosition - trackPosition());
383
d->playTrackPosition(track, 0);
386
void KCompactDisc::playPosition(unsigned position)
390
d->m_statusExpected = Playing;
391
d->m_trackExpectedPosition = position;
392
d->m_seek = abs( (double) d->m_trackExpectedPosition - trackPosition());
394
d->playTrackPosition(d->m_track, position);
397
void KCompactDisc::play()
399
doCommand(KCompactDisc::Play);
402
void KCompactDisc::next()
404
doCommand(KCompactDisc::Next);
407
void KCompactDisc::prev()
409
doCommand(KCompactDisc::Prev);
412
void KCompactDisc::pause()
414
doCommand(KCompactDisc::Pause);
417
void KCompactDisc::stop()
419
doCommand(KCompactDisc::Stop);
422
void KCompactDisc::eject()
424
doCommand(KCompactDisc::Eject);
427
void KCompactDisc::loop()
429
doCommand(KCompactDisc::Loop);
432
void KCompactDisc::random()
434
doCommand(KCompactDisc::Random);
437
void KCompactDisc::doCommand(KCompactDisc::DiscCommand cmd)
444
if(d->m_status == KCompactDisc::Playing)
450
track = d->getNextTrackInPlaylist();
456
track = d->getPrevTrackInPlaylist();
462
if(d->m_status == KCompactDisc::Paused)
463
d->m_statusExpected = KCompactDisc::Playing;
465
d->m_statusExpected = KCompactDisc::Paused;
471
d->m_statusExpected = KCompactDisc::Stopped;
476
if(d->m_status != KCompactDisc::Ejected) {
477
if(d->m_status != KCompactDisc::Stopped) {
478
d->m_statusExpected = KCompactDisc::Ejected;
484
d->m_statusExpected = KCompactDisc::Stopped;
490
setLoopPlaylist(!d->m_loopPlaylist);
494
setRandomPlaylist(!d->m_randomPlaylist);
499
void KCompactDisc::metadataLookup()
505
void KCompactDisc::setRandomPlaylist(bool random)
508
d->m_randomPlaylist = random;
510
emit randomPlaylistChanged(d->m_randomPlaylist);
513
void KCompactDisc::setLoopPlaylist(bool loop)
516
d->m_loopPlaylist = loop;
517
emit loopPlaylistChanged(d->m_loopPlaylist);
520
void KCompactDisc::setAutoMetadataLookup(bool autoMetadata)
523
d->m_autoMetadata = autoMetadata;
524
if(d->m_autoMetadata)
528
bool KCompactDisc::setDevice(const QString &deviceName, unsigned volume,
529
bool digitalPlayback, const QString &audioSystem, const QString &audioDevice)
531
const QString as = digitalPlayback ? audioSystem : QLatin1String("cdin");
532
const QString ad = digitalPlayback ? audioDevice : QString();
533
kDebug() << "Device init: " << deviceName << ", " << as << ", " << ad;
535
if(d_ptr->moveInterface(deviceName, as, ad)) {
539
// Severe (OS-level) error.
544
void KCompactDisc::setVolume(unsigned volume)
547
kDebug() << "change volume: " << volume;
548
d->setVolume(volume);
551
void KCompactDisc::setBalance(unsigned balance)
554
kDebug() << "change balance: " << balance;
555
d->setBalance(balance);
558
#include "kcompactdisc.moc"