ResamplingWavFileReader.cpp

Go to the documentation of this file.
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
00002 
00003 /*
00004     Sonic Visualiser
00005     An audio file viewer and annotation editor.
00006     Centre for Digital Music, Queen Mary, University of London.
00007     This file copyright 2007 QMUL.
00008     
00009     This program is free software; you can redistribute it and/or
00010     modify it under the terms of the GNU General Public License as
00011     published by the Free Software Foundation; either version 2 of the
00012     License, or (at your option) any later version.  See the file
00013     COPYING included with this distribution for more information.
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 

Generated on Wed Feb 20 15:45:27 2008 for SonicVisualiser by  doxygen 1.5.1