File indexing completed on 2024-03-24 04:50:58
0001 /* 0002 * AUDEX CDDA EXTRACTOR 0003 * 0004 * SPDX-FileCopyrightText: Copyright (C) 2007 Marco Nelles 0005 * <https://userbase.kde.org/Audex> 0006 * 0007 * SPDX-License-Identifier: GPL-3.0-or-later 0008 * 0009 */ 0010 0011 #include "cddadevices.h" 0012 0013 #include <QDebug> 0014 0015 CDDADevices::CDDADevices(QObject *parent) 0016 { 0017 Q_UNUSED(parent); 0018 0019 connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString &)), this, SLOT(p_solid_device_added(const QString &))); 0020 connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString &)), this, SLOT(p_solid_device_removed(const QString &))); 0021 } 0022 0023 CDDADevices::~CDDADevices() 0024 { 0025 p_clear(); 0026 } 0027 0028 const QString CDDADevices::blockDevice(const QString &udi) const 0029 { 0030 OpticalAudioDisc *disc = p_discs.value(udi, NULL); 0031 if (!disc) 0032 return QString(); 0033 0034 Solid::Device device(disc->device.parentUdi()); 0035 if (device.is<Solid::Block>()) 0036 return device.as<Solid::Block>()->device(); 0037 0038 return QString(); 0039 } 0040 0041 int CDDADevices::discCount() const 0042 { 0043 return p_discs.count(); 0044 } 0045 0046 void CDDADevices::scanBus() 0047 { 0048 p_clear(); 0049 0050 QList<Solid::Device> list = Solid::Device::listFromType(Solid::DeviceInterface::OpticalDisc, QString()); 0051 0052 for (int i = 0; i < list.count(); ++i) 0053 p_solid_device_added(list.value(i).udi()); 0054 } 0055 0056 void CDDADevices::eject(const QString &udi) 0057 { 0058 qDebug() << "DEBUG:" << __FILE__ << __PRETTY_FUNCTION__ << udi; 0059 OpticalAudioDisc *disc = p_discs.value(udi, NULL); 0060 if (!disc) 0061 return; 0062 0063 Solid::Device device(disc->device.parentUdi()); 0064 if (device.as<Solid::OpticalDrive>()) 0065 device.as<Solid::OpticalDrive>()->eject(); 0066 } 0067 0068 void CDDADevices::setName(const QString &udi, const QString &name) 0069 { 0070 OpticalAudioDisc *disc = p_discs.value(udi, NULL); 0071 if (!disc) 0072 return; 0073 0074 if (disc->name != name) 0075 disc->name = name; 0076 } 0077 0078 void CDDADevices::p_solid_device_added(const QString &udi) 0079 { 0080 Solid::Device device(udi); 0081 0082 qDebug() << "Device found:" << device.udi(); 0083 if (p_is_optical_audio_disc(device)) { 0084 qDebug() << "is audio."; 0085 auto *disc = new OpticalAudioDisc(); 0086 disc->name = i18n("Audio Disc"); 0087 disc->device = device; 0088 p_discs.insert(udi, disc); 0089 Q_EMIT audioDiscDetected(udi); 0090 } 0091 } 0092 0093 void CDDADevices::p_solid_device_removed(const QString &udi) 0094 { 0095 OpticalAudioDisc *disc = p_discs.value(udi, NULL); 0096 0097 if (disc) { 0098 qDebug() << "Optical audio disc removed:" << udi; 0099 delete disc; 0100 p_discs.remove(udi); 0101 Q_EMIT audioDiscRemoved(udi); 0102 } 0103 } 0104 0105 bool CDDADevices::p_is_optical_audio_disc(const Solid::Device &device) const 0106 { 0107 if (device.is<Solid::OpticalDisc>()) 0108 return (device.as<Solid::OpticalDisc>()->availableContent() & Solid::OpticalDisc::Audio); 0109 0110 return false; 0111 } 0112 0113 void CDDADevices::p_clear() 0114 { 0115 QHash<QString, OpticalAudioDisc *>::const_iterator i = p_discs.constBegin(); 0116 while (i != p_discs.constEnd()) { 0117 if (i.value()) 0118 delete i.value(); 0119 ++i; 0120 } 0121 p_discs.clear(); 0122 }