From 04c5531ec85c6e5a4b9e8d2c166e93f32961e442 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sat, 5 Sep 2009 22:30:11 -0400 Subject: Added dvd drive skeleton. --- AnyRip.pro | 9 ++++++--- dvdimagejob.cpp | 23 ++++++++++++----------- dvdimagejob.h | 8 +++++--- imagegui.cpp | 14 +++++++++++++- imagegui.h | 3 +++ job.h | 2 +- main.cpp | 4 ++++ video.cpp | 15 +++++++++++---- video.h | 7 +++++-- 9 files changed, 60 insertions(+), 25 deletions(-) diff --git a/AnyRip.pro b/AnyRip.pro index c25596f..a84415f 100644 --- a/AnyRip.pro +++ b/AnyRip.pro @@ -1,11 +1,14 @@ SOURCES += main.cpp \ - dvdimagejob.cpp \ + dvdimagejob.cpp \ imagegui.cpp \ job.cpp \ - video.cpp + video.cpp \ + dvddrive.cpp HEADERS += dvdimagejob.h \ imagegui.h \ job.h \ - video.h + video.h \ + dvddrive.h LIBS += -ldvdcss \ -ldvdread +QT += dbus diff --git a/dvdimagejob.cpp b/dvdimagejob.cpp index 89e89e0..98fe537 100644 --- a/dvdimagejob.cpp +++ b/dvdimagejob.cpp @@ -1,7 +1,5 @@ -// Much of the CSS logic comes from Bryan Ford's Netsteria -// http://www.google.com/codesearch/p?hl=en&sa=N&cd=10&ct=rc#PY4_fj37fsw/uia/netsteria/dvd/read.cc&q=DVDCSS_SEEK_KEY - #include "dvdimagejob.h" +#include "dvddrive.h" #include #include #include @@ -12,10 +10,10 @@ #include #include -DVDImageJob::DVDImageJob(Video *video) - : Job(video) +DVDImageJob::DVDImageJob(Video *video, DVDDrive *dvdDrive) + : Job(video), + m_dvdDrive(dvdDrive) { - //Initialize something... } int DVDImageJob::cmpvob(const void *p1, const void *p2) @@ -32,7 +30,7 @@ int DVDImageJob::cmpvob(const void *p1, const void *p2) bool DVDImageJob::executeJob() { - return saveImageToPath(QLatin1String("/dev/dvd"), QLatin1String("image.iso")); //Fix up + return saveImageToPath(QLatin1String("image.iso")); //Fix up } Video::Jobs DVDImageJob::jobType() @@ -40,17 +38,20 @@ Video::Jobs DVDImageJob::jobType() return Video::DVDImage; } -bool DVDImageJob::saveImageToPath(const QString &dvdDevice, const QString &path) +bool DVDImageJob::saveImageToPath(const QString &path) { QFile file(path); file.open(QFile::WriteOnly); - bool ret = saveImageToDevice(dvdDevice, file); + bool ret = saveImageToDevice(file); file.close(); return ret; } -bool DVDImageJob::saveImageToDevice(const QString &dvdDevice, QIODevice &out) +// Much of the CSS logic comes from Bryan Ford's Netsteria +// http://www.google.com/codesearch/p?hl=en&sa=N&cd=10&ct=rc#PY4_fj37fsw/uia/netsteria/dvd/read.cc&q=DVDCSS_SEEK_KEY +bool DVDImageJob::saveImageToDevice(QIODevice &out) { + QString dvdDevice = m_dvdDrive->dvdDevice(); dvd_reader_t *dvdr = DVDOpen(dvdDevice.toStdString().c_str()); if (!dvdr) { qDebug() << "can't open DVD (dvdread)"; @@ -121,7 +122,7 @@ bool DVDImageJob::saveImageToDevice(const QString &dvdDevice, QIODevice &out) return false; } - int blkno = 3943433; + int blkno = 0; int curvob = 0; while (1) { //printf("% 3d%%: block %d of %d (byte %lld of %lld)\r", diff --git a/dvdimagejob.h b/dvdimagejob.h index 6d97b6b..4a99f16 100644 --- a/dvdimagejob.h +++ b/dvdimagejob.h @@ -2,15 +2,16 @@ #define DVDIMAGEJOB_H #include "job.h" +class DVDDrive; class QIODevice; class DVDImageJob : public Job { Q_OBJECT public: - DVDImageJob(Video *video); - bool saveImageToDevice(const QString &dvdDevice, QIODevice &out); - bool saveImageToPath(const QString &dvdDevice, const QString &path); + DVDImageJob(Video *video, DVDDrive *dvdDrive); + bool saveImageToDevice(QIODevice &out); + bool saveImageToPath(const QString &path); Video::Jobs jobType(); private: @@ -18,6 +19,7 @@ private: typedef struct vobfile { int32_t start, end; } vobfile; + DVDDrive *m_dvdDrive; protected: bool executeJob(); diff --git a/imagegui.cpp b/imagegui.cpp index 5180c22..52c5790 100644 --- a/imagegui.cpp +++ b/imagegui.cpp @@ -1,5 +1,6 @@ #include "imagegui.h" #include "dvdimagejob.h" +#include "dvddrive.h" #include #include #include @@ -9,7 +10,18 @@ ImageGui::ImageGui() { - Video *video = new Video(); + m_dvdDrive = new DVDDrive(this); + if (m_dvdDrive->dvdInserted()) { + startImaging(); + } else { + setWindowTitle(tr("Please insert DVD...")); + connect(m_dvdDrive, SIGNAL(dvdAdded()), this, SLOT(startImaging())); + } +} +void ImageGui::startImaging() +{ + setWindowTitle(tr("Starting imaging...")); + Video *video = new Video(m_dvdDrive); Job *job = video->nextJob(); m_first = true; connect(job, SIGNAL(extractProgress(int,int)), this, SLOT(extractProgress(int,int))); diff --git a/imagegui.h b/imagegui.h index 98e91e1..ddd731e 100644 --- a/imagegui.h +++ b/imagegui.h @@ -3,6 +3,7 @@ #include #include +class DVDDrive; class ImageGui : public QProgressBar { @@ -14,9 +15,11 @@ public: private: QTime m_startTime; bool m_first; + DVDDrive *m_dvdDrive; private slots: void extractProgress(int current, int maximum); + void startImaging(); }; #endif // IMAGEGUI_H diff --git a/job.h b/job.h index b5a7513..c0b1750 100644 --- a/job.h +++ b/job.h @@ -9,10 +9,10 @@ class Job : public QObject { Q_OBJECT public: - Job(QObject *parent = 0); void runJob(); virtual Video::Jobs jobType() = 0; protected: + Job(QObject *parent = 0); virtual bool executeJob() = 0; private: QFutureWatcher *m_watcher; diff --git a/main.cpp b/main.cpp index b061ad0..9e8963d 100644 --- a/main.cpp +++ b/main.cpp @@ -1,9 +1,13 @@ #include "imagegui.h" +#include "dvddrive.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); + + DVDDrive drive; + drive.eject(); a.setApplicationName(QLatin1String("AnyRip")); a.setOrganizationName(QLatin1String("AnyClip")); a.setOrganizationDomain(QLatin1String("anyclip.com")); diff --git a/video.cpp b/video.cpp index 0daccf2..9a8527e 100644 --- a/video.cpp +++ b/video.cpp @@ -1,10 +1,13 @@ #include "video.h" #include "job.h" #include "dvdimagejob.h" +#include "dvddrive.h" -Video::Video() : m_jobsCompleted(QBitArray(5)) +Video::Video(DVDDrive *dvdDrive) : + m_jobsCompleted(QBitArray(5)), + m_dvdDrive(dvdDrive) { - //Do something + m_title = dvdDrive->dvdName(); } void Video::completedJob(bool success) { @@ -25,10 +28,14 @@ Job* Video::nextJob() { Job *job; if (!m_jobsCompleted.at(Video::DVDImage)) { - job = new DVDImageJob(this); + job = new DVDImageJob(this, m_dvdDrive); } else { - return job = 0; //Other jobs... + job = 0; //Other jobs... } connect(job, SIGNAL(completed(bool)), this, SLOT(completedJob(bool))); return job; } +bool Video::isJobComplete(Jobs job) const +{ + return m_jobsCompleted.at(job); +} diff --git a/video.h b/video.h index cf8cb73..4efee93 100644 --- a/video.h +++ b/video.h @@ -1,20 +1,23 @@ #ifndef VIDEO_H #define VIDEO_H - #include #include class Job; +class DVDDrive; class Video : public QObject { Q_OBJECT public: - Video(); + Video(DVDDrive *dvdDrive); enum Jobs { DVDImage, EncodeMP4, Upload, Subtitle, Poster }; Job* nextJob(); + bool isJobComplete(Jobs job) const; private: QBitArray m_jobsCompleted; + QString m_title; + DVDDrive *m_dvdDrive; private slots: void completedJob(bool success); }; -- cgit v1.2.3-59-g8ed1b