File indexing completed on 2024-04-28 12:37:47
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