Merge pull request #4171 from asiviero/master

Addressing #4165 and #4166
This commit is contained in:
John Maguire 2014-05-12 13:20:26 +02:00
commit 5fe468456a
3 changed files with 59 additions and 33 deletions

View File

@ -1857,7 +1857,7 @@ void MainWindow::OpenRipCD() {
if (!rip_cd_) { if (!rip_cd_) {
rip_cd_.reset(new RipCD); rip_cd_.reset(new RipCD);
} }
if (rip_cd_->CDIOIsValid()) { if (rip_cd_->CheckCDIOIsValid()) {
rip_cd_->show(); rip_cd_->show();
} else { } else {
QMessageBox cdio_fail(QMessageBox::Critical, tr("Error"), QMessageBox cdio_fail(QMessageBox::Critical, tr("Error"),

View File

@ -30,6 +30,7 @@
#include <QFileDialog> #include <QFileDialog>
#include <QFrame> #include <QFrame>
#include <QLineEdit> #include <QLineEdit>
#include <QMessageBox>
#include <QtDebug> #include <QtDebug>
#include <QtConcurrentRun> #include <QtConcurrentRun>
#include <cdio/cdio.h> #include <cdio/cdio.h>
@ -72,7 +73,7 @@ RipCD::RipCD(QWidget* parent)
finished_success_(0), finished_success_(0),
finished_failed_(0), finished_failed_(0),
ui_(new Ui_RipCD) { ui_(new Ui_RipCD) {
cdio_ = cdio_open(NULL, DRIVER_UNKNOWN);
// Init // Init
ui_->setupUi(this); ui_->setupUi(this);
@ -116,28 +117,6 @@ RipCD::RipCD(QWidget* parent)
setWindowTitle(tr("Rip CD")); setWindowTitle(tr("Rip CD"));
AddDestinationDirectory(QDir::homePath()); AddDestinationDirectory(QDir::homePath());
cdio_ = cdio_open(nullptr, DRIVER_UNKNOWN);
if (!cdio_) {
qLog(Error) << "Failed to read CD drive";
return;
} else {
i_tracks_ = cdio_get_num_tracks(cdio_);
ui_->tableWidget->setRowCount(i_tracks_);
for (int i = 1; i <= i_tracks_; i++) {
QCheckBox* checkbox_i = new QCheckBox(ui_->tableWidget);
checkbox_i->setCheckState(Qt::Checked);
checkboxes_.append(checkbox_i);
ui_->tableWidget->setCellWidget(i - 1, kCheckboxColumn, checkbox_i);
ui_->tableWidget->setCellWidget(i - 1, kTrackNumberColumn,
new QLabel(QString::number(i)));
QString track_title = QString("Track %1").arg(i);
QLineEdit* line_edit_track_title_i =
new QLineEdit(track_title, ui_->tableWidget);
track_names_.append(line_edit_track_title_i);
ui_->tableWidget->setCellWidget(i - 1, kTrackTitleColumn,
line_edit_track_title_i);
}
}
// Get presets // Get presets
QList<TranscoderPreset> presets = Transcoder::GetAllPresets(); QList<TranscoderPreset> presets = Transcoder::GetAllPresets();
qSort(presets.begin(), presets.end(), ComparePresetsByName); qSort(presets.begin(), presets.end(), ComparePresetsByName);
@ -165,7 +144,9 @@ RipCD::RipCD(QWidget* parent)
ui_->progress_bar->setMaximum(100); ui_->progress_bar->setMaximum(100);
} }
RipCD::~RipCD() { delete ui_; } RipCD::~RipCD() {
cdio_destroy(cdio_);
}
/* /*
* WAV Header documentation * WAV Header documentation
@ -225,22 +206,19 @@ int RipCD::NumTracksToRip() {
} }
void RipCD::ThreadClickedRipButton() { void RipCD::ThreadClickedRipButton() {
temporary_directory_ = Utilities::MakeTempDir() + "/"; temporary_directory_ = Utilities::MakeTempDir() + "/";
finished_success_ = 0; finished_success_ = 0;
finished_failed_ = 0; finished_failed_ = 0;
ui_->progress_bar->setMaximum(NumTracksToRip() * 2 * 100); ui_->progress_bar->setMaximum(NumTracksToRip() * 2 * 100);
// Set up progress bar // Set up progress bar
emit(SignalUpdateProgress()); emit(SignalUpdateProgress());
tracks_to_rip_.clear();
for (int i = 1; i <= i_tracks_; i++) { for (int i = 1; i <= i_tracks_; i++) {
if (!checkboxes_.value(i - 1)->isChecked()) { if (!checkboxes_.value(i - 1)->isChecked()) {
continue; continue;
} }
tracks_to_rip_.append(i); tracks_to_rip_.append(i);
QString filename = temporary_directory_ + QString filename = temporary_directory_ +
ParseFileFormatString(ui_->format_filename->text(), i) + ParseFileFormatString(ui_->format_filename->text(), i) +
".wav"; ".wav";
@ -327,6 +305,17 @@ void RipCD::ThreadedTranscoding() {
} }
void RipCD::ClickedRipButton() { void RipCD::ClickedRipButton() {
if (cdio_ && cdio_get_media_changed(cdio_)) {
QMessageBox cdio_fail(QMessageBox::Critical, tr("Error Ripping CD"),
tr("Media has changed. Reloading"));
cdio_fail.exec();
if (CheckCDIOIsValid()) {
BuildTrackListTable();
} else {
ui_->tableWidget->clearContents();
}
return;
}
SetWorking(true); SetWorking(true);
QtConcurrent::run(this, &RipCD::ThreadClickedRipButton); QtConcurrent::run(this, &RipCD::ThreadClickedRipButton);
} }
@ -412,12 +401,22 @@ void RipCD::AddDestinationDirectory(QString dir) {
} }
void RipCD::Cancel() { void RipCD::Cancel() {
ui_->progress_bar->setValue(0);
transcoder_->Cancel(); transcoder_->Cancel();
RemoveTemporaryDirectory(); RemoveTemporaryDirectory();
SetWorking(false); SetWorking(false);
} }
bool RipCD::CDIOIsValid() const { return (cdio_); } bool RipCD::CheckCDIOIsValid() {
if (cdio_) {
cdio_destroy(cdio_);
}
cdio_ = cdio_open(NULL, DRIVER_UNKNOWN);
// Refresh the status of the cd media. This will prevent unnecessary
// rebuilds of the track list table.
cdio_get_media_changed(cdio_);
return cdio_;
}
void RipCD::SetWorking(bool working) { void RipCD::SetWorking(bool working) {
rip_button_->setVisible(!working); rip_button_->setVisible(!working);
@ -455,3 +454,26 @@ void RipCD::RemoveTemporaryDirectory() {
Utilities::RemoveRecursive(temporary_directory_); Utilities::RemoveRecursive(temporary_directory_);
temporary_directory_.clear(); temporary_directory_.clear();
} }
void RipCD::BuildTrackListTable() {
checkboxes_.clear();
track_names_.clear();
i_tracks_ = cdio_get_num_tracks(cdio_);
ui_->tableWidget->setRowCount(i_tracks_);
for (int i = 1; i <= i_tracks_; i++) {
QCheckBox* checkbox_i = new QCheckBox(ui_->tableWidget);
checkbox_i->setCheckState(Qt::Checked);
checkboxes_.append(checkbox_i);
ui_->tableWidget->setCellWidget(i - 1, kCheckboxColumn, checkbox_i);
ui_->tableWidget->setCellWidget(i - 1, kTrackNumberColumn,
new QLabel(QString::number(i)));
QString track_title = QString("Track %1").arg(i);
QLineEdit* line_edit_track_title_i =
new QLineEdit(track_title, ui_->tableWidget);
track_names_.append(line_edit_track_title_i);
ui_->tableWidget->setCellWidget(i - 1, kTrackTitleColumn,
line_edit_track_title_i);
}
}
void RipCD::showEvent(QShowEvent* event) { BuildTrackListTable(); }

View File

@ -24,7 +24,7 @@
#include <QFile> #include <QFile>
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include "ui_ripcd.h" #include "ui_ripcd.h"
#include <memory>
class Ui_RipCD; class Ui_RipCD;
class Transcoder; class Transcoder;
@ -36,7 +36,11 @@ class RipCD : public QDialog {
public: public:
explicit RipCD(QWidget* parent = nullptr); explicit RipCD(QWidget* parent = nullptr);
~RipCD(); ~RipCD();
bool CDIOIsValid() const; bool CheckCDIOIsValid();
void BuildTrackListTable();
protected:
void showEvent(QShowEvent* event);
private: private:
static const char* kSettingsGroup; static const char* kSettingsGroup;
@ -47,7 +51,7 @@ class RipCD : public QDialog {
int finished_success_; int finished_success_;
int finished_failed_; int finished_failed_;
track_t i_tracks_; track_t i_tracks_;
Ui_RipCD* ui_; std::unique_ptr<Ui_RipCD> ui_;
CdIo_t* cdio_; CdIo_t* cdio_;
QList<QCheckBox*> checkboxes_; QList<QCheckBox*> checkboxes_;
QList<QString> generated_files_; QList<QString> generated_files_;