From 1b00e91fdfa3b7a712da0bdd7da57e326e77d776 Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Sun, 2 Feb 2014 18:17:33 +0100 Subject: [PATCH 1/5] Add the ability to cancel a running CD rip. --- src/ui/ripcd.cpp | 6 ++++++ src/ui/ripcd.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index 60f0f665e..82e1d887a 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -254,6 +254,10 @@ 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++) { + 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(), buffered_input_bytes.size()); } else { @@ -328,6 +332,7 @@ void RipCD::ThreadedTranscoding() { void RipCD::ClickedRipButton() { SetWorking(true); + cancel_requested_ = false; QtConcurrent::run(this, &RipCD::ThreadClickedRipButton); } @@ -413,6 +418,7 @@ void RipCD::AddDestinationDirectory(QString dir) { } void RipCD::Cancel() { + cancel_requested_ = true; transcoder_->Cancel(); RemoveTemporaryDirectory(); SetWorking(false); diff --git a/src/ui/ripcd.h b/src/ui/ripcd.h index 6f134639f..0de1d7111 100644 --- a/src/ui/ripcd.h +++ b/src/ui/ripcd.h @@ -58,6 +58,7 @@ class RipCD: public QDialog { QPushButton* close_button_; QPushButton* rip_button_; QString temporary_directory_; + bool cancel_requested_; void WriteWAVHeader(QFile *stream, int32_t i_bytecount); int NumTracksToRip(); From 6235e69ac45f22685f81dc21de0dd40f60153946 Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Mon, 12 May 2014 13:54:50 +0200 Subject: [PATCH 2/5] Run 'make format' --- src/ui/ripcd.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index 0747e73b9..b7fcf219f 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -144,9 +144,7 @@ RipCD::RipCD(QWidget* parent) ui_->progress_bar->setMaximum(100); } -RipCD::~RipCD() { - cdio_destroy(cdio_); -} +RipCD::~RipCD() { cdio_destroy(cdio_); } /* * WAV Header documentation From 919f7cbe94cd3ba76ffcf32d8ae765b35261cd09 Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Mon, 12 May 2014 16:14:33 +0200 Subject: [PATCH 3/5] Add a mutex to protect a variable shared between threads. --- src/ui/ripcd.cpp | 4 ++++ src/ui/ripcd.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index b7fcf219f..e7208a0ac 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -230,6 +231,7 @@ 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; @@ -319,6 +321,7 @@ void RipCD::ClickedRipButton() { return; } SetWorking(true); + QMutexLocker l(&mutex_); cancel_requested_ = false; QtConcurrent::run(this, &RipCD::ThreadClickedRipButton); } @@ -404,6 +407,7 @@ void RipCD::AddDestinationDirectory(QString dir) { } void RipCD::Cancel() { + QMutexLocker l(&mutex_); cancel_requested_ = true; ui_->progress_bar->setValue(0); transcoder_->Cancel(); diff --git a/src/ui/ripcd.h b/src/ui/ripcd.h index 05ff6ba47..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 @@ -63,6 +64,7 @@ class RipCD : public QDialog { QPushButton* rip_button_; QString temporary_directory_; bool cancel_requested_; + QMutex mutex_; void WriteWAVHeader(QFile* stream, int32_t i_bytecount); int NumTracksToRip(); From 08f5af3320f823ae3555ca2acaf48f143245a3da Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Mon, 12 May 2014 17:24:35 +0200 Subject: [PATCH 4/5] Give the mutex lockers a tighter scope. --- src/ui/ripcd.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index e7208a0ac..cd96aa57d 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -231,10 +231,12 @@ 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; + { + 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) { @@ -321,8 +323,10 @@ void RipCD::ClickedRipButton() { return; } SetWorking(true); - QMutexLocker l(&mutex_); - cancel_requested_ = false; + { + QMutexLocker l(&mutex_); + cancel_requested_ = false; + } QtConcurrent::run(this, &RipCD::ThreadClickedRipButton); } @@ -407,8 +411,10 @@ void RipCD::AddDestinationDirectory(QString dir) { } void RipCD::Cancel() { - QMutexLocker l(&mutex_); - cancel_requested_ = true; + { + QMutexLocker l(&mutex_); + cancel_requested_ = true; + } ui_->progress_bar->setValue(0); transcoder_->Cancel(); RemoveTemporaryDirectory(); From bbd83344b80554f5fdfeaf8f2cc748c92acbe012 Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Mon, 12 May 2014 17:40:41 +0200 Subject: [PATCH 5/5] Initialise cancel_requested_ to false in the constructor's initialisation list. --- src/ui/ripcd.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index cd96aa57d..f3b7d4a0b 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -73,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);