diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 20d07962f..963e53961 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -1857,7 +1857,7 @@ void MainWindow::OpenRipCD() { if (!rip_cd_) { rip_cd_.reset(new RipCD); } - if (rip_cd_->CDIOIsValid()) { + if (rip_cd_->CheckCDIOIsValid()) { rip_cd_->show(); } else { QMessageBox cdio_fail(QMessageBox::Critical, tr("Error"), diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index 976c9ad88..38dad5a55 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -72,7 +73,7 @@ RipCD::RipCD(QWidget* parent) finished_success_(0), finished_failed_(0), ui_(new Ui_RipCD) { - + cdio_ = cdio_open(NULL, DRIVER_UNKNOWN); // Init ui_->setupUi(this); @@ -116,28 +117,6 @@ RipCD::RipCD(QWidget* parent) setWindowTitle(tr("Rip CD")); 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 QList presets = Transcoder::GetAllPresets(); qSort(presets.begin(), presets.end(), ComparePresetsByName); @@ -165,7 +144,9 @@ RipCD::RipCD(QWidget* parent) ui_->progress_bar->setMaximum(100); } -RipCD::~RipCD() { delete ui_; } +RipCD::~RipCD() { + cdio_destroy(cdio_); +} /* * WAV Header documentation @@ -225,22 +206,19 @@ int RipCD::NumTracksToRip() { } void RipCD::ThreadClickedRipButton() { - temporary_directory_ = Utilities::MakeTempDir() + "/"; - finished_success_ = 0; finished_failed_ = 0; ui_->progress_bar->setMaximum(NumTracksToRip() * 2 * 100); // Set up progress bar emit(SignalUpdateProgress()); - + tracks_to_rip_.clear(); for (int i = 1; i <= i_tracks_; i++) { if (!checkboxes_.value(i - 1)->isChecked()) { continue; } tracks_to_rip_.append(i); - QString filename = temporary_directory_ + ParseFileFormatString(ui_->format_filename->text(), i) + ".wav"; @@ -327,6 +305,17 @@ void RipCD::ThreadedTranscoding() { } 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); QtConcurrent::run(this, &RipCD::ThreadClickedRipButton); } @@ -412,12 +401,22 @@ void RipCD::AddDestinationDirectory(QString dir) { } void RipCD::Cancel() { + ui_->progress_bar->setValue(0); transcoder_->Cancel(); RemoveTemporaryDirectory(); 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) { rip_button_->setVisible(!working); @@ -455,3 +454,26 @@ void RipCD::RemoveTemporaryDirectory() { Utilities::RemoveRecursive(temporary_directory_); 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(); } diff --git a/src/ui/ripcd.h b/src/ui/ripcd.h index cd6e2591e..a27252b74 100644 --- a/src/ui/ripcd.h +++ b/src/ui/ripcd.h @@ -24,7 +24,7 @@ #include #include #include "ui_ripcd.h" - +#include class Ui_RipCD; class Transcoder; @@ -36,7 +36,11 @@ class RipCD : public QDialog { public: explicit RipCD(QWidget* parent = nullptr); ~RipCD(); - bool CDIOIsValid() const; + bool CheckCDIOIsValid(); + void BuildTrackListTable(); + + protected: + void showEvent(QShowEvent* event); private: static const char* kSettingsGroup; @@ -47,7 +51,7 @@ class RipCD : public QDialog { int finished_success_; int finished_failed_; track_t i_tracks_; - Ui_RipCD* ui_; + std::unique_ptr ui_; CdIo_t* cdio_; QList checkboxes_; QList generated_files_;