[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [audex/0.8] /: Replaced KKompactDisc by Solid.
From:       Marco Nelles <marco () maniatek ! de>
Date:       2015-01-31 18:53:08
Message-ID: E1YHdAK-0007th-Mz () scm ! kde ! org
[Download RAW message or body]

Git commit 4652d93847c4ea998908cd3c208aee041287078c by Marco Nelles.
Committed on 31/01/2015 at 18:52.
Pushed by marcon into branch '0.8'.

Replaced KKompactDisc by Solid.

M  +1    -0    CMakeLists.txt
M  +1    -1    core/audex.cpp
M  +25   -74   mainwindow.cpp
M  +2    -4    mainwindow.h
M  +104  -222  models/cddamodel.cpp
M  +19   -65   models/cddamodel.h
M  +3    -6    utils/cddaextractthread.cpp
M  +1    -1    utils/cddaextractthread.h
A  +152  -0    utils/cddasolid.cpp     [License: GPL (v3+)]
A  +85   -0    utils/cddasolid.h     [License: GPL (v3+)]
M  +5    -5    widgets/cddaheaderwidget.cpp
M  +0    -11   widgets/devicewidget.cpp
M  +3    -15   widgets/devicewidgetUI.ui

http://commits.kde.org/audex/4652d93847c4ea998908cd3c208aee041287078c

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c33c8ff..81155d9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -48,6 +48,7 @@ set(audex_SRCS
   utils/playlist.cpp
   utils/wavefilewriter.cpp
   utils/cddaparanoia.cpp
+  utils/cddasolid.cpp
   utils/encoderwrapper.cpp
   utils/cddaextractthread.cpp
   utils/upload.cpp
diff --git a/core/audex.cpp b/core/audex.cpp
index c3ada9c..f27bdd5 100644
--- a/core/audex.cpp
+++ b/core/audex.cpp
@@ -41,7 +41,7 @@ Audex::Audex(QWidget* parent, ProfileModel *profile_model, \
CDDAModel *cdda_model  return;
   }
 
-  cdda_extract_thread = new CDDAExtractThread(this, cdda_model->device());
+  cdda_extract_thread = new CDDAExtractThread(this, cdda_model->paranoia());
   if (!cdda_extract_thread) {
     kDebug() << "PANIC ERROR. Could not load object CDDAExtractThread. Low mem?";
     return;
diff --git a/mainwindow.cpp b/mainwindow.cpp
index e042531..88ecfe8 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -39,7 +39,7 @@ MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent) {
   if ((dev_index >= 0) && (dev_index < deviceUrls.count())) {
     device_path = KCompactDisc::cdromDeviceUrl(deviceUrls[dev_index]).path();
   }
-  cdda_model = new CDDAModel(this, device_path);
+  cdda_model = new CDDAModel(this);
   if (!cdda_model) {
     kDebug() << "Unable to create CDDAModel object. Low mem?";
     ErrorDialog::show(this, i18n("Unable to create CDDAModel object."), \
i18n("Internal error. Check your hardware. If all okay please make bug report.")); @@ \
-50,10 +50,9 @@ MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent) {  \
return;  }
 
-  connect(cdda_model, SIGNAL(driveStatusChanged(const CDDAModel::DriveStatus)), \
                this, SLOT(drive_status_changed(const CDDAModel::DriveStatus)));
-  connect(cdda_model, SIGNAL(discStatusChanged(const CDDAModel::DiscStatus)), this, \
                SLOT(disc_status_changed(const CDDAModel::DiscStatus)));
-  connect(cdda_model, SIGNAL(discChanged(const CDDAModel::DiscType)), this, \
                SLOT(disc_changed(const CDDAModel::DiscType)));
-  connect(cdda_model, SIGNAL(discInfoChanged(const CDDAModel::DiscInfo)), this, \
SLOT(disc_info_changed(const CDDAModel::DiscInfo))); +  connect(cdda_model, \
SIGNAL(audioDiscDetected()), this, SLOT(new_audio_disc_detected())); +  \
connect(cdda_model, SIGNAL(audioDiscRemoved()), this, SLOT(audio_disc_removed())); +
   connect(cdda_model, SIGNAL(cddbLookupStarted()), this, SLOT(cddb_lookup_start()));
   connect(cdda_model, SIGNAL(cddbLookupDone(const bool)), this, \
SLOT(cddb_lookup_done(const bool)));  connect(cdda_model, SIGNAL(cddbDataModified()), \
this, SLOT(enable_submit())); @@ -113,13 +112,13 @@ void MainWindow::cddb_submit() {
 
 void MainWindow::rip() {
 
-  if (cdda_model->discInfo() == CDDAModel::DiscNoInfo) {
+  if (cdda_model->empty()) {
 
     if (KMessageBox::warningYesNo(this, i18n("No disc information set. Do you really \
                want to continue?"),
-				i18n("Disc information not found"),
-				KStandardGuiItem::yes(),
-				KStandardGuiItem::no(),
-				"no_disc_info_warn")== KMessageBox::No) return;
+                                i18n("Disc information not found"),
+                                KStandardGuiItem::yes(),
+                                KStandardGuiItem::no(),
+                                "no_disc_info_warn")== KMessageBox::No) return;
 
   }
 
@@ -185,67 +184,27 @@ void MainWindow::configure() {
 
 }
 
-void MainWindow::drive_status_changed(const CDDAModel::DriveStatus status) {
-  switch (status) {
-    case CDDAModel::DriveNoStatus :
-      status_label->setText(i18n("No status information available"));
-      enable_layout(FALSE);
-      break;
-    case CDDAModel::DriveEmpty :
-      status_label->setText(i18n("No disc in drive"));
-      enable_layout(TRUE);
-      break;
-    case CDDAModel::DriveReady :
-      status_label->setText(i18n("Audio disc in drive"));
-      enable_layout(TRUE);
-      resizeColumns();
-      if (Preferences::cddbLookupAuto()) {
-        kDebug() << "Performing CDDB auto lookup";
-        QTimer::singleShot(0, this, SLOT(cddb_lookup()));
-      }
-      break;
-    case CDDAModel::DriveOpen :
-      status_label->setText(i18n("Drive tray open"));
-      enable_layout(FALSE);
-      break;
-    case CDDAModel::DriveNotReady :
-      status_label->setText(i18n("Drive not ready"));
-      enable_layout(FALSE);
-      break;
-    case CDDAModel::DriveError :
-    status_label->setText(i18n("Drive error"));
-      enable_layout(FALSE);
-      break;
-    default :
-      break;
-  }
-}
+void MainWindow::new_audio_disc_detected() {
 
-void MainWindow::disc_status_changed(const CDDAModel::DiscStatus status) {
-  Q_UNUSED(status);
-}
+  status_label->setText(i18n("Audio disc detected"));
+  enable_layout(TRUE);
+  resizeColumns();
+  if (Preferences::cddbLookupAuto()) {
+    kDebug() << "Performing CDDB auto lookup";
+    QTimer::singleShot(0, this, SLOT(cddb_lookup()));
+  }
 
-void MainWindow::disc_changed(const CDDAModel::DiscType type) {
-  Q_UNUSED(type);
   update_layout();
+
 }
 
-void MainWindow::disc_info_changed(const CDDAModel::DiscInfo info) {
-  Q_UNUSED(info);
-  switch (info) {
-    case CDDAModel::DiscNoInfo :
-      break;
-    case CDDAModel::DiscManualInfo :
-      break;
-    case CDDAModel::DiscCDTEXTInfo :
-    case CDDAModel::DiscCDDBInfo :
-    case CDDAModel::DiscPhononMetadataInfo :
-      if (Preferences::coverLookupAuto()) cdda_header_widget->googleAuto();
-      break;
-    default :
-      break;
-  }
+void MainWindow::audio_disc_removed() {
+
+  status_label->setText(i18n("No audio disc detected"));
+  enable_layout(FALSE);
+
   update_layout();
+
 }
 
 void MainWindow::cddb_lookup_start() {
@@ -261,6 +220,7 @@ void MainWindow::cddb_lookup_done(const bool successful) {
   status_label->setText(status_label_prev);
   update_layout();
   disable_submit();
+  if (Preferences::coverLookupAuto()) cdda_header_widget->googleAuto();
 }
 
 void MainWindow::update_layout() {
@@ -310,15 +270,6 @@ void MainWindow::disable_submit() {
 void MainWindow::configuration_updated(const QString& dialog_name) {
   Q_UNUSED(dialog_name);
   Preferences::self()->writeConfig();
-  QStringList deviceUrls = KCompactDisc::cdromDeviceNames();
-  int dev_index = Preferences::cdDevice().toInt();
-  QString device_path;
-  if ((dev_index >= 0) && (dev_index < deviceUrls.count())) {
-    device_path = KCompactDisc::cdromDeviceUrl(deviceUrls[dev_index]).path();
-  }
-  if (device_path != cdda_model->device()) {
-    cdda_model->setDevice(device_path);
-  }
 }
 
 void MainWindow::current_profile_updated_from_ui(int row) {
diff --git a/mainwindow.h b/mainwindow.h
index 833d10f..bb7fa98 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -83,10 +83,8 @@ private Q_SLOTS:
   void rip();
   void configure();
 
-  void drive_status_changed(const CDDAModel::DriveStatus status);
-  void disc_status_changed(const CDDAModel::DiscStatus status);
-  void disc_changed(const CDDAModel::DiscType type);
-  void disc_info_changed(const CDDAModel::DiscInfo info);
+  void new_audio_disc_detected();
+  void audio_disc_removed();
 
   void cddb_lookup_start();
   void cddb_lookup_done(const bool successful);
diff --git a/models/cddamodel.cpp b/models/cddamodel.cpp
index 35d9275..f9f0d7a 100644
--- a/models/cddamodel.cpp
+++ b/models/cddamodel.cpp
@@ -18,21 +18,20 @@
 
 #include "cddamodel.h"
 
-CDDAModel::CDDAModel(QObject *parent, const QString& device) : \
QAbstractTableModel(parent) { +CDDAModel::CDDAModel(QObject *parent) : \
QAbstractTableModel(parent) {  
-  cddb_transaction_pending = FALSE;
+  pn = 0;
+  _device.clear();
+  _udi.clear();
 
-  compact_disc = new KCompactDisc();
-  if (!compact_disc) {
-    kDebug() << "Unable to create KCompactDisc object. Low mem?";
-    error = Error(i18n("Unable to create KCompactDisc object."), i18n("This is an \
internal error. Check your hardware. If all okay please make bug report."), \
Error::ERROR, this); +  solid = new CDDASolid(this);
+  if (!solid) {
+    kDebug() << "Unable to create solid object. low mem?";
+    error = Error(i18n("Unable to create Solid object."), i18n("This is an internal \
error. Check your hardware. If all okay please make bug report."), Error::ERROR, \
this);  return;
   }
-
-  setDevice(device);
-  connect(compact_disc, SIGNAL(discChanged(unsigned int)), this, \
                SLOT(slot_disc_changed(unsigned int)));
-  connect(compact_disc, SIGNAL(discInformation(KCompactDisc::DiscInfo)), this, \
                SLOT(slot_disc_information(KCompactDisc::DiscInfo)));
-  connect(compact_disc, SIGNAL(discStatusChanged(KCompactDisc::DiscStatus)), this, \
SLOT(slot_disc_status_changed(KCompactDisc::DiscStatus))); +  connect(solid, \
SIGNAL(audioDiscDetected(const QString&)), this, SLOT(new_audio_disc_available(const \
QString&))); +  connect(solid, SIGNAL(audioDiscRemoved(const QString&)), this, \
SLOT(audio_disc_removed(const QString&)));  
   cddb = new KCDDB::Client();
   if (!cddb) {
@@ -42,15 +41,15 @@ CDDAModel::CDDAModel(QObject *parent, const QString& device) : \
QAbstractTableMod  }
   connect(cddb, SIGNAL(finished(KCDDB::Result)), this, \
SLOT(lookup_cddb_done(KCDDB::Result)));  
+  cddb_transaction_pending = FALSE;
+
   _cover = new CachedImage();
 
   cd_info.clear();
   modified = FALSE;
+  _empty = TRUE;
 
-  drive_status = DriveNoStatus;
-  disc_status = DiscNoStatus;
-  disc_type = DiscNoType;
-  disc_info = DiscNoInfo;
+  QTimer::singleShot(2000, solid, SLOT(scanBus()));
 
 }
 
@@ -58,17 +57,15 @@ CDDAModel::~CDDAModel() {
 
   delete _cover;
   delete cddb;
-  delete compact_disc;
+  delete solid;
 
-}
+  if (pn) delete pn;
 
-void CDDAModel::setDevice(const QString& device) {
-  this->_device = device;
-  if (!device.isEmpty()) compact_disc->setDevice(device, 50, FALSE);
 }
 
 int CDDAModel::rowCount(const QModelIndex &parent) const {
-  return parent.isValid()?0:compact_disc->tracks();
+  if (!pn) return 0;
+  return parent.isValid()?0:pn->numOfTracks();
 }
 
 int CDDAModel::columnCount(const QModelIndex &parent) const {
@@ -78,7 +75,7 @@ int CDDAModel::columnCount(const QModelIndex &parent) const {
 
 QVariant CDDAModel::data(const QModelIndex &index, int role) const {
 
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) {
+  if (!pn) {
     return QVariant();
   }
 
@@ -126,17 +123,13 @@ QVariant CDDAModel::data(const QModelIndex &index, int role) \
const {  case CDDA_MODEL_COLUMN_ARTIST_INDEX :
 			if (isAudioTrack(index.row()+1)) {
                           QString a = \
                cd_info.track(index.row()).get(KCDDB::Artist).toString();
-			  if (a.isEmpty()) return compact_disc->trackArtist(index.row()+1);
                           return a;
                         }
 			break;
       case CDDA_MODEL_COLUMN_TITLE_INDEX :
 			if (isAudioTrack(index.row()+1)) {
                           QString t = \
                cd_info.track(index.row()).get(KCDDB::Title).toString();
-                          if (t.isEmpty()) {
-			    if (disc_info == DiscNoInfo) return i18n("Track %1", index.row()+1);
-			    return compact_disc->trackTitle(index.row()+1);
-			  }
+                          if (t.isEmpty()) return i18n("Track %1", index.row()+1);
 			  return t;
                         }
 			break;
@@ -151,7 +144,7 @@ QVariant CDDAModel::data(const QModelIndex &index, int role) \
const {  
 bool CDDAModel::setData(const QModelIndex &index, const QVariant &value, int role) {
 
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) {
+  if (!pn) {
     return FALSE;
   }
 
@@ -234,48 +227,38 @@ Qt::ItemFlags CDDAModel::flags(const QModelIndex &index) const \
{  }
 
 void CDDAModel::setArtist(const QString& a) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (a != cd_info.get(KCDDB::Artist).toString()) {
-    if (a.isEmpty()) {
-      cd_info.set(KCDDB::Artist, compact_disc->discArtist());
-    } else {
-      cd_info.set(KCDDB::Artist, a);
-    }
+    cd_info.set(KCDDB::Artist, a);
     modify();
     reset();
   }
 }
 
 const QString CDDAModel::artist() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QString();
+  if (!pn) return QString();
   QString a = cd_info.get(KCDDB::Artist).toString();
-  if (a.isEmpty()) return compact_disc->discArtist();
   return a;
 }
 
 void CDDAModel::setTitle(const QString& t) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (t != cd_info.get(KCDDB::Title).toString()) {
-    if (t.isEmpty()) {
-      cd_info.set(KCDDB::Title, compact_disc->discTitle());
-    } else {
-      cd_info.set(KCDDB::Title, t);
-    }
+    cd_info.set(KCDDB::Title, t);
     modify();
     reset();
   }
 }
 
 const QString CDDAModel::title() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QString();
+  if (!pn) return QString();
   QString t = cd_info.get(KCDDB::Title).toString();
-  if (t.isEmpty()) return compact_disc->discTitle();
   return t;
 }
 
 void CDDAModel::setCategory(const QString& c) {
 
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
 
   QStringList validCategories;
   validCategories << "blues" << "classical" << "country"
@@ -292,12 +275,12 @@ void CDDAModel::setCategory(const QString& c) {
 }
 
 const QString CDDAModel::category() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QString();
+  if (!pn) return QString();
   return cd_info.get(KCDDB::Category).toString();
 }
 
 void CDDAModel::setGenre(const QString& g) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (g != cd_info.get(KCDDB::Genre).toString()) {
     cd_info.set(KCDDB::Genre, g);
     modify();
@@ -306,12 +289,12 @@ void CDDAModel::setGenre(const QString& g) {
 }
 
 const QString CDDAModel::genre() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QString();
+  if (!pn) return QString();
   return cd_info.get(KCDDB::Genre).toString();
 }
 
 void CDDAModel::setYear(const QString& year) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (year != cd_info.get(KCDDB::Year).toString()) {
     cd_info.set(KCDDB::Year, year);
     modify();
@@ -320,12 +303,12 @@ void CDDAModel::setYear(const QString& year) {
 }
 
 const QString CDDAModel::year() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QString();
+  if (!pn) return QString();
   return cd_info.get(KCDDB::Year).toString();
 }
 
 void CDDAModel::setExtendedData(const QStringList& e) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (e != cd_info.get(KCDDB::Comment).toStringList()) {
     cd_info.set(KCDDB::Comment, e);
     modify();
@@ -334,12 +317,12 @@ void CDDAModel::setExtendedData(const QStringList& e) {
 }
 
 const QStringList CDDAModel::extendedData() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QStringList();
+  if (!pn) return QStringList();
   return cd_info.get(KCDDB::Comment).toStringList();
 }
 
 void CDDAModel::setCDNum(const int n) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (n != cd_info.get("DNO").toInt()) {
     cd_info.set("DNO", n);
     modify();
@@ -348,13 +331,13 @@ void CDDAModel::setCDNum(const int n) {
 }
 
 int CDDAModel::cdNum() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return -1;
+  if (!pn) return -1;
   if (!isMultiCD()) return 0;
   return cd_info.get("DNO").toInt();
 }
 
 void CDDAModel::setTrackOffset(const int n) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (n != cd_info.get("DTRACKOFFSET").toInt()) {
     cd_info.set("DTRACKOFFSET", n);
     modify();
@@ -363,13 +346,14 @@ void CDDAModel::setTrackOffset(const int n) {
 }
 
 int CDDAModel::trackOffset() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return 1;
+  if (!pn) return -1;
   return cd_info.get("DTRACKOFFSET").toInt();
 }
 
 int CDDAModel::guessMultiCD(QString& newTitle) const {
 
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return -1;
+  if (!pn) return -1;
+
   QString t = cd_info.get(KCDDB::Title).toString();
   QRegExp rx1("[\\(|\\[]* *([c|C][d|D]|[d|D][i|I][s|S][k|c|K|C]) *[0-9]* *[\\)|\\]]* \
*$");  int i = rx1.indexIn(t);
@@ -391,7 +375,7 @@ int CDDAModel::guessMultiCD(QString& newTitle) const {
 }
 
 void CDDAModel::setMultiCD(const bool multi) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (multi != cd_info.get("DMULTICD").toBool()) {
     cd_info.set("DMULTICD", multi);
     modify();
@@ -400,12 +384,12 @@ void CDDAModel::setMultiCD(const bool multi) {
 }
 
 bool CDDAModel::isMultiCD() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return FALSE;
+  if (!pn) return FALSE;
   return cd_info.get("DMULTICD").toBool();
 }
 
 void CDDAModel::setCustomData(const QString& type, const QVariant& data) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (data != cd_info.get(type)) {
     cd_info.set(type, data);
     modify();
@@ -414,12 +398,12 @@ void CDDAModel::setCustomData(const QString& type, const \
QVariant& data) {  }
 
 const QVariant CDDAModel::customData(const QString& type) const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QVariant();
+  if (!pn) return QVariant();
   return cd_info.get(type);
 }
 
 void CDDAModel::setCustomDataPerTrack(const int n, const QString& type, const \
                QVariant& data) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (data != cd_info.track(n).get(type)) {
     cd_info.track(n).set(type, data);
     modify();
@@ -428,7 +412,7 @@ void CDDAModel::setCustomDataPerTrack(const int n, const QString& \
type, const QV  }
 
 const QVariant CDDAModel::getCustomDataPerTrack(const int n, const QString& type) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return QVariant();
+  if (!pn) return QVariant();
   return cd_info.track(n).get(type);
 }
 
@@ -488,7 +472,7 @@ const QString CDDAModel::coverSupportedMimeTypeList() const {
 }
 
 bool CDDAModel::guessVarious() const {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return FALSE;
+  if (!pn) return FALSE;
   QString a;
   for (int i = 0; i < cd_info.numberOfTracks(); ++i) {
     if ((i > 0) && (cd_info.track(i).get(KCDDB::Artist).toString().toLower() != \
a.toLower())) return TRUE; @@ -498,7 +482,7 @@ bool CDDAModel::guessVarious() const {
 }
 
 void CDDAModel::setVarious(bool various) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   if (various != cd_info.get("DVARIOUS").toBool()) {
     cd_info.set("DVARIOUS", various);
     modify();
@@ -506,12 +490,12 @@ void CDDAModel::setVarious(bool various) {
 }
 
 bool CDDAModel::isVarious() {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return FALSE;
+  if (!pn) return FALSE;
   return cd_info.get("DVARIOUS").toBool();
 }
 
 void CDDAModel::swapArtistAndTitleOfTracks() {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   for (int i = 0; i < cd_info.numberOfTracks(); ++i) {
     QVariant tmp = cd_info.track(i).get(KCDDB::Artist);
     cd_info.track(i).set(KCDDB::Artist, cd_info.track(i).get(KCDDB::Title));
@@ -522,7 +506,7 @@ void CDDAModel::swapArtistAndTitleOfTracks() {
 }
 
 void CDDAModel::swapArtistAndTitle() {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   QVariant tmp = cd_info.get(KCDDB::Title);
   cd_info.set(KCDDB::Title, cd_info.get(KCDDB::Artist));
   cd_info.set(KCDDB::Artist, tmp);
@@ -531,7 +515,7 @@ void CDDAModel::swapArtistAndTitle() {
 }
 
 void CDDAModel::splitTitleOfTracks(const QString& divider) {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   for (int i = 0; i < cd_info.numberOfTracks(); ++i) {
     int splitPos = cd_info.track(i).get(KCDDB::Title).toString().indexOf(divider);
     if (splitPos >= 0) {
@@ -547,7 +531,7 @@ void CDDAModel::splitTitleOfTracks(const QString& divider) {
 }
 
 void CDDAModel::capitalizeTracks() {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   for (int i = 0; i < cd_info.numberOfTracks(); ++i) {
     cd_info.track(i).set(KCDDB::Artist, \
                capitalize(cd_info.track(i).get(KCDDB::Artist).toString()));
     cd_info.track(i).set(KCDDB::Title, \
capitalize(cd_info.track(i).get(KCDDB::Title).toString())); @@ -557,7 +541,7 @@ void \
CDDAModel::capitalizeTracks() {  }
 
 void CDDAModel::capitalizeHeader() {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   cd_info.set(KCDDB::Artist, capitalize(cd_info.get(KCDDB::Artist).toString()));
   cd_info.set(KCDDB::Title, capitalize(cd_info.get(KCDDB::Title).toString()));
   modified = TRUE; emit cddbDataModified();
@@ -565,7 +549,7 @@ void CDDAModel::capitalizeHeader() {
 }
 
 void CDDAModel::setTitleArtistsFromHeader() {
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
   for (int i = 0; i < cd_info.numberOfTracks(); ++i) {
     cd_info.track(i).set(KCDDB::Artist, cd_info.get(KCDDB::Artist));
   }
@@ -574,7 +558,8 @@ void CDDAModel::setTitleArtistsFromHeader() {
 }
 
 int CDDAModel::numOfTracks() const {
-  return compact_disc->tracks();
+  if (!pn) return 0;
+  return pn->numOfTracks();
 }
 
 int CDDAModel::numOfAudioTracks() const {
@@ -590,7 +575,8 @@ int CDDAModel::numOfAudioTracksInSelection() const {
 }
 
 int CDDAModel::length() const {
-  return compact_disc->discLength();
+  if (!pn) return 0;
+  return pn->length();
 }
 
 int CDDAModel::lengthOfAudioTracks() const {
@@ -611,15 +597,18 @@ int CDDAModel::lengthOfAudioTracksInSelection() const {
 }
 
 int CDDAModel::lengthOfTrack(int n) const {
-  return compact_disc->trackLength(n);
+  if (!pn) return 0;
+  return pn->lengthOfTrack(n);
 }
 
 const QList<quint32> CDDAModel::discSignature() const {
-  return compact_disc->discSignature();
+  if (!pn) return QList<quint32>();
+  return pn->discSignature();
 }
 
 bool CDDAModel::isAudioTrack(int n) const {
-  return compact_disc->isAudio(n);
+  if (!pn) return FALSE;
+  return pn->isAudioTrack(n);
 }
 
 void CDDAModel::clear() {
@@ -672,66 +661,9 @@ Error CDDAModel::lastError() const {
   return error;
 }
 
-CDDAModel::DriveStatus CDDAModel::driveStatus() const {
-  return drive_status;
-}
-
-const QString CDDAModel::driveStatusString() const {
-  switch (drive_status) {
-    case DriveEmpty : return i18n("No disc in drive");
-    case DriveReady : return i18n("Disc in drive");
-    case DriveOpen : return i18n("Drive tray open");
-    case DriveNotReady : return i18n("Drive not ready");
-    case DriveError : return i18n("Drive error");
-    default : ;
-  }
-  return i18n("No drive status available");
-}
-
-CDDAModel::DiscStatus CDDAModel::discStatus() const {
-  return disc_status;
-}
-
-const QString CDDAModel::discStatusString() const {
-  switch (disc_status) {
-    case DiscPlaying : return i18n("Disc playing");
-    case DiscPaused : return i18n("Disc paused");
-    case DiscStopped : return i18n("Disc stopped");
-    default : ;
-  }
-  return i18n("No disc status available");
-}
-
-CDDAModel::DiscType CDDAModel::discType() const {
-  return disc_type;
-}
-
-const QString CDDAModel::discTypeString() const {
-  switch (disc_type) {
-    case DiscContainsAudioTracks : return i18n("Audio disc");
-    case DiscContainsNoAudioTracks : return i18n("No audio disc");
-    default : ;
-  }
-  return i18n("No disc type information available");
-}
-
-CDDAModel::DiscInfo CDDAModel::discInfo() const {
-  return disc_info;
-}
-
-const QString CDDAModel::discInfoString() const {
-  switch (disc_info) {
-    case DiscCDTEXTInfo : return i18n("CD-Text");
-    case DiscCDDBInfo : return i18n("CDDB");
-    case DiscPhononMetadataInfo : return i18n("Phonon Metadata");
-    default : ;
-  }
-  return i18n("No disc information available");
-}
-
 void CDDAModel::lookupCDDB() {
 
-  if (compact_disc->isNoDisc() || compact_disc->discId()==0) return;
+  if (!pn) return;
 
   kDebug() << "lookupCDDB called";
 
@@ -745,13 +677,13 @@ void CDDAModel::lookupCDDB() {
 
   cddb->config().reparse();
   cddb->setBlockingMode(FALSE);
-  cddb->lookup(compact_disc->discSignature());
+  cddb->lookup(pn->discSignature());
 
 }
 
 bool CDDAModel::submitCDDB() {
 
-  if (compact_disc->isNoDisc() || (compact_disc->discId()==0)) return TRUE;
+  if (!pn) return TRUE;
 
   kDebug() << "submitCDDB called";
 
@@ -768,7 +700,7 @@ bool CDDAModel::submitCDDB() {
   if (category().isEmpty()) {
     setCategory("rock");
   }
-  KCDDB::Result result = cddb->submit(cd_info, compact_disc->discSignature());
+  KCDDB::Result result = cddb->submit(cd_info, pn->discSignature());
 
   if (result != KCDDB::Success) {
     switch (result) {
@@ -799,104 +731,57 @@ bool CDDAModel::submitCDDB() {
 }
 
 void CDDAModel::eject() {
-  compact_disc->eject();
+  solid->requestEject(_udi);
 }
 
-void CDDAModel::play(const unsigned int track) {
-  compact_disc->playTrack(track);
-}
+void CDDAModel::new_audio_disc_available(const QString& udi) {
 
-void CDDAModel::playPos(const unsigned int position) {
-  compact_disc->playPosition(position);
-}
+  _device = solid->blockDevice(udi);
+  _udi = udi;
 
-unsigned int CDDAModel::position() const {
-  return compact_disc->trackPosition();
-}
-
-void CDDAModel::prev() {
-  compact_disc->prev();
-}
-
-void CDDAModel::next() {
-  compact_disc->next();
-}
-
-void CDDAModel::pause() {
-  compact_disc->pause();
-}
-
-void CDDAModel::stop() {
-  compact_disc->stop();
-}
-
-void CDDAModel::slot_disc_changed(unsigned int tracks) {
+  pn = new CDDAParanoia(this);
+  if (!pn) {
+    kDebug() << "Unable to create paranoia class. low mem?";
+    error = Error(i18n("Unable to create CDDA paranoia object."), i18n("This is an \
internal error. Check your hardware. If all okay please make bug report."), \
Error::ERROR, this); +    return;
+  }
+  pn->setDevice(_device);
 
-  kDebug() << "driveChanged (" << tracks << ")";
+  kDebug() << "new audio disc detected (" << udi << ")";
 
   clear();
   confirm();
 
   sel_tracks.clear();
-  for (unsigned int i = 1; i <= tracks; ++i) {
+  for (int i = 1; i <= pn->numOfTracks(); ++i) {
     if (isAudioTrack(i)) sel_tracks.insert(i);
   }
 
   emit hasSelection(0 != sel_tracks.size());
 
-  if (tracks > 0) disc_type = DiscContainsAudioTracks; else disc_type = \
                DiscContainsNoAudioTracks;
-  emit discChanged(disc_type);
+  emit audioDiscDetected();
 
 }
 
-void CDDAModel::slot_disc_information(KCompactDisc::DiscInfo info) {
-
-  kDebug() << "infoChanged (" << info << ")";
+void CDDAModel::audio_disc_removed(const QString& udi) {
 
-  switch (info) {
-    case KCompactDisc::Cdtext : disc_info = DiscCDTEXTInfo; break;
-    case KCompactDisc::Cddb : disc_info = DiscCDDBInfo; break;
-    case KCompactDisc::PhononMetadata : disc_info = DiscPhononMetadataInfo; break;
-  }
+  kDebug() << "audio disc removed (" << udi << ")";
 
-  set_default_values();
-  setVarious(guessVarious());
-  reset();
+  _device.clear();
+  _udi.clear();
 
-  emit discInfoChanged(disc_info);
+  if (pn) delete pn;
+  pn = NULL;
 
 }
 
-void CDDAModel::slot_disc_status_changed(KCompactDisc::DiscStatus status) {
+void CDDAModel::disc_information_modified() {
 
-  kDebug() << "statusChanged (" << status << ")";
+  kDebug() << "disc info changed";
 
-  DriveStatus ds = drive_status;
-
-  switch (status) {
-
-    case KCompactDisc::Playing : disc_status = DiscPlaying; drive_status = \
                DriveReady; break;
-    case KCompactDisc::Paused : disc_status = DiscPaused; drive_status = DriveReady; \
                break;
-    case KCompactDisc::Stopped : disc_status = DiscStopped; drive_status = \
                DriveReady; break;
-
-    case KCompactDisc::Ejected : disc_status = DiscNoStatus; drive_status = \
                DriveOpen; break;
-    case KCompactDisc::NoDisc : disc_status = DiscNoStatus; drive_status = \
                DriveEmpty; break;
-    case KCompactDisc::NotReady : disc_status = DiscNoStatus; drive_status = \
                DriveNotReady; break;
-    case KCompactDisc::Error : disc_status = DiscNoStatus; drive_status = \
                DriveError; break;
-
-    default : break;
-
-  }
-
-  if (disc_status == DiscNoStatus) {
-    disc_info = DiscNoInfo;
-    emit discInfoChanged(disc_info);
-  }
-
-  if (ds != drive_status) emit driveStatusChanged(drive_status);
-  emit discStatusChanged(disc_status);
-
-  stop();
+  set_default_values();
+  setVarious(guessVarious());
+  reset();
 
 }
 
@@ -912,10 +797,7 @@ void CDDAModel::lookup_cddb_done(KCDDB::Result result) {
       case KCDDB::NoRecordFound : ;
       case KCDDB::MultipleRecordFound : ;
       case KCDDB::Success : ;
-      default : if (disc_info == DiscNoInfo)
-	          error = Error(KCDDB::resultToString(result), i18n("This means no data \
found in the CDDB database. Please enter the data manually. Maybe try another CDDB \
                server."), Error::ERROR, this);
-		else
-		  error = Error(KCDDB::resultToString(result), i18n("This means no data found in \
the CDDB database."), Error::ERROR, this); +      default : error = \
Error(KCDDB::resultToString(result), i18n("This means no data found in the CDDB \
database."), Error::ERROR, this);  }
     emit cddbLookupDone(FALSE);
     return;
@@ -938,7 +820,7 @@ void CDDAModel::lookup_cddb_done(KCDDB::Result result) {
       NULL);
 
     if (ok) {
-      // The user selected and item and pressed OK
+      // The user selected an item and pressed OK
       int c = 0;
       for (QStringList::Iterator it = list.begin(); it != list.end(); ++it) {
         if (*it==res) break;
@@ -948,16 +830,15 @@ void CDDAModel::lookup_cddb_done(KCDDB::Result result) {
     } else {
       emit cddbLookupDone(TRUE);
       return;
-      // user pressed Cancel
+      // user pressed cancel
     }
 
   }
 
   cd_info = info;
   set_default_values();
-  disc_info = DiscCDDBInfo;
   setVarious(guessVarious());
-  if(isVarious() && QLatin1String("Various")==artist()) {
+  if (isVarious() && QLatin1String("Various") == artist()) {
     setArtist(i18n("Various Artists"));
   }
 
@@ -972,9 +853,9 @@ void CDDAModel::lookup_cddb_done(KCDDB::Result result) {
 
   cddb_transaction_pending = FALSE;
 
-  emit cddbLookupDone(TRUE);
+  _empty = FALSE;
 
-  emit discInfoChanged(disc_info);
+  emit cddbLookupDone(TRUE);
 
 }
 
@@ -1014,7 +895,8 @@ void CDDAModel::set_default_values() {
 
 void CDDAModel::modify() {
 
-  modified = TRUE; emit cddbDataModified();
-  if (disc_info==DiscNoInfo) { disc_info = DiscManualInfo; emit \
discInfoChanged(disc_info); } +  modified = TRUE;
+  _empty = FALSE;
+  emit cddbDataModified();
 
 }
diff --git a/models/cddamodel.h b/models/cddamodel.h
index c4758e4..4b837bb 100644
--- a/models/cddamodel.h
+++ b/models/cddamodel.h
@@ -28,17 +28,19 @@
 #include <QModelIndexList>
 #include <QSet>
 #include <QRegExp>
+#include <QTimer>
 
 #include <KDebug>
 #include <KLocale>
 #include <KInputDialog>
 #include <KMimeType>
-#include <libkcompactdisc/kcompactdisc.h>
 
 #include <libkcddb/kcddb.h>
 #include <libkcddb/client.h>
 #include <libkcddb/cdinfo.h>
 
+#include "utils/cddasolid.h"
+#include "utils/cddaparanoia.h"
 #include "utils/cachedimage.h"
 
 #include "utils/error.h"
@@ -67,10 +69,10 @@ class CDDAModel : public QAbstractTableModel {
   Q_OBJECT
 
 public:
-  CDDAModel(QObject *parent = 0, const QString& device = "/dev/cdrom");
+  CDDAModel(QObject *parent = 0);
   ~CDDAModel();
 
-  void setDevice(const QString& device);
+  inline CDDAParanoia *paranoia() const { return pn; }
   inline const QString& device() const { return _device; }
 
   int rowCount(const QModelIndex &parent = QModelIndex()) const;
@@ -150,6 +152,8 @@ public:
 
   void clear();
 
+  inline bool empty() { return _empty; }
+
   inline const QSet<int>& selectedTracks() const { return sel_tracks; }
   void toggle(int row);
   bool isTrackInSelection(int n) const;
@@ -162,66 +166,15 @@ public:
 
   Error lastError() const;
 
-  enum DriveStatus {
-    DriveNoStatus,
-    DriveEmpty,
-    DriveReady,
-    DriveOpen,
-    DriveNotReady,
-    DriveError
-  };
-
-  enum DiscStatus {
-    DiscNoStatus,
-    DiscPlaying,
-    DiscPaused,
-    DiscStopped
-  };
-
-  enum DiscType {
-    DiscNoType,
-    DiscContainsAudioTracks,
-    DiscContainsNoAudioTracks
-  };
-
-  enum DiscInfo {
-    DiscNoInfo,
-    DiscManualInfo, /*user input*/
-    DiscCDTEXTInfo,
-    DiscCDDBInfo,
-    DiscPhononMetadataInfo
-  };
-
-  DriveStatus driveStatus() const;
-  const QString driveStatusString() const;
-
-  DiscStatus discStatus() const;
-  const QString discStatusString() const;
-
-  DiscType discType() const;
-  const QString discTypeString() const;
-
-  DiscInfo discInfo() const;
-  const QString discInfoString() const;
-
 public slots:
   void lookupCDDB();
   bool submitCDDB();
-  void eject();
 
-  void play(const unsigned int track = 1);
-  void playPos(const unsigned int position);
-  unsigned int position() const;
-  void prev();
-  void next();
-  void pause();
-  void stop();
+  void eject();
 
 signals:
-  void driveStatusChanged(const CDDAModel::DriveStatus status);
-  void discStatusChanged(const CDDAModel::DiscStatus status);
-  void discChanged(const CDDAModel::DiscType type);
-  void discInfoChanged(const CDDAModel::DiscInfo info);
+  void audioDiscDetected();
+  void audioDiscRemoved();
 
   void cddbLookupStarted();
   void cddbLookupDone(const bool successful);
@@ -233,23 +186,24 @@ signals:
   void selectionChanged(const int num_selected);
 
 private slots:
-  void slot_disc_changed(unsigned int tracks);
-  void slot_disc_information(KCompactDisc::DiscInfo info);
-  void slot_disc_status_changed(KCompactDisc::DiscStatus status);
+  void new_audio_disc_available(const QString& udi);
+  void audio_disc_removed(const QString& udi);
+
+  void disc_information_modified();
 
   void lookup_cddb_done(KCDDB::Result result);
 
 private:
   QString _device;
-  KCompactDisc *compact_disc;
+  QString _udi;
+  CDDAParanoia *pn;
+  CDDASolid *solid;
+
   KCDDB::Client *cddb;
   KCDDB::CDInfo cd_info;
   CachedImage *_cover;
   bool modified;
-  DriveStatus drive_status;
-  DiscStatus disc_status;
-  DiscType disc_type;
-  DiscInfo disc_info;
+  bool _empty; // no metadata available yet
   Error error;
   bool cddb_transaction_pending;
 
diff --git a/utils/cddaextractthread.cpp b/utils/cddaextractthread.cpp
index 46727ff..79362c5 100644
--- a/utils/cddaextractthread.cpp
+++ b/utils/cddaextractthread.cpp
@@ -24,16 +24,15 @@ void paranoiaCallback(long sector, int status) {
   aet->createStatus(sector, status);
 }
 
-CDDAExtractThread::CDDAExtractThread(QObject* parent, const QString& device) : \
QThread(parent) { +CDDAExtractThread::CDDAExtractThread(QObject* parent, CDDAParanoia \
*_paranoia) : QThread(parent) {  
-  paranoia = new CDDAParanoia(this);
+  paranoia = _paranoia;
   if (!paranoia) {
-    kDebug() << "Unable to create paranoia class. low mem?";
+    kDebug() << "Paranoia object not found. low mem?";
     emit error(i18n("Internal device error."), i18n("Check your device and make a \
bug report."));  return;
   }
   connect(paranoia, SIGNAL(error(const QString&, const QString&)), this, \
                SLOT(slot_error(const QString&, const QString&)));
-  paranoia->setDevice(device);
 
   overall_sectors_read = 0;
   paranoia_mode = 3;
@@ -51,8 +50,6 @@ CDDAExtractThread::CDDAExtractThread(QObject* parent, const \
QString& device) : Q  
 CDDAExtractThread::~CDDAExtractThread() {
 
-  delete paranoia;
-
 }
 
 void CDDAExtractThread::start() {
diff --git a/utils/cddaextractthread.h b/utils/cddaextractthread.h
index 50fddee..1091ee9 100644
--- a/utils/cddaextractthread.h
+++ b/utils/cddaextractthread.h
@@ -30,7 +30,7 @@
 class CDDAExtractThread : public QThread {
   Q_OBJECT
 public:
-  CDDAExtractThread(QObject* parent = 0, const QString& device = "/dev/cdrom");
+  CDDAExtractThread(QObject* parent, CDDAParanoia *_paranoia);
   ~CDDAExtractThread();
 
 public slots:
diff --git a/utils/cddasolid.cpp b/utils/cddasolid.cpp
new file mode 100644
index 0000000..8face7b
--- /dev/null
+++ b/utils/cddasolid.cpp
@@ -0,0 +1,152 @@
+/*
+ * AUDEX CDDA EXTRACTOR
+ *
+ * Copyright (C) 2007-2013 Marco Nelles (audex@maniatek.com)
+ * <http://kde.maniatek.com/audex>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "cddasolid.h"
+
+CDDASolid::CDDASolid(QObject *parent) {
+
+  Q_UNUSED(parent);
+
+  connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString&)), \
this, SLOT(p_solid_device_added(const QString&))); +  \
connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString&)), \
this, SLOT(p_solid_device_removed(const QString&))); +
+}
+
+CDDASolid::~CDDASolid() {
+
+  p_clear();
+
+}
+
+const QString CDDASolid::blockDevice(const QString& udi) const {
+
+  OpticalAudioDisc *disc = p_discs.value(udi, NULL);
+  if (!disc) return QString();
+
+  const Solid::GenericInterface *gen = disc->device.as<Solid::GenericInterface>();
+  return gen->allProperties().value("DeviceFile").toString();
+
+}
+
+int CDDASolid::discCount() const {
+
+  return p_discs.count();
+
+}
+
+void CDDASolid::scanBus() {
+
+  p_clear();
+
+  QList<Solid::Device> list = \
Solid::Device::listFromType(Solid::DeviceInterface::OpticalDisc, QString()); +
+  for (int i = 0; i < list.count(); ++i) {
+    p_solid_device_added(list.value(i).udi());
+  }
+
+}
+
+void CDDASolid::requestEject(const QString& udi) {
+
+  OpticalAudioDisc *disc = p_discs.value(udi, NULL);
+  if (!disc) return;
+
+  Solid::Device device = disc->device;
+  if (!p_is_optical_audio_disc_in_drive(device)) return;
+  const Solid::GenericInterface *gen = device.as<Solid::GenericInterface>();
+
+  QString driveUdi = gen->allProperties().value("block.storage_device").toString();
+  Solid::Device device2(driveUdi);
+  if (device2.is<Solid::OpticalDrive>()) {
+    Solid::OpticalDrive *opticalDrive = device2.as<Solid::OpticalDrive>();
+    opticalDrive->eject();
+  }
+
+}
+
+void CDDASolid::setName(const QString& udi, const QString& name) {
+
+  OpticalAudioDisc *disc = p_discs.value(udi, NULL);
+  if (!disc) return;
+
+  if (disc->name != name) {
+    disc->name = name;
+  }
+
+}
+
+void CDDASolid::p_solid_device_added(const QString& udi) {
+
+  Solid::Device device(udi);
+
+  kDebug() << "Device found:" << device.udi();
+  if (p_is_optical_audio_disc_in_drive(device)) {
+    kDebug() << "is audio.";
+    OpticalAudioDisc *disc = new OpticalAudioDisc();
+    disc->name = i18n("Audio Disc");
+    disc->device = device;
+    p_discs.insert(udi, disc);
+    emit audioDiscDetected(udi);
+  }
+
+}
+
+void CDDASolid::p_solid_device_removed(const QString& udi) {
+
+  OpticalAudioDisc *disc = p_discs.value(udi, NULL);
+
+  kDebug() << "Optical audio disc removed:" << udi;
+
+  if (disc) delete disc;
+
+  p_discs.remove(udi);
+  emit audioDiscRemoved(udi);
+
+}
+
+bool CDDASolid::p_is_optical_audio_disc_in_drive(const Solid::Device& device) const \
{ +
+  if (device.is<Solid::OpticalDisc>()) {
+    const Solid::OpticalDisc *disc = device.as<Solid::OpticalDisc>();
+    kDebug() << "Detected disc type:" << disc->discType();
+    //TODO: There are some drives always reporting discType unknown (-1).
+    //Needs some more testing
+    /*if ((disc->discType() == Solid::OpticalDisc::CdRom) ||
+      (disc->discType() == Solid::OpticalDisc::CdRecordable) ||
+      (disc->discType() == Solid::OpticalDisc::CdRewritable)) {
+      return (disc->availableContent() & Solid::OpticalDisc::Audio);
+    }*/
+    return (disc->availableContent() & Solid::OpticalDisc::Audio);
+  }
+  return FALSE;
+
+}
+
+void CDDASolid::p_clear() {
+
+  QHash<QString, OpticalAudioDisc*>::const_iterator i = p_discs.constBegin();
+  while (i != p_discs.constEnd()) {
+    if (i.value()) delete i.value();
+    ++i;
+  }
+  p_discs.clear();
+
+}
diff --git a/utils/cddasolid.h b/utils/cddasolid.h
new file mode 100644
index 0000000..7b0a9e5
--- /dev/null
+++ b/utils/cddasolid.h
@@ -0,0 +1,85 @@
+/*
+ * AUDEX CDDA EXTRACTOR
+ *
+ * Copyright (C) 2007-2013 Marco Nelles (audex@maniatek.com)
+ * <http://kde.maniatek.com/audex>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef CDDASOLID_H
+#define CDDASOLID_H
+
+#include <QAbstractTableModel>
+#include <QString>
+#include <QStringList>
+
+#include <KIcon>
+#include <KDebug>
+#include <KLocale>
+
+#include <Solid/Device>
+#include <Solid/StorageAccess>
+#include <Solid/OpticalDrive>
+#include <Solid/OpticalDisc>
+#include <Solid/DeviceNotifier>
+#include <Solid/DeviceInterface>
+#include <Solid/Block>
+#include <Solid/GenericInterface>
+
+struct OpticalAudioDisc {
+  QString name;
+  Solid::Device device;
+};
+
+class CDDASolid : public QObject {
+
+  Q_OBJECT
+
+public:
+  CDDASolid(QObject *parent = 0);
+  ~CDDASolid();
+
+  const QString blockDevice(const QString& udi) const;
+
+  const QStringList udiList() const;
+  int discCount() const;
+
+public slots:
+  void scanBus();
+
+  void requestEject(const QString& udi);
+
+  //set display name
+  void setName(const QString& udi, const QString& name);
+
+signals:
+  void audioDiscDetected(const QString& udi);
+  void audioDiscRemoved(const QString& udi);
+
+private slots:
+  void p_solid_device_added(const QString& udi);
+  void p_solid_device_removed(const QString& udi);
+
+private:
+  QHash<QString, OpticalAudioDisc*> p_discs;
+
+  bool p_is_optical_audio_disc_in_drive(const Solid::Device& device) const;
+
+  void p_clear();
+
+};
+
+#endif
diff --git a/widgets/cddaheaderwidget.cpp b/widgets/cddaheaderwidget.cpp
index 437184b..5bcfca0 100644
--- a/widgets/cddaheaderwidget.cpp
+++ b/widgets/cddaheaderwidget.cpp
@@ -389,7 +389,7 @@ void CDDAHeaderWidget::googleAuto() {
 
   kDebug() << "Google AUTO cover fetch" ;
 
-  if ((cdda_model->discInfo()==CDDAModel::DiscNoInfo) || \
(fetching_cover_in_progress)) return; +  if ((cdda_model->empty()) || \
(fetching_cover_in_progress)) return;  
   QApplication::restoreOverrideCursor();
   cursor_on_cover = FALSE;
@@ -518,7 +518,7 @@ void CDDAHeaderWidget::paintEvent(QPaintEvent *event) {
     font.setBold(TRUE);
     font.setItalic(TRUE);
     p.setFont(font);
-    p.drawText(rect(), Qt::AlignCenter | Qt::AlignVCenter, i18n("No CD in drive"));
+    p.drawText(rect(), Qt::AlignCenter | Qt::AlignVCenter, i18n("No audio CD \
detected"));  
   }
 
@@ -561,7 +561,7 @@ void CDDAHeaderWidget::mousePressEvent(QMouseEvent *event) {
   if (event->button() == Qt::LeftButton) {
     if ((cursor_on_cover) && (!fetching_cover_in_progress)) {
       if (cdda_model->isCoverEmpty()) {
-	if (cdda_model->discInfo() == CDDAModel::DiscNoInfo) {
+	if (cdda_model->empty()) {
 	  load();
 	} else {
 	  google();
@@ -577,7 +577,7 @@ void CDDAHeaderWidget::mousePressEvent(QMouseEvent *event) {
 
 void CDDAHeaderWidget::update() {
 
-  action_collection->action("fetch")->setEnabled(cdda_model->discInfo() != \
CDDAModel::DiscNoInfo); +  \
action_collection->action("fetch")->setEnabled(!cdda_model->empty());  
   bool activate = FALSE;
   if (cdda_model->isCoverEmpty()) {
@@ -656,7 +656,7 @@ void CDDAHeaderWidget::google() {
 
   kDebug() << "Google cover fetch" ;
 
-  if ((cdda_model->discInfo() == CDDAModel::DiscNoInfo) || \
(fetching_cover_in_progress)) return; +  if ((cdda_model->empty()) || \
(fetching_cover_in_progress)) return;  
   QApplication::restoreOverrideCursor();
   cursor_on_cover = FALSE;
diff --git a/widgets/devicewidget.cpp b/widgets/devicewidget.cpp
index 228efc1..c749009 100644
--- a/widgets/devicewidget.cpp
+++ b/widgets/devicewidget.cpp
@@ -22,17 +22,6 @@ deviceWidget::deviceWidget(QWidget* parent) : \
deviceWidgetUI(parent) {  
   Q_UNUSED(parent);
 
-  QStringList devices = KCompactDisc::cdromDeviceNames();
-  kcfg_cdDevice->clear();
-
-  if (devices.isEmpty()) {
-    kcfg_cdDevice->addItem(i18n("None detected"));
-  } else {
-    foreach (const QString &dev, devices) {
-      kcfg_cdDevice->addItem(dev + " (" + KCompactDisc::cdromDeviceUrl(dev).path() + \
                ")");
-    }
-  }
-
 }
 
 deviceWidget::~deviceWidget() {
diff --git a/widgets/devicewidgetUI.ui b/widgets/devicewidgetUI.ui
index e57d370..4df6efa 100644
--- a/widgets/devicewidgetUI.ui
+++ b/widgets/devicewidgetUI.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>268</width>
+    <width>274</width>
     <height>269</height>
    </rect>
   </property>
@@ -18,27 +18,20 @@
      </property>
      <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
-       <layout class="QHBoxLayout" name="_3">
-        <item>
-         <widget class="KComboBox" name="kcfg_cdDevice"/>
-        </item>
-       </layout>
-      </item>
-      <item row="1" column="0">
        <widget class="QCheckBox" name="kcfg_paranoiaMode">
         <property name="text">
          <string>Full paranoia mode (best quality)</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="0">
+      <item row="1" column="0">
        <widget class="QCheckBox" name="kcfg_neverSkip">
         <property name="text">
          <string>Never skip on read error</string>
         </property>
        </widget>
       </item>
-      <item row="3" column="0">
+      <item row="2" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
          <widget class="QLabel" name="label">
@@ -92,11 +85,6 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>KComboBox</class>
-   <extends>QComboBox</extends>
-   <header>kcombobox.h</header>
-  </customwidget>
-  <customwidget>
    <class>KIntSpinBox</class>
    <extends>QSpinBox</extends>
    <header>knuminput.h</header>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic