CDDASongLoader: Use cdiocddasrc

This commit is contained in:
Jonas Kvinge
2025-06-22 00:39:09 +02:00
parent ffbe1ec9fd
commit 4b5370044b
2 changed files with 25 additions and 27 deletions

View File

@@ -53,8 +53,7 @@ using namespace Qt::Literals::StringLiterals;
CDDASongLoader::CDDASongLoader(const QUrl &url, QObject *parent) CDDASongLoader::CDDASongLoader(const QUrl &url, QObject *parent)
: QObject(parent), : QObject(parent),
url_(url), url_(url),
network_(make_shared<NetworkAccessManager>()), network_(make_shared<NetworkAccessManager>()) {
cdda_(nullptr) {
QObject::connect(this, &CDDASongLoader::MusicBrainzDiscIdLoaded, this, &CDDASongLoader::LoadMusicBrainzCDTags); QObject::connect(this, &CDDASongLoader::MusicBrainzDiscIdLoaded, this, &CDDASongLoader::LoadMusicBrainzCDTags);
@@ -89,36 +88,36 @@ void CDDASongLoader::LoadSongsFromCDDA() {
QMutexLocker l(&mutex_load_); QMutexLocker l(&mutex_load_);
GError *error = nullptr; GError *error = nullptr;
cdda_ = gst_element_make_from_uri(GST_URI_SRC, "cdda://", nullptr, &error); GstElement *cdda = gst_element_factory_make("cdiocddasrc", nullptr);
if (error) { if (error) {
Error(QStringLiteral("%1: %2").arg(error->code).arg(QString::fromUtf8(error->message))); Error(QStringLiteral("%1: %2").arg(error->code).arg(QString::fromUtf8(error->message)));
} }
if (!cdda_) { if (!cdda) {
Q_EMIT SongLoadingFinished(); Q_EMIT SongLoadingFinished();
return; return;
} }
if (!url_.isEmpty()) { if (!url_.isEmpty()) {
g_object_set(cdda_, "device", g_strdup(url_.path().toLocal8Bit().constData()), nullptr); g_object_set(cdda, "device", g_strdup(url_.path().toLocal8Bit().constData()), nullptr);
} }
if (g_object_class_find_property(G_OBJECT_GET_CLASS(cdda_), "paranoia-mode")) { if (g_object_class_find_property(G_OBJECT_GET_CLASS(cdda), "paranoia-mode")) {
g_object_set(cdda_, "paranoia-mode", 0, nullptr); g_object_set(cdda, "paranoia-mode", 0, nullptr);
} }
// Change the element's state to ready and paused, to be able to query it // Change the element's state to ready and paused, to be able to query it
if (gst_element_set_state(cdda_, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE) { if (gst_element_set_state(cdda, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE) {
gst_element_set_state(cdda_, GST_STATE_NULL); gst_element_set_state(cdda, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(cdda_)); gst_object_unref(GST_OBJECT(cdda));
cdda_ = nullptr; cdda = nullptr;
Error(tr("Error while setting CDDA device to ready state.")); Error(tr("Error while setting CDDA device to ready state."));
Q_EMIT SongLoadingFinished(); Q_EMIT SongLoadingFinished();
return; return;
} }
if (gst_element_set_state(cdda_, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) { if (gst_element_set_state(cdda, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) {
gst_element_set_state(cdda_, GST_STATE_NULL); gst_element_set_state(cdda, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(cdda_)); gst_object_unref(GST_OBJECT(cdda));
cdda_ = nullptr; cdda = nullptr;
Error(tr("Error while setting CDDA device to pause state.")); Error(tr("Error while setting CDDA device to pause state."));
Q_EMIT SongLoadingFinished(); Q_EMIT SongLoadingFinished();
return; return;
@@ -128,10 +127,10 @@ void CDDASongLoader::LoadSongsFromCDDA() {
GstFormat format_track = gst_format_get_by_nick("track"); GstFormat format_track = gst_format_get_by_nick("track");
GstFormat format_duration = format_track; GstFormat format_duration = format_track;
gint64 total_tracks = 0; gint64 total_tracks = 0;
if (!gst_element_query_duration(cdda_, format_duration, &total_tracks)) { if (!gst_element_query_duration(cdda, format_duration, &total_tracks)) {
gst_element_set_state(cdda_, GST_STATE_NULL); gst_element_set_state(cdda, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(cdda_)); gst_object_unref(GST_OBJECT(cdda));
cdda_ = nullptr; cdda = nullptr;
Error(tr("Error while querying CDDA tracks.")); Error(tr("Error while querying CDDA tracks."));
Q_EMIT SongLoadingFinished(); Q_EMIT SongLoadingFinished();
return; return;
@@ -139,9 +138,9 @@ void CDDASongLoader::LoadSongsFromCDDA() {
if (format_duration != format_track) { if (format_duration != format_track) {
qLog(Error) << "Error while querying CDDA GstElement (2)."; qLog(Error) << "Error while querying CDDA GstElement (2).";
gst_element_set_state(cdda_, GST_STATE_NULL); gst_element_set_state(cdda, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(cdda_)); gst_object_unref(GST_OBJECT(cdda));
cdda_ = nullptr; cdda = nullptr;
Error(tr("Error while querying CDDA tracks.")); Error(tr("Error while querying CDDA tracks."));
Q_EMIT SongLoadingFinished(); Q_EMIT SongLoadingFinished();
return; return;
@@ -164,8 +163,8 @@ void CDDASongLoader::LoadSongsFromCDDA() {
GstElement *pipeline = gst_pipeline_new("pipeline"); GstElement *pipeline = gst_pipeline_new("pipeline");
GstElement *sink = gst_element_factory_make("fakesink", nullptr); GstElement *sink = gst_element_factory_make("fakesink", nullptr);
gst_bin_add_many(GST_BIN(pipeline), cdda_, sink, nullptr); gst_bin_add_many(GST_BIN(pipeline), cdda, sink, nullptr);
gst_element_link(cdda_, sink); gst_element_link(cdda, sink);
gst_element_set_state(pipeline, GST_STATE_READY); gst_element_set_state(pipeline, GST_STATE_READY);
gst_element_set_state(pipeline, GST_STATE_PAUSED); gst_element_set_state(pipeline, GST_STATE_PAUSED);
@@ -212,7 +211,7 @@ void CDDASongLoader::LoadSongsFromCDDA() {
}); });
gint64 track_index = 0; gint64 track_index = 0;
gst_element_query_position(cdda_, format_track, &track_index); gst_element_query_position(cdda, format_track, &track_index);
char *tag = nullptr; char *tag = nullptr;
@@ -308,7 +307,7 @@ void CDDASongLoader::LoadSongsFromCDDA() {
} }
gst_element_set_state(pipeline, GST_STATE_NULL); gst_element_set_state(pipeline, GST_STATE_NULL);
// This will also cause cdda_ to be unref'd. // This will also cause cdda to be unref'd.
gst_object_unref(pipeline); gst_object_unref(pipeline);
Q_EMIT SongsMetadataLoaded(songs.values()); Q_EMIT SongsMetadataLoaded(songs.values());

View File

@@ -74,7 +74,6 @@ class CDDASongLoader : public QObject {
private: private:
const QUrl url_; const QUrl url_;
SharedPtr<NetworkAccessManager> network_; SharedPtr<NetworkAccessManager> network_;
GstElement *cdda_;
QMutex mutex_load_; QMutex mutex_load_;
QFuture<void> loading_future_; QFuture<void> loading_future_;
}; };