Load the audio cd in a separate thread

This commit is contained in:
Mattias Andersson 2018-07-05 13:03:45 +02:00 committed by John Maguire
parent 4458d45200
commit 84f1b7bae0
2 changed files with 22 additions and 8 deletions

View File

@ -15,6 +15,8 @@
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QtConcurrentRun>
#include <gst/gst.h>
#include <gst/tag/tag.h>
@ -27,7 +29,9 @@ CddaSongLoader::CddaSongLoader(const QUrl& url, QObject* parent)
: QObject(parent),
url_(url),
cdda_(nullptr),
cdio_(nullptr) {}
cdio_(nullptr) {
connect(this, SIGNAL(MusicBrainzDiscIdLoaded(const QString&)), SLOT(LoadAudioCDTags(const QString&)));
}
CddaSongLoader::~CddaSongLoader() {
if (cdio_) cdio_destroy(cdio_);
@ -42,6 +46,9 @@ QUrl CddaSongLoader::GetUrlFromTrack(int track_number) const {
}
void CddaSongLoader::LoadSongs() {
QtConcurrent::run(this, &CddaSongLoader::LoadSongsFromCdda);
}
void CddaSongLoader::LoadSongsFromCdda() {
QMutexLocker locker(&mutex_load_);
cdio_ = cdio_open(url_.path().toLocal8Bit().constData(), DRIVER_DEVICE);
if (cdio_ == nullptr) {
@ -101,7 +108,6 @@ void CddaSongLoader::LoadSongs() {
}
emit SongsLoaded(songs);
gst_tag_register_musicbrainz_tags();
GstElement* pipeline = gst_pipeline_new("pipeline");
@ -157,13 +163,8 @@ void CddaSongLoader::LoadSongs() {
&string_mb)) {
QString musicbrainz_discid(string_mb);
qLog(Info) << "MusicBrainz discid: " << musicbrainz_discid;
emit MusicBrainzDiscIdLoaded(musicbrainz_discid);
MusicBrainzClient* musicbrainz_client = new MusicBrainzClient;
connect(musicbrainz_client, SIGNAL(Finished(const QString&, const QString&,
MusicBrainzClient::ResultList)),
SLOT(AudioCDTagsLoaded(const QString&, const QString&,
MusicBrainzClient::ResultList)));
musicbrainz_client->StartDiscIdRequest(musicbrainz_discid);
g_free(string_mb);
gst_message_unref(msg_tag);
gst_tag_list_free(tags);
@ -175,6 +176,16 @@ void CddaSongLoader::LoadSongs() {
gst_object_unref(pipeline);
}
void CddaSongLoader::LoadAudioCDTags(const QString& musicbrainz_discid) const {
MusicBrainzClient* musicbrainz_client = new MusicBrainzClient;
connect(musicbrainz_client, SIGNAL(Finished(const QString&, const QString&,
MusicBrainzClient::ResultList)),
SLOT(AudioCDTagsLoaded(const QString&, const QString&,
MusicBrainzClient::ResultList)));
musicbrainz_client->StartDiscIdRequest(musicbrainz_discid);
}
void CddaSongLoader::AudioCDTagsLoaded(
const QString& artist, const QString& album,
const MusicBrainzClient::ResultList& results) {

View File

@ -50,13 +50,16 @@ class CddaSongLoader : public QObject {
void SongsLoaded(const SongList& songs);
void SongsDurationLoaded(const SongList& songs);
void SongsMetadataLoaded(const SongList& songs);
void MusicBrainzDiscIdLoaded(const QString& musicbrainz_discid);
private slots:
void LoadAudioCDTags(const QString& musicbrainz_discid) const;
void AudioCDTagsLoaded(const QString& artist, const QString& album,
const MusicBrainzClient::ResultList& results);
private:
QUrl GetUrlFromTrack(int track_number) const;
void LoadSongsFromCdda();
QUrl url_;
GstElement* cdda_;