00001 #ifndef CDRIP_H_
00002 #define CDRIP_H_
00003
00004 #include "metadata.h"
00005
00006 #include <mythtv/mythwidgets.h>
00007 #include <mythtv/mythdialogs.h>
00008
00009 class CdDecoder;
00010 class Encoder;
00011 class Ripper;
00012
00013 class CDScannerThread: public QThread
00014 {
00015 public:
00016 CDScannerThread(Ripper *ripper);
00017 virtual void run();
00018
00019 private:
00020 Ripper *m_parent;
00021 };
00022
00023 class CDEjectorThread: public QThread
00024 {
00025 public:
00026 CDEjectorThread(Ripper *ripper);
00027 virtual void run();
00028
00029 private:
00030 Ripper *m_parent;
00031 };
00032
00033 enum StatusTypes
00034 {
00035 ST_TRACK_TEXT = 0,
00036 ST_OVERALL_TEXT,
00037 ST_STATUS_TEXT,
00038 ST_TRACK_PROGRESS,
00039 ST_TRACK_PERCENT,
00040 ST_TRACK_START,
00041 ST_OVERALL_PROGRESS,
00042 ST_OVERALL_PERCENT,
00043 ST_OVERALL_START,
00044 ST_FINISHED,
00045 ST_ENCODER_ERROR
00046 };
00047
00048 typedef struct
00049 {
00050 int type;
00051 QString text;
00052 int value;
00053 } StatusData;
00054
00055 typedef struct
00056 {
00057 Metadata *metadata;
00058 bool active;
00059 int length;
00060 } RipTrack;
00061
00062 class RipStatus;
00063
00064 class CDRipperThread: public QThread
00065 {
00066 public:
00067 CDRipperThread(RipStatus *parent, QString device,
00068 vector<RipTrack*> *tracks, int quality);
00069 ~CDRipperThread();
00070
00071 void cancel(void);
00072
00073 private:
00074 virtual void run(void);
00075 int ripTrack(QString &cddevice, Encoder *encoder, int tracknum);
00076 void sendEvent(int eventType, const QString &value);
00077 void sendEvent(int eventType, int value);
00078
00079 bool isCancelled(void);
00080
00081 RipStatus *m_parent;
00082 bool m_quit;
00083 QString m_CDdevice;
00084 int m_quality;
00085 vector<RipTrack*> *m_tracks;
00086
00087 int m_totalTracks;
00088 long int m_totalSectors;
00089 long int m_totalSectorsDone;
00090
00091 int m_lastTrackPct;
00092 int m_lastOverallPct;
00093 };
00094
00095 class Ripper : public MythThemedDialog
00096 {
00097 Q_OBJECT
00098 public:
00099 Ripper(QString device, MythMainWindow *parent, const char *name = 0);
00100 ~Ripper(void);
00101
00102 bool somethingWasRipped();
00103 void scanCD(void);
00104 void ejectCD(void);
00105
00106 static QString filenameFromMetadata(Metadata *track, bool createDir = true);
00107 static bool isNewTune(const QString &artist,
00108 const QString &album, const QString &title);
00109
00110 protected slots:
00111 void startRipper(void);
00112 void startScanCD(void);
00113 void startEjectCD(void);
00114 void artistChanged(QString newartist);
00115 void albumChanged(QString newalbum);
00116 void genreChanged(QString newgenre);
00117 void yearChanged(QString newyear);
00118 void compilationChanged(bool state);
00119 void switchTitlesAndArtists();
00120 void reject();
00121 void searchArtist(void);
00122 void searchAlbum(void);
00123 void searchGenre(void);
00124
00125 private:
00126 void wireupTheme(void);
00127 void keyPressEvent(QKeyEvent *e);
00128 void deleteTrack(QString& artist, QString& album, QString& title);
00129 void updateTrackList(void);
00130 void updateTrackLengths(void);
00131 void toggleTrackActive(void);
00132
00133 void trackListDown(bool page);
00134 void trackListUp(bool page);
00135 bool showList(QString caption, QString &value);
00136 void showEditMetadataDialog();
00137 static QString fixFileToken(QString token);
00138 static QString fixFileToken_sl(QString token);
00139
00140 CdDecoder *m_decoder;
00141 UIRemoteEditType *m_artistEdit;
00142 UISelectorType *m_qualitySelector;
00143 UIRemoteEditType *m_albumEdit;
00144 UIRemoteEditType *m_genreEdit;
00145 UIRemoteEditType *m_yearEdit;
00146 UICheckBoxType *m_compilation;
00147 UITextButtonType *m_switchTitleArtist;
00148 UIListType *m_trackList;
00149 UITextButtonType *m_scanButton;
00150 UITextButtonType *m_ripButton;
00151 UIPushButtonType *m_searchArtistButton;
00152 UIPushButtonType *m_searchAlbumButton;
00153 UIPushButtonType *m_searchGenreButton;
00154
00155 int m_currentTrack;
00156 int m_totalTracks;
00157 vector<RipTrack*> *m_tracks;
00158
00159 QString m_albumName, m_artistName, m_genreName, m_year;
00160 QStringList m_searchList;
00161 bool m_somethingwasripped;
00162 bool m_mediaMonitorActive;
00163
00164 QString m_CDdevice;
00165 };
00166
00167
00168 class RipStatus : public MythThemedDialog
00169 {
00170 Q_OBJECT
00171 public:
00172 RipStatus(const QString &device, vector<RipTrack*> *tracks, int quality,
00173 MythMainWindow *parent, const char *name = 0);
00174 ~RipStatus(void);
00175
00176 QString getErrorMessage(void) { return m_errorMessage; }
00177
00178 protected slots:
00179 void startRip(void);
00180
00181 private:
00182 void wireupTheme(void);
00183 void keyPressEvent(QKeyEvent *e);
00184 void customEvent(QCustomEvent *e);
00185
00186 vector<RipTrack*> *m_tracks;
00187 int m_quality;
00188 QString m_CDdevice;
00189 QString m_errorMessage;
00190
00191 UITextType *m_overallText;
00192 UITextType *m_trackText;
00193 UITextType *m_statusText;
00194 UITextType *m_overallPctText;
00195 UITextType *m_trackPctText;
00196 UIStatusBarType *m_overallProgress;
00197 UIStatusBarType *m_trackProgress;
00198
00199 CDRipperThread *m_ripperThread;
00200 };
00201
00202 #endif