28 #include <QMutexLocker> 33 m_cacheMode(cacheMode),
37 m_cacheFileWritePtr(0),
39 m_cacheWriteBuffer(0),
40 m_cacheWriteBufferIndex(0),
41 m_cacheWriteBufferSize(16384),
45 m_normalised(normalised),
49 SVDEBUG <<
"CodedAudioFileReader::CodedAudioFileReader: rate " << targetRate <<
", normalised = " << normalised << endl;
63 SVDEBUG <<
"CodedAudioFileReader::~CodedAudioFileReader: deleting cache file reader" << endl;
70 cerr <<
"WARNING: CodedAudioFileReader::~CodedAudioFileReader: Failed to delete cache file \"" <<
m_cacheFileName <<
"\"" << endl;
81 SVDEBUG <<
"CodedAudioFileReader::startSerialised(" <<
id <<
")" << endl;
101 SVDEBUG <<
"CodedAudioFileReader::initialiseDecodeCache: file rate = " <<
m_fileRate << endl;
104 cerr <<
"CodedAudioFileReader::initialiseDecodeCache: ERROR: File sample rate unknown (bug in subclass implementation?)" << endl;
105 throw FileOperationFailed(
"(coded file)",
"File sample rate unknown (bug in subclass implementation?)");
109 SVDEBUG <<
"CodedAudioFileReader::initialiseDecodeCache: rate (from file) = " <<
m_fileRate << endl;
129 .arg((intptr_t)
this));
138 fileInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
141 SFM_WRITE, &fileInfo);
153 cerr <<
"ERROR: CodedAudioFileReader::initialiseDecodeCache: Failed to construct WAV file reader for temporary file: " <<
m_cacheFileReader->
getError() << endl;
161 cerr <<
"CodedAudioFileReader::initialiseDecodeCache: failed to open cache file \"" <<
m_cacheFileName <<
"\" (" <<
m_channelCount <<
" channels, sample rate " <<
m_sampleRate <<
" for writing, falling back to in-memory cache" << endl;
166 cerr <<
"CodedAudioFileReader::initialiseDecodeCache: failed to create temporary directory! Falling back to in-memory cache" << endl;
185 for (
int i = 0; i < nframes; ++i) {
189 float sample = samples[c][i];
215 for (
int i = 0; i < nframes; ++i) {
245 for (
int i = 0; i < (int)samples.size(); ++i) {
247 float sample = samples[i];
270 Profiler profiler(
"CodedAudioFileReader::finishDecodeCache",
true);
273 cerr <<
"WARNING: CodedAudioFileReader::finishDecodeCache: Cache was never initialised!" << endl;
321 for (
int i = 0; i < count; ++i) {
322 float v = fabsf(buffer[i]);
329 for (
int i = 0; i < count; ++i) {
330 if (buffer[i] > clip) buffer[i] = clip;
332 for (
int i = 0; i < count; ++i) {
333 if (buffer[i] < -clip) buffer[i] = -clip;
351 for (
int s = 0; s < count; ++s) {
352 m_data.push_back(buffer[s]);
362 float ratio,
bool final)
364 SVDEBUG <<
"pushBufferResampling: ratio = " << ratio <<
", sz = " << sz <<
", final = " <<
final << endl;
389 float *padding =
new float[padSamples];
390 for (
int i = 0; i < padSamples; ++i) padding[i] = 0.f;
417 SVDEBUG <<
"CodedAudioFileReader::getInterleavedFrames: not initialised" << endl;
433 if (count == 0)
return;
441 frames.push_back(
m_data[idx]);
float * m_cacheWriteBuffer
int resampleInterleaved(float *in, float *out, int incount, float ratio, bool final=false)
std::vector< float > SampleBlock
Reader for audio files using libsndfile.
void pushBufferResampling(float *interleaved, int sz, float ratio, bool final)
int m_cacheWriteBufferIndex
SNDFILE * m_cacheFileWritePtr
int m_cacheWriteBufferSize
void addSamplesToDecodeCache(float **samples, int nframes)
CodedAudioFileReader(CacheMode cacheMode, int targetRate, bool normalised)
virtual ~CodedAudioFileReader()
static TempDirectory * getInstance()
void pushBufferNonResampling(float *interleaved, int sz)
#define MUNLOCK_SAMPLEBLOCK(a)
void pushBuffer(float *interleaved, int sz, bool final)
virtual void getInterleavedFrames(int start, int count, SampleBlock &frames) const
Return interleaved samples for count frames from index start.
WavFileReader * m_cacheFileReader
virtual void getInterleavedFrames(int start, int count, SampleBlock &frames) const
Must be safe to call from multiple threads with different arguments on the same object at the same ti...
Serialiser * m_serialiser
virtual QString getError() const
void initialiseDecodeCache()
void startSerialised(QString id)
QReadWriteLock m_dataLock
Profile point instance class.