diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index 38dad5a55..f3b7d4a0b 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -72,7 +73,8 @@ RipCD::RipCD(QWidget* parent) queued_(0), finished_success_(0), finished_failed_(0), - ui_(new Ui_RipCD) { + ui_(new Ui_RipCD), + cancel_requested_(false) { cdio_ = cdio_open(NULL, DRIVER_UNKNOWN); // Init ui_->setupUi(this); @@ -144,9 +146,7 @@ RipCD::RipCD(QWidget* parent) ui_->progress_bar->setMaximum(100); } -RipCD::~RipCD() { - cdio_destroy(cdio_); -} +RipCD::~RipCD() { cdio_destroy(cdio_); } /* * WAV Header documentation @@ -232,6 +232,13 @@ void RipCD::ThreadClickedRipButton() { QByteArray buffered_input_bytes(CDIO_CD_FRAMESIZE_RAW, '\0'); for (lsn_t i_cursor = i_first_lsn; i_cursor <= i_last_lsn; i_cursor++) { + { + QMutexLocker l(&mutex_); + if (cancel_requested_) { + qLog(Debug) << "CD ripping canceled."; + return; + } + } if (cdio_read_audio_sector(cdio_, buffered_input_bytes.data(), i_cursor) == DRIVER_OP_SUCCESS) { destination_file->write(buffered_input_bytes.data(), @@ -317,6 +324,10 @@ void RipCD::ClickedRipButton() { return; } SetWorking(true); + { + QMutexLocker l(&mutex_); + cancel_requested_ = false; + } QtConcurrent::run(this, &RipCD::ThreadClickedRipButton); } @@ -401,6 +412,10 @@ void RipCD::AddDestinationDirectory(QString dir) { } void RipCD::Cancel() { + { + QMutexLocker l(&mutex_); + cancel_requested_ = true; + } ui_->progress_bar->setValue(0); transcoder_->Cancel(); RemoveTemporaryDirectory(); diff --git a/src/ui/ripcd.h b/src/ui/ripcd.h index a27252b74..9b1a98cad 100644 --- a/src/ui/ripcd.h +++ b/src/ui/ripcd.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "ui_ripcd.h" #include @@ -62,6 +63,8 @@ class RipCD : public QDialog { QPushButton* close_button_; QPushButton* rip_button_; QString temporary_directory_; + bool cancel_requested_; + QMutex mutex_; void WriteWAVHeader(QFile* stream, int32_t i_bytecount); int NumTracksToRip();