annotate data/fileio/ResamplingWavFileReader.cpp @ 308:14e0f60435b8

* Make it possible to drop audio files, layer files, session files and images onto SV panes. Need to do a bit more work on where we expect the dropped file to go, particularly in the case of audio files -- at the moment they're always opened in new panes, but it may be better to by default replace whatever is in the target pane.
author Chris Cannam
date Wed, 10 Oct 2007 15:18:02 +0000
parents c022976d18e8
children 3a6725f285d6
rev   line source
Chris@297 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@297 2
Chris@297 3 /*
Chris@297 4 Sonic Visualiser
Chris@297 5 An audio file viewer and annotation editor.
Chris@297 6 Centre for Digital Music, Queen Mary, University of London.
Chris@297 7 This file copyright 2007 QMUL.
Chris@297 8
Chris@297 9 This program is free software; you can redistribute it and/or
Chris@297 10 modify it under the terms of the GNU General Public License as
Chris@297 11 published by the Free Software Foundation; either version 2 of the
Chris@297 12 License, or (at your option) any later version. See the file
Chris@297 13 COPYING included with this distribution for more information.
Chris@297 14 */
Chris@297 15
Chris@297 16 #include "ResamplingWavFileReader.h"
Chris@297 17
Chris@297 18 #include "WavFileReader.h"
Chris@297 19 #include "base/Profiler.h"
Chris@297 20
Chris@297 21 #include <QProgressDialog>
Chris@297 22 #include <QFileInfo>
Chris@297 23 #include <QApplication>
Chris@297 24
Chris@297 25 ResamplingWavFileReader::ResamplingWavFileReader(QString path,
Chris@297 26 ResampleMode resampleMode,
Chris@297 27 CacheMode mode,
Chris@297 28 size_t targetRate) :
Chris@297 29 CodedAudioFileReader(mode, targetRate),
Chris@297 30 m_path(path),
Chris@297 31 m_cancelled(false),
Chris@297 32 m_processed(0),
Chris@297 33 m_completion(0),
Chris@297 34 m_original(0),
Chris@297 35 m_progress(0),
Chris@297 36 m_decodeThread(0)
Chris@297 37 {
Chris@297 38 m_channelCount = 0;
Chris@297 39 m_fileRate = 0;
Chris@297 40
Chris@297 41 std::cerr << "ResamplingWavFileReader::ResamplingWavFileReader(\""
Chris@297 42 << path.toStdString() << "\"): rate " << targetRate << std::endl;
Chris@297 43
Chris@297 44 Profiler profiler("ResamplingWavFileReader::ResamplingWavFileReader", true);
Chris@297 45
Chris@297 46 m_original = new WavFileReader(path);
Chris@297 47 if (!m_original->isOK()) {
Chris@297 48 m_error = m_original->getError();
Chris@297 49 return;
Chris@297 50 }
Chris@297 51
Chris@297 52 m_channelCount = m_original->getChannelCount();
Chris@297 53 m_fileRate = m_original->getSampleRate();
Chris@297 54
Chris@297 55 initialiseDecodeCache();
Chris@297 56
Chris@297 57 if (resampleMode == ResampleAtOnce) {
Chris@297 58
Chris@297 59 m_progress = new QProgressDialog
Chris@297 60 (QObject::tr("Resampling %1...").arg(QFileInfo(path).fileName()),
Chris@297 61 QObject::tr("Stop"), 0, 100);
Chris@297 62 m_progress->hide();
Chris@297 63
Chris@297 64 size_t blockSize = 16384;
Chris@297 65 size_t total = m_original->getFrameCount();
Chris@297 66
Chris@297 67 SampleBlock block;
Chris@297 68
Chris@297 69 for (size_t i = 0; i < total; i += blockSize) {
Chris@297 70
Chris@297 71 size_t count = blockSize;
Chris@297 72 if (i + count > total) count = total - i;
Chris@297 73
Chris@297 74 m_original->getInterleavedFrames(i, count, block);
Chris@297 75 addBlock(block);
Chris@297 76
Chris@297 77 if (m_cancelled) break;
Chris@297 78 }
Chris@297 79
Chris@297 80 if (isDecodeCacheInitialised()) finishDecodeCache();
Chris@297 81
Chris@297 82 delete m_original;
Chris@297 83 m_original = 0;
Chris@297 84
Chris@297 85 delete m_progress;
Chris@297 86 m_progress = 0;
Chris@297 87
Chris@297 88 } else {
Chris@297 89
Chris@297 90 m_decodeThread = new DecodeThread(this);
Chris@297 91 m_decodeThread->start();
Chris@297 92 }
Chris@297 93 }
Chris@297 94
Chris@297 95 ResamplingWavFileReader::~ResamplingWavFileReader()
Chris@297 96 {
Chris@297 97 if (m_decodeThread) {
Chris@297 98 m_cancelled = true;
Chris@297 99 m_decodeThread->wait();
Chris@297 100 delete m_decodeThread;
Chris@297 101 }
Chris@297 102
Chris@297 103 delete m_original;
Chris@297 104 }
Chris@297 105
Chris@297 106 void
Chris@297 107 ResamplingWavFileReader::DecodeThread::run()
Chris@297 108 {
Chris@297 109 if (m_reader->m_cacheMode == CacheInTemporaryFile) {
Chris@297 110 m_reader->startSerialised("ResamplingWavFileReader::Decode");
Chris@297 111 }
Chris@297 112
Chris@297 113 size_t blockSize = 16384;
Chris@297 114 size_t total = m_reader->m_original->getFrameCount();
Chris@297 115
Chris@297 116 SampleBlock block;
Chris@297 117
Chris@297 118 for (size_t i = 0; i < total; i += blockSize) {
Chris@297 119
Chris@297 120 size_t count = blockSize;
Chris@297 121 if (i + count > total) count = total - i;
Chris@297 122
Chris@297 123 m_reader->m_original->getInterleavedFrames(i, count, block);
Chris@297 124 m_reader->addBlock(block);
Chris@297 125
Chris@297 126 if (m_reader->m_cancelled) break;
Chris@297 127 }
Chris@297 128
Chris@297 129 if (m_reader->isDecodeCacheInitialised()) m_reader->finishDecodeCache();
Chris@297 130 m_reader->m_completion = 100;
Chris@297 131
Chris@297 132 m_reader->endSerialised();
Chris@297 133
Chris@297 134 delete m_reader->m_original;
Chris@297 135 m_reader->m_original = 0;
Chris@297 136 }
Chris@297 137
Chris@297 138 void
Chris@297 139 ResamplingWavFileReader::addBlock(const SampleBlock &frames)
Chris@297 140 {
Chris@297 141 addSamplesToDecodeCache(frames);
Chris@297 142
Chris@297 143 m_processed += frames.size();
Chris@297 144
Chris@297 145 int progress = lrint((float(m_processed) * 100) /
Chris@297 146 float(m_original->getFrameCount()));
Chris@297 147
Chris@297 148 if (progress > 99) progress = 99;
Chris@297 149 m_completion = progress;
Chris@297 150
Chris@297 151 if (m_progress) {
Chris@297 152 if (progress > m_progress->value()) {
Chris@297 153 m_progress->setValue(progress);
Chris@297 154 m_progress->show();
Chris@297 155 m_progress->raise();
Chris@297 156 qApp->processEvents();
Chris@297 157 if (m_progress->wasCanceled()) {
Chris@297 158 m_cancelled = true;
Chris@297 159 }
Chris@297 160 }
Chris@297 161 }
Chris@297 162 }
Chris@297 163
Chris@297 164 void
Chris@297 165 ResamplingWavFileReader::getSupportedExtensions(std::set<QString> &extensions)
Chris@297 166 {
Chris@297 167 WavFileReader::getSupportedExtensions(extensions);
Chris@297 168 }
Chris@297 169
Chris@297 170