Merge pull request #4340 from paperbagcorner/ripcd-cancel
Fix the cancel functionality in the CD ripper
This commit is contained in:
commit
30581703d4
|
@ -31,6 +31,7 @@
|
||||||
#include <QFrame>
|
#include <QFrame>
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QMutexLocker>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
#include <QtConcurrentRun>
|
#include <QtConcurrentRun>
|
||||||
#include <cdio/cdio.h>
|
#include <cdio/cdio.h>
|
||||||
|
@ -72,7 +73,8 @@ RipCD::RipCD(QWidget* parent)
|
||||||
queued_(0),
|
queued_(0),
|
||||||
finished_success_(0),
|
finished_success_(0),
|
||||||
finished_failed_(0),
|
finished_failed_(0),
|
||||||
ui_(new Ui_RipCD) {
|
ui_(new Ui_RipCD),
|
||||||
|
cancel_requested_(false) {
|
||||||
cdio_ = cdio_open(NULL, DRIVER_UNKNOWN);
|
cdio_ = cdio_open(NULL, DRIVER_UNKNOWN);
|
||||||
// Init
|
// Init
|
||||||
ui_->setupUi(this);
|
ui_->setupUi(this);
|
||||||
|
@ -144,9 +146,7 @@ RipCD::RipCD(QWidget* parent)
|
||||||
ui_->progress_bar->setMaximum(100);
|
ui_->progress_bar->setMaximum(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
RipCD::~RipCD() {
|
RipCD::~RipCD() { cdio_destroy(cdio_); }
|
||||||
cdio_destroy(cdio_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* WAV Header documentation
|
* WAV Header documentation
|
||||||
|
@ -232,6 +232,13 @@ void RipCD::ThreadClickedRipButton() {
|
||||||
|
|
||||||
QByteArray buffered_input_bytes(CDIO_CD_FRAMESIZE_RAW, '\0');
|
QByteArray buffered_input_bytes(CDIO_CD_FRAMESIZE_RAW, '\0');
|
||||||
for (lsn_t i_cursor = i_first_lsn; i_cursor <= i_last_lsn; i_cursor++) {
|
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(),
|
if (cdio_read_audio_sector(cdio_, buffered_input_bytes.data(),
|
||||||
i_cursor) == DRIVER_OP_SUCCESS) {
|
i_cursor) == DRIVER_OP_SUCCESS) {
|
||||||
destination_file->write(buffered_input_bytes.data(),
|
destination_file->write(buffered_input_bytes.data(),
|
||||||
|
@ -317,6 +324,10 @@ void RipCD::ClickedRipButton() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SetWorking(true);
|
SetWorking(true);
|
||||||
|
{
|
||||||
|
QMutexLocker l(&mutex_);
|
||||||
|
cancel_requested_ = false;
|
||||||
|
}
|
||||||
QtConcurrent::run(this, &RipCD::ThreadClickedRipButton);
|
QtConcurrent::run(this, &RipCD::ThreadClickedRipButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,6 +412,10 @@ void RipCD::AddDestinationDirectory(QString dir) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RipCD::Cancel() {
|
void RipCD::Cancel() {
|
||||||
|
{
|
||||||
|
QMutexLocker l(&mutex_);
|
||||||
|
cancel_requested_ = true;
|
||||||
|
}
|
||||||
ui_->progress_bar->setValue(0);
|
ui_->progress_bar->setValue(0);
|
||||||
transcoder_->Cancel();
|
transcoder_->Cancel();
|
||||||
RemoveTemporaryDirectory();
|
RemoveTemporaryDirectory();
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QMutex>
|
||||||
#include <cdio/cdio.h>
|
#include <cdio/cdio.h>
|
||||||
#include "ui_ripcd.h"
|
#include "ui_ripcd.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -62,6 +63,8 @@ class RipCD : public QDialog {
|
||||||
QPushButton* close_button_;
|
QPushButton* close_button_;
|
||||||
QPushButton* rip_button_;
|
QPushButton* rip_button_;
|
||||||
QString temporary_directory_;
|
QString temporary_directory_;
|
||||||
|
bool cancel_requested_;
|
||||||
|
QMutex mutex_;
|
||||||
|
|
||||||
void WriteWAVHeader(QFile* stream, int32_t i_bytecount);
|
void WriteWAVHeader(QFile* stream, int32_t i_bytecount);
|
||||||
int NumTracksToRip();
|
int NumTracksToRip();
|
||||||
|
|
Loading…
Reference in New Issue