File indexing completed on 2024-04-21 15:36:43

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 }