2018-02-27 18:06:05 +01:00
|
|
|
/*
|
|
|
|
* Strawberry Music Player
|
|
|
|
* This file was part of Clementine.
|
|
|
|
* Copyright 2010, David Sansome <me@davidsansome.com>
|
2021-03-20 21:14:47 +01:00
|
|
|
* Copyright 2018-2021, Jonas Kvinge <jonas@jkvinge.net>
|
2018-02-27 18:06:05 +01:00
|
|
|
*
|
|
|
|
* Strawberry is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* Strawberry is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with Strawberry. If not, see <http://www.gnu.org/licenses/>.
|
2018-08-09 18:39:44 +02:00
|
|
|
*
|
2018-02-27 18:06:05 +01:00
|
|
|
*/
|
|
|
|
|
2018-05-01 00:41:33 +02:00
|
|
|
#include <config.h>
|
2018-02-27 18:06:05 +01:00
|
|
|
|
2018-05-01 00:41:33 +02:00
|
|
|
#include <QtGlobal>
|
2018-02-27 18:06:05 +01:00
|
|
|
#include <QFileInfo>
|
2018-05-01 00:41:33 +02:00
|
|
|
#include <QByteArray>
|
|
|
|
#include <QList>
|
|
|
|
#include <QString>
|
|
|
|
#include <QStringList>
|
2020-07-20 00:57:42 +02:00
|
|
|
#include <QRegularExpression>
|
2018-05-01 00:41:33 +02:00
|
|
|
#include <QUrl>
|
2018-02-27 18:06:05 +01:00
|
|
|
|
|
|
|
// This must come after Qt includes
|
|
|
|
#include <cdio/cdio.h>
|
2018-05-01 00:41:33 +02:00
|
|
|
#include <cdio/device.h>
|
2018-02-27 18:06:05 +01:00
|
|
|
|
|
|
|
#include "cddalister.h"
|
|
|
|
#include "core/logging.h"
|
|
|
|
|
|
|
|
QStringList CddaLister::DeviceUniqueIDs() { return devices_list_; }
|
|
|
|
|
|
|
|
QVariantList CddaLister::DeviceIcons(const QString &) {
|
|
|
|
QVariantList icons;
|
2019-10-20 00:17:28 +02:00
|
|
|
icons << QString("media-optical");
|
2018-02-27 18:06:05 +01:00
|
|
|
return icons;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString CddaLister::DeviceManufacturer(const QString &id) {
|
|
|
|
|
2021-06-12 20:53:23 +02:00
|
|
|
CdIo_t *cdio = cdio_open(id.toLocal8Bit().constData(), DRIVER_DEVICE);
|
2018-02-27 18:06:05 +01:00
|
|
|
cdio_hwinfo_t cd_info;
|
|
|
|
if (cdio_get_hwinfo(cdio, &cd_info)) {
|
|
|
|
cdio_destroy(cdio);
|
|
|
|
return QString(cd_info.psz_vendor);
|
|
|
|
}
|
|
|
|
cdio_destroy(cdio);
|
|
|
|
return QString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
QString CddaLister::DeviceModel(const QString &id) {
|
|
|
|
|
2021-06-12 20:53:23 +02:00
|
|
|
CdIo_t *cdio = cdio_open(id.toLocal8Bit().constData(), DRIVER_DEVICE);
|
2018-02-27 18:06:05 +01:00
|
|
|
cdio_hwinfo_t cd_info;
|
|
|
|
if (cdio_get_hwinfo(cdio, &cd_info)) {
|
|
|
|
cdio_destroy(cdio);
|
|
|
|
return QString(cd_info.psz_model);
|
|
|
|
}
|
|
|
|
cdio_destroy(cdio);
|
|
|
|
return QString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-06-12 20:53:23 +02:00
|
|
|
quint64 CddaLister::DeviceCapacity(const QString&) { return 0; }
|
2018-02-27 18:06:05 +01:00
|
|
|
|
2021-06-12 20:53:23 +02:00
|
|
|
quint64 CddaLister::DeviceFreeSpace(const QString&) { return 0; }
|
2018-02-27 18:06:05 +01:00
|
|
|
|
2021-06-12 20:53:23 +02:00
|
|
|
QVariantMap CddaLister::DeviceHardwareInfo(const QString&) {
|
2018-02-27 18:06:05 +01:00
|
|
|
return QVariantMap();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString CddaLister::MakeFriendlyName(const QString &id) {
|
|
|
|
|
2018-03-10 13:02:56 +01:00
|
|
|
CdIo_t *cdio = cdio_open(id.toLocal8Bit().constData(), DRIVER_DEVICE);
|
2018-02-27 18:06:05 +01:00
|
|
|
cdio_hwinfo_t cd_info;
|
|
|
|
if (cdio_get_hwinfo(cdio, &cd_info)) {
|
|
|
|
cdio_destroy(cdio);
|
|
|
|
return QString(cd_info.psz_model);
|
|
|
|
}
|
|
|
|
cdio_destroy(cdio);
|
|
|
|
return QString("CD (") + id + ")";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<QUrl> CddaLister::MakeDeviceUrls(const QString &id) {
|
|
|
|
return QList<QUrl>() << QUrl("cdda://" + id);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CddaLister::UnmountDevice(const QString &id) {
|
|
|
|
cdio_eject_media_drive(id.toLocal8Bit().constData());
|
|
|
|
}
|
|
|
|
|
|
|
|
void CddaLister::UpdateDeviceFreeSpace(const QString&) {}
|
|
|
|
|
2018-12-29 02:57:22 +01:00
|
|
|
bool CddaLister::Init() {
|
2018-02-27 18:06:05 +01:00
|
|
|
|
|
|
|
cdio_init();
|
2018-07-01 22:26:46 +02:00
|
|
|
#ifdef Q_OS_MACOS
|
2018-02-27 18:06:05 +01:00
|
|
|
if (!cdio_have_driver(DRIVER_OSX)) {
|
2020-04-07 16:49:15 +02:00
|
|
|
qLog(Error) << "libcdio was compiled without support for macOS!";
|
2018-02-27 18:06:05 +01:00
|
|
|
}
|
|
|
|
#endif
|
2021-06-12 20:53:23 +02:00
|
|
|
char **devices = cdio_get_devices(DRIVER_DEVICE);
|
2018-02-27 18:06:05 +01:00
|
|
|
if (!devices) {
|
|
|
|
qLog(Debug) << "No CD devices found";
|
2018-12-29 02:57:22 +01:00
|
|
|
return false;
|
2018-02-27 18:06:05 +01:00
|
|
|
}
|
|
|
|
for (; *devices != nullptr; ++devices) {
|
|
|
|
QString device(*devices);
|
|
|
|
QFileInfo device_info(device);
|
|
|
|
if (device_info.isSymLink()) {
|
|
|
|
device = device_info.symLinkTarget();
|
|
|
|
}
|
2018-07-01 22:26:46 +02:00
|
|
|
#ifdef Q_OS_MACOS
|
2018-02-27 18:06:05 +01:00
|
|
|
// Every track is detected as a separate device on Darwin. The raw disk looks like /dev/rdisk1
|
2020-07-20 00:57:42 +02:00
|
|
|
if (!device.contains(QRegularExpression("^/dev/rdisk[0-9]$"))) {
|
2018-02-27 18:06:05 +01:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (!devices_list_.contains(device)) {
|
|
|
|
devices_list_ << device;
|
|
|
|
emit DeviceAdded(device);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-29 02:57:22 +01:00
|
|
|
return true;
|
|
|
|
|
2018-02-27 18:06:05 +01:00
|
|
|
}
|