File indexing completed on 2024-04-14 04:43:16

0001 /* AUDEX CDDA EXTRACTOR
0002  * SPDX-FileCopyrightText: Copyright (C) 2007 Marco Nelles
0003  * <https://userbase.kde.org/Audex>
0004  *
0005  * SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 
0008 #ifndef CDDAEXTRACTTHREAD_HEADER
0009 #define CDDAEXTRACTTHREAD_HEADER
0010 
0011 #include <QHash>
0012 #include <QString>
0013 #include <QThread>
0014 
0015 #include <KLocalizedString>
0016 
0017 #include "cddacdio.h"
0018 
0019 class CDDAExtractThread : public QThread
0020 {
0021     Q_OBJECT
0022 public:
0023     CDDAExtractThread(QObject *parent, CDDACDIO *cdio);
0024     ~CDDAExtractThread() override;
0025 
0026 public Q_SLOTS:
0027     void start();
0028     void cancel();
0029     void setParanoiaFullMode(const bool mode)
0030     {
0031         paranoia_full_mode = mode;
0032     }
0033     void setParanoiaMaxRetries(const int max_retries)
0034     {
0035         paranoia_retries = max_retries;
0036     }
0037     void setParanoiaNeverSkip(const bool never_skip)
0038     {
0039         paranoia_never_skip = never_skip;
0040     }
0041     void setSkipReadingErrors(const bool skip_reading_errors)
0042     {
0043         this->skip_reading_errors = skip_reading_errors;
0044     }
0045     int setSampleOffset(const int offset)
0046     {
0047         if (offset == 0) {
0048             sample_offset = 0;
0049             sector_offset = 0;
0050         }
0051 
0052         sample_offset = offset;
0053 
0054         // How many full sectors are sample offset?
0055         sector_offset = sample_offset / CD_FRAMESIZE_SAMPLES;
0056         sample_offset_fraction = sample_offset % CD_FRAMESIZE_SAMPLES;
0057 
0058         if (sample_offset < 0) {
0059             sample_offset_fraction -= CD_FRAMESIZE_SAMPLES;
0060             --sector_offset;
0061         }
0062 
0063         return 0;
0064     }
0065     void setTrackToRip(const track_t t)
0066     {
0067         track = t;
0068     } // if t==0 rip whole cd
0069     void skipTrack(const track_t t)
0070     {
0071         overall_sectors_read += p_cdio->numOfFramesOfTrack(t);
0072     }
0073 
0074     bool isProcessing();
0075 
0076     const QStringList &log();
0077 
0078     CDDACDIO *cdio()
0079     {
0080         return p_cdio;
0081     }
0082 
0083     void reset();
0084 
0085 private Q_SLOTS:
0086     void slot_error(const QString &message, const QString &details);
0087 
0088 Q_SIGNALS:
0089     void output(const QByteArray &);
0090 
0091     void progress(const int percent, const int sector, const int sectorsOverall);
0092 
0093     void error(const QString &message, const QString &details = QString());
0094     void warning(const QString &message);
0095     void info(const QString &message);
0096 
0097 protected:
0098     /** reimplemented from QThread. Does the work */
0099     void run() override;
0100 
0101 private:
0102     CDDACDIO *p_cdio;
0103 
0104     long first_sector;
0105     long current_sector;
0106     long last_sector;
0107     unsigned long sectors_read;
0108     unsigned long overall_sectors_read;
0109     unsigned long sectors_all;
0110 
0111     bool paranoia_full_mode;
0112     int paranoia_retries;
0113     bool paranoia_never_skip;
0114     bool skip_reading_errors;
0115     QMap<paranoia_cb_mode_t, int> paranoia_status_count;
0116     QHash<int, paranoia_cb_mode_t> paranoia_status_table;
0117 
0118     QByteArray silence;
0119 
0120     int sample_offset;
0121     int sector_offset;
0122     int sample_offset_fraction;
0123     QByteArray sample_offset_fraction_buffer;
0124 
0125     track_t track;
0126 
0127     bool b_first_run;
0128     bool b_interrupt;
0129     bool b_error;
0130 
0131     QStringList p_log;
0132 
0133     void create_status(long, paranoia_cb_mode_t);
0134     long status_previous_sector;
0135 
0136     // this friend function will call create_status(long, paranoia_cb_mode_t)
0137     friend void paranoia_callback(long, paranoia_cb_mode_t);
0138 };
0139 
0140 #endif