00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "ResamplingWavFileReader.h"
00017
00018 #include "WavFileReader.h"
00019 #include "base/Profiler.h"
00020
00021 #include <QProgressDialog>
00022 #include <QFileInfo>
00023 #include <QApplication>
00024
00025 ResamplingWavFileReader::ResamplingWavFileReader(FileSource source,
00026 ResampleMode resampleMode,
00027 CacheMode mode,
00028 size_t targetRate) :
00029 CodedAudioFileReader(mode, targetRate),
00030 m_source(source),
00031 m_path(source.getLocalFilename()),
00032 m_cancelled(false),
00033 m_processed(0),
00034 m_completion(0),
00035 m_original(0),
00036 m_progress(0),
00037 m_decodeThread(0)
00038 {
00039 m_channelCount = 0;
00040 m_fileRate = 0;
00041
00042 std::cerr << "ResamplingWavFileReader::ResamplingWavFileReader(\""
00043 << m_path.toStdString() << "\"): rate " << targetRate << std::endl;
00044
00045 Profiler profiler("ResamplingWavFileReader::ResamplingWavFileReader", true);
00046
00047 m_original = new WavFileReader(m_path);
00048 if (!m_original->isOK()) {
00049 m_error = m_original->getError();
00050 return;
00051 }
00052
00053 m_channelCount = m_original->getChannelCount();
00054 m_fileRate = m_original->getSampleRate();
00055
00056 initialiseDecodeCache();
00057
00058 if (resampleMode == ResampleAtOnce) {
00059
00060 if (dynamic_cast<QApplication *>(QCoreApplication::instance())) {
00061 m_progress = new QProgressDialog
00062 (QObject::tr("Resampling %1...").arg(QFileInfo(m_path).fileName()),
00063 QObject::tr("Stop"), 0, 100);
00064 m_progress->hide();
00065 }
00066
00067 size_t blockSize = 16384;
00068 size_t total = m_original->getFrameCount();
00069
00070 SampleBlock block;
00071
00072 for (size_t i = 0; i < total; i += blockSize) {
00073
00074 size_t count = blockSize;
00075 if (i + count > total) count = total - i;
00076
00077 m_original->getInterleavedFrames(i, count, block);
00078 addBlock(block);
00079
00080 if (m_cancelled) break;
00081 }
00082
00083 if (isDecodeCacheInitialised()) finishDecodeCache();
00084
00085 delete m_original;
00086 m_original = 0;
00087
00088 delete m_progress;
00089 m_progress = 0;
00090
00091 } else {
00092
00093 m_decodeThread = new DecodeThread(this);
00094 m_decodeThread->start();
00095 }
00096 }
00097
00098 ResamplingWavFileReader::~ResamplingWavFileReader()
00099 {
00100 if (m_decodeThread) {
00101 m_cancelled = true;
00102 m_decodeThread->wait();
00103 delete m_decodeThread;
00104 }
00105
00106 delete m_original;
00107 }
00108
00109 void
00110 ResamplingWavFileReader::DecodeThread::run()
00111 {
00112 if (m_reader->m_cacheMode == CacheInTemporaryFile) {
00113 m_reader->startSerialised("ResamplingWavFileReader::Decode");
00114 }
00115
00116 size_t blockSize = 16384;
00117 size_t total = m_reader->m_original->getFrameCount();
00118
00119 SampleBlock block;
00120
00121 for (size_t i = 0; i < total; i += blockSize) {
00122
00123 size_t count = blockSize;
00124 if (i + count > total) count = total - i;
00125
00126 m_reader->m_original->getInterleavedFrames(i, count, block);
00127 m_reader->addBlock(block);
00128
00129 if (m_reader->m_cancelled) break;
00130 }
00131
00132 if (m_reader->isDecodeCacheInitialised()) m_reader->finishDecodeCache();
00133 m_reader->m_completion = 100;
00134
00135 m_reader->endSerialised();
00136
00137 delete m_reader->m_original;
00138 m_reader->m_original = 0;
00139 }
00140
00141 void
00142 ResamplingWavFileReader::addBlock(const SampleBlock &frames)
00143 {
00144 addSamplesToDecodeCache(frames);
00145
00146 m_processed += frames.size();
00147
00148 int progress = lrint((float(m_processed) * 100) /
00149 float(m_original->getFrameCount()));
00150
00151 if (progress > 99) progress = 99;
00152 m_completion = progress;
00153
00154 if (m_progress) {
00155 if (progress > m_progress->value()) {
00156 m_progress->setValue(progress);
00157 m_progress->show();
00158 m_progress->raise();
00159 qApp->processEvents();
00160 if (m_progress->wasCanceled()) {
00161 m_cancelled = true;
00162 }
00163 }
00164 }
00165 }
00166
00167 void
00168 ResamplingWavFileReader::getSupportedExtensions(std::set<QString> &extensions)
00169 {
00170 WavFileReader::getSupportedExtensions(extensions);
00171 }
00172
00173 bool
00174 ResamplingWavFileReader::supportsExtension(QString extension)
00175 {
00176 return WavFileReader::supportsExtension(extension);
00177 }
00178
00179 bool
00180 ResamplingWavFileReader::supportsContentType(QString type)
00181 {
00182 return WavFileReader::supportsContentType(type);
00183 }
00184
00185 bool
00186 ResamplingWavFileReader::supports(FileSource &source)
00187 {
00188 return WavFileReader::supports(source);
00189 }
00190
00191