[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...
From: |
Ben Levitt |
Subject: |
[Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr... |
Date: |
Wed, 18 Jul 2007 18:15:24 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Ben Levitt <benjie> 07/07/18 18:15:23
Modified files:
src/core : AbstractAudioReader.cpp AbstractAudioReader.h
FlacAudioReader.cpp FlacAudioReader.h
MadAudioReader.cpp MadAudioReader.h
ReadSource.cpp ResampleAudioReader.cpp
ResampleAudioReader.h SFAudioReader.cpp
SFAudioReader.h Song.cpp VorbisAudioReader.cpp
VorbisAudioReader.h core.pro
Log message:
convert AudioReaders to do the deinterlacing
convert AudioReader::read() to take, return frames, not samples
remove use of QVector as buffer from FlacAudioReader
breaks mp3 decoding
possibly breaks resampling
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.41&r2=1.42
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.123&r2=1.124
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.h?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/core.pro?cvsroot=traverso&r1=1.33&r2=1.34
Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- AbstractAudioReader.cpp 18 Jul 2007 13:56:52 -0000 1.8
+++ AbstractAudioReader.cpp 18 Jul 2007 18:15:20 -0000 1.9
@@ -22,7 +22,7 @@
#include "AbstractAudioReader.h"
#include "SFAudioReader.h"
#include "FlacAudioReader.h"
-#include "MadAudioReader.h"
+//#include "MadAudioReader.h"
#include "VorbisAudioReader.h"
#include "ResampleAudioReader.h"
@@ -49,7 +49,7 @@
// Read cnt frames starting at start from the AudioReader, into dst
// uses seek() and read() from AudioReader subclass
-int AbstractAudioReader::read_from(audio_sample_t* dst, nframes_t start,
nframes_t cnt)
+nframes_t AbstractAudioReader::read_from(audio_sample_t** buffer, nframes_t
start, nframes_t count)
{
QMutexLocker locker( &m_mutex );
@@ -65,11 +65,11 @@
}
// printf("read_from:: after_seek from %d, framepos is %d\n", start,
m_readPos);
- int samplesRead = read(dst, cnt);
+ nframes_t framesRead = read(buffer, count);
- m_readPos += samplesRead / get_num_channels();
+ m_readPos += framesRead;
- return samplesRead;
+ return framesRead;
}
@@ -87,9 +87,9 @@
else if (SFAudioReader::can_decode(filename)) {
newReader = new SFAudioReader(filename);
}
- else if (MadAudioReader::can_decode(filename)) {
- newReader = new MadAudioReader(filename);
- }
+// else if (MadAudioReader::can_decode(filename)) {
+// newReader = new MadAudioReader(filename);
+// }
else {
return 0;
}
Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- AbstractAudioReader.h 18 Jul 2007 13:13:05 -0000 1.7
+++ AbstractAudioReader.h 18 Jul 2007 18:15:20 -0000 1.8
@@ -40,9 +40,9 @@
virtual int get_num_channels() = 0;
virtual nframes_t get_length() = 0;
virtual int get_rate() = 0;
- int read_from(audio_sample_t* dst, nframes_t start, nframes_t cnt);
+ nframes_t read_from(audio_sample_t** buffer, nframes_t start, nframes_t
count);
virtual bool seek(nframes_t start) = 0;
- virtual int read(audio_sample_t* dst, int sampleCount) = 0;
+ virtual nframes_t read(audio_sample_t** buffer, nframes_t frameCount) =
0;
static AbstractAudioReader* create_audio_reader(const QString&
filename);
static AbstractAudioReader* create_resampled_audio_reader(const
QString& filename, int converter_type);
Index: FlacAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- FlacAudioReader.cpp 18 Jul 2007 13:13:05 -0000 1.5
+++ FlacAudioReader.cpp 18 Jul 2007 18:15:21 -0000 1.6
@@ -66,7 +66,9 @@
}
void cleanup() {
+ if (internalBuffer) {
delete internalBuffer;
+ }
file->close();
delete file;
finish();
@@ -81,7 +83,9 @@
uint m_bitsPerSample;
uint m_samples;
- QVector<audio_sample_t> *internalBuffer;
+ audio_sample_t *internalBuffer;
+ int bufferSize;
+ int bufferUsed;
int bufferStart;
protected:
@@ -112,7 +116,9 @@
: FLAC::Decoder::Stream()
#endif
{
- internalBuffer = new QVector<audio_sample_t>();
+ internalBuffer = 0;
+ bufferSize = 0;
+ bufferUsed = 0;
bufferStart = 0;
open(filename);
process_until_end_of_metadata();
@@ -135,21 +141,29 @@
unsigned i, c, pos = 0;
unsigned frames = frame->header.blocksize;
- if (internalBuffer->size() > 0) {
- // This shouldn't be happening, but if it does, the code can
handle it now. :)
+ if (bufferUsed > 0) {
+ // This shouldn't be happening
PERROR("internalBuffer is already non-empty");
}
- internalBuffer->resize(internalBuffer->size() + frames *
frame->header.channels);
+ if (bufferSize < frames * frame->header.channels) {
+ if (internalBuffer) {
+ delete internalBuffer;
+ }
+ internalBuffer = new audio_sample_t[frames *
frame->header.channels];
+ bufferSize = frames * frame->header.channels;
+ }
for (i=0; i < frames; i++) {
// in FLAC channel 0 is left, 1 is right
for (c=0; c < frame->header.channels; c++) {
audio_sample_t value =
(audio_sample_t)((float)buffer[c][i] /
(float)((uint)1<<(frame->header.bits_per_sample-1)));
- internalBuffer->data()[bufferStart + (pos++)] = value;
+ internalBuffer[pos++] = value;
}
}
+ bufferUsed = frames * frame->header.channels;
+
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}
@@ -360,7 +374,7 @@
return false;
}
- m_flac->internalBuffer->resize(0);
+ m_flac->bufferUsed = 0;
m_flac->bufferStart = 0;
m_flac->flush();
@@ -374,16 +388,16 @@
}
-int FlacAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t FlacAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
{
Q_ASSERT(m_flac);
- int samplesToCopy;
- int samplesAvailable;
- int samplesCoppied = 0;
+ nframes_t framesToCopy;
+ nframes_t framesAvailable;
+ nframes_t framesCoppied = 0;
- while (samplesCoppied < sampleCount) {
- if (m_flac->internalBuffer->size() == 0) {
+ while (framesCoppied < frameCount) {
+ if (m_flac->bufferUsed == 0) {
// want more data
#ifdef LEGACY_FLAC
if (m_flac->get_state() ==
FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) {
@@ -429,40 +443,57 @@
#endif
}
- samplesAvailable = m_flac->internalBuffer->size() -
m_flac->bufferStart;
- samplesToCopy = (sampleCount - samplesCoppied <
samplesAvailable) ? sampleCount - samplesCoppied : samplesAvailable;
- for (int i = 0; i < samplesToCopy; i++) {
- dst[samplesCoppied + i] =
m_flac->internalBuffer->at(m_flac->bufferStart + i);
+ framesAvailable = (m_flac->bufferUsed - m_flac->bufferStart) /
get_num_channels() ;
+ framesToCopy = (frameCount - framesCoppied < framesAvailable) ?
frameCount - framesCoppied : framesAvailable;
+ switch (get_num_channels()) {
+ case 1:
+ memcpy(buffer[0] + framesCoppied,
m_flac->internalBuffer + m_flac->bufferStart, framesToCopy);
+ break;
+ case 2:
+ for (int i = 0; i < framesToCopy; i++) {
+ buffer[0][framesCoppied + i] =
m_flac->internalBuffer[m_flac->bufferStart + i * 2];
+ buffer[1][framesCoppied + i] =
m_flac->internalBuffer[m_flac->bufferStart + i * 2 + 1];
+ }
+ break;
+ default:
+ for (int i = 0; i < framesToCopy; i++) {
+ for (int c = 0; c < get_num_channels();
c++) {
+ buffer[c][framesCoppied + i] =
m_flac->internalBuffer[m_flac->bufferStart + i * get_num_channels() + c];
+ }
+ }
+ break;
}
- if(samplesToCopy == samplesAvailable) {
- m_flac->internalBuffer->resize(0);
+ if(framesToCopy == framesAvailable) {
+ m_flac->bufferUsed = 0;
m_flac->bufferStart = 0;
}
else {
- m_flac->bufferStart += samplesToCopy;
+ m_flac->bufferStart += framesToCopy *
get_num_channels();
}
- samplesCoppied += samplesToCopy;
+ framesCoppied += framesToCopy;
- //printf("samplesCoppied = %d (%d, %d)\n", samplesCoppied,
m_flac->bufferStart, m_flac->internalBuffer->size());
+ //printf("samplesCoppied = %d (%d, %d)\n", samplesCoppied,
m_flac->bufferStart, m_flac->buferSize);
}
// Pad end of file with 0s if necessary. (Shouldn't be necessary...)
- int remainingSamplesRequested = sampleCount - samplesCoppied;
- int remainingSamplesInFile = get_length() * get_num_channels() -
(m_readPos * get_num_channels() + samplesCoppied);
- if (samplesCoppied == 0 && remainingSamplesInFile > 0) {
- int padLength = (remainingSamplesRequested >
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
+ int remainingFramesRequested = frameCount - framesCoppied;
+ int remainingFramesInFile = get_length() - (m_readPos + framesCoppied);
+ if (framesCoppied == 0 && remainingFramesInFile > 0) {
+ int padLength = (remainingFramesRequested >
remainingFramesInFile) ? remainingFramesInFile : remainingFramesRequested;
//PERROR("padLength: %d", padLength);
- memset(dst + samplesCoppied, 0, padLength *
sizeof(audio_sample_t));
- samplesCoppied += padLength;
+ for (int c = 0; c < get_num_channels(); c++) {
+ memset(buffer[c] + framesCoppied, 0, padLength *
sizeof(audio_sample_t));
+ }
+ framesCoppied += padLength;
}
- if (samplesCoppied > sampleCount) {
+ if (framesCoppied > frameCount) {
//PERROR("Truncating");
- samplesCoppied = sampleCount;
+ framesCoppied = frameCount;
}
//printf("copied %d of %d. nextFrame: %lu of %lu\n", samplesCoppied,
sampleCount, m_readPos, get_length());
- return samplesCoppied;
+ return framesCoppied;
}
Index: FlacAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- FlacAudioReader.h 13 Jul 2007 07:41:02 -0000 1.1
+++ FlacAudioReader.h 18 Jul 2007 18:15:21 -0000 1.2
@@ -37,7 +37,7 @@
nframes_t get_length();
int get_rate();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, int sampleCount);
+ nframes_t read(audio_sample_t** buffer, nframes_t sampleCount);
static bool can_decode(QString filename);
Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- MadAudioReader.cpp 18 Jul 2007 13:13:06 -0000 1.6
+++ MadAudioReader.cpp 18 Jul 2007 18:15:21 -0000 1.7
@@ -767,11 +767,11 @@
}
-int MadAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t MadAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
{
- d->outputBuffer = dst;
- d->outputBufferEnd = d->outputBuffer + sampleCount;
- d->outputPointer = d->outputBuffer;
+ d->outputBuffers = buffer;
+ d->bufferSize = frameCount
+ d->bufferPos = 0;
bool bOutputBufferFull = false;
Index: MadAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- MadAudioReader.h 13 Jul 2007 07:41:02 -0000 1.2
+++ MadAudioReader.h 18 Jul 2007 18:15:21 -0000 1.3
@@ -39,7 +39,7 @@
nframes_t get_length();
int get_rate();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, int sampleCount);
+ nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
static bool can_decode(QString filename);
Index: ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- ReadSource.cpp 18 Jul 2007 13:39:57 -0000 1.41
+++ ReadSource.cpp 18 Jul 2007 18:15:21 -0000 1.42
@@ -211,32 +211,27 @@
trav_time_t starttime = get_microseconds();
#endif
if (m_audioReader->get_num_channels() == 1) {
- int result = m_audioReader->read_from(dst[0], start, cnt);
+ nframes_t result = m_audioReader->read_from(dst, start, cnt);
#if defined (profile)
int processtime = (int) (get_microseconds() - starttime);
if (processtime > 40000)
printf("Process time for %s: %d useconds\n\n",
QS_C(m_fileName), processtime);
#endif
- return result;
+ return (int)result;
}
float *ptr;
- uint real_cnt = cnt * m_audioReader->get_num_channels();
// The readbuffer 'assumes' that there is max 2 channels...
Q_ASSERT(m_audioReader->get_num_channels() <= 2);
- int nread = m_audioReader->read_from(readbuffer, start, real_cnt);
+ nframes_t nread = m_audioReader->read_from(dst, start, cnt);
#if defined (profile)
int processtime = (int) (get_microseconds() - starttime);
if (processtime > 40000)
printf("Process time for %s: %d useconds\n\n",
QS_C(m_fileName), processtime);
#endif
- ptr = readbuffer;
- nread /= m_audioReader->get_num_channels();
-
- /* stride through the interleaved data */
- // FIXME: deinterlace in AudioReader Classes instead of here
+ /*ptr = readbuffer;
for (int32_t n = 0; n < nread; ++n) {
dst[0][n] = *ptr;
@@ -247,8 +242,7 @@
for (int32_t n = 0; n < nread; ++n) {
dst[1][n] = *ptr;
ptr += m_audioReader->get_num_channels();
- }
-
+ }*/
return nread;
}
Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- ResampleAudioReader.cpp 18 Jul 2007 13:13:06 -0000 1.7
+++ ResampleAudioReader.cpp 18 Jul 2007 18:15:21 -0000 1.8
@@ -33,48 +33,49 @@
ResampleAudioReader::ResampleAudioReader(QString filename, int converter_type)
: AbstractAudioReader(filename)
{
- m_fileBuffer = 0;
- m_fileBufferLength = 0;
-
m_reader = AbstractAudioReader::create_audio_reader(filename);
if (!m_reader) {
PERROR("ResampleAudioReader: couldn't create AudioReader");
return;
}
- m_srcState = 0;
+ m_fileBuffers.resize(get_num_channels());
+ m_fileBufferLength = 0;
+
init(converter_type);
}
ResampleAudioReader::~ResampleAudioReader()
{
- if (m_srcState) {
- src_delete(m_srcState);
+ while (m_srcStates.size()) {
+ src_delete(m_srcStates.back());
+ m_srcStates.pop_back();
}
if (m_reader) {
delete m_reader;
}
- if (m_fileBuffer) {
- delete m_fileBuffer;
+ while (m_fileBuffers.size()) {
+ delete m_fileBuffers.back();
+ m_fileBuffers.pop_back();
}
}
void ResampleAudioReader::init(int converter_type)
{
- if (m_srcState) {
- src_delete(m_srcState);
- }
-
int error;
- m_srcState = src_new (converter_type, m_reader->get_num_channels(),
&error);
- if (!m_srcState) {
+
+ for (int c = 0; c < m_reader->get_num_channels(); c++) {
+ m_srcStates.append(src_new(converter_type, 1, &error));
+ if (!m_srcStates[c]) {
PERROR("ResampleAudioReader: couldn't create libSampleRate
SRC_STATE");
delete m_reader;
m_reader = 0;
+ return;
+ }
}
reset();
@@ -85,7 +86,10 @@
// Clear the samplerateconverter to a clean state (used on seek)
void ResampleAudioReader::reset()
{
- src_reset(m_srcState);
+ for (int c = 0; c < m_reader->get_num_channels(); c++) {
+ src_reset(m_srcStates[c]);
+ }
+
m_srcData.end_of_input = 0;
}
@@ -96,6 +100,7 @@
if (m_reader) {
return m_reader->get_num_channels();
}
+
return 0;
}
@@ -109,6 +114,7 @@
}
return file_to_song_frame(m_reader->get_length());
}
+
return 0;
}
@@ -118,8 +124,12 @@
// is anything gonna to know what the 'real' rate of an audiofile is ?
int ResampleAudioReader::get_rate()
{
- return m_reader->get_rate();
-// return audiodevice().get_sample_rate();
+ if (m_reader) {
+ //return m_reader->get_rate();
+ return audiodevice().get_sample_rate();
+ }
+
+ return 0;
}
@@ -141,9 +151,10 @@
// If no conversion is necessary, pass the read straight to the child
AudioReader,
// otherwise get data from childreader and use libsamplerate to convert
-int ResampleAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t ResampleAudioReader::read(audio_sample_t** buffer, nframes_t
frameCount)
{
- uint samplesRead;
+ nframes_t sourceFramesRead;
+ nframes_t framesRead;
Q_ASSERT(m_reader);
/////////////////////////////////
@@ -153,64 +164,69 @@
// pass through if not changing sampleRate.
if (audiodevice().get_sample_rate() == (uint)m_reader->get_rate()) {
- samplesRead = m_reader->read(dst, sampleCount);
- return samplesRead;
+ sourceFramesRead = m_reader->read(buffer, frameCount);
+ return framesRead;
}
- uint fileCnt = (song_to_file_frame(sampleCount / get_num_channels())) *
get_num_channels();
+ nframes_t fileCnt = song_to_file_frame(frameCount);
- if (sampleCount && fileCnt / get_num_channels() < 1) {
- fileCnt = 1 * get_num_channels();
+ if (frameCount && !fileCnt) {
+ fileCnt = 1;
}
- // make sure that the reusable m_fileBuffer is big enough for this read
+ // make sure that the reusable m_fileBuffers are big enough for this
read
if ((uint)m_fileBufferLength < fileCnt) {
- if (m_fileBuffer) {
- delete m_fileBuffer;
+ for (int c = 0; c < get_num_channels(); c++) {
+ if (m_fileBuffers.size()) {
+ delete m_fileBuffers[c];
+ }
+ m_fileBuffers[c] = new audio_sample_t[fileCnt];
}
- m_fileBuffer = new audio_sample_t[fileCnt];
m_fileBufferLength = fileCnt;
}
- samplesRead = m_reader->read(m_fileBuffer, fileCnt);
+ framesRead = m_reader->read(m_fileBuffers.data(), fileCnt);
//printf("Resampler: sampleCount %lu, fileCnt %lu, returned %lu\n",
sampleCount/get_num_channels(), fileCnt/get_num_channels(),
samplesRead/get_num_channels());
+ for (int c = 0; c < get_num_channels(); c++) {
// Set up sample rate converter struct for s.r.c. processing
- m_srcData.data_in = m_fileBuffer;
- m_srcData.input_frames = samplesRead / get_num_channels();
- m_srcData.data_out = dst;
- m_srcData.output_frames = sampleCount / get_num_channels();
+ m_srcData.data_in = m_fileBuffers[c];
+ m_srcData.input_frames = sourceFramesRead;
+ m_srcData.data_out = buffer[c];
+ m_srcData.output_frames = frameCount;
m_srcData.src_ratio = (double) audiodevice().get_sample_rate() /
m_reader->get_rate();
- src_set_ratio(m_srcState, m_srcData.src_ratio);
+ src_set_ratio(m_srcStates[c], m_srcData.src_ratio);
- if (src_process(m_srcState, &m_srcData)) {
+ if (src_process(m_srcStates[c], &m_srcData)) {
PERROR("Resampler: src_process() error!");
return 0;
}
-
- samplesRead = m_srcData.output_frames_gen * get_num_channels();
+ framesRead = m_srcData.output_frames_gen;
+ printf("%lu -- ", framesRead);
+ }
+ printf("(frames read per channel)\n");
// Pad end of file with 0s if necessary
- int remainingSamplesRequested = sampleCount - samplesRead;
- int remainingSamplesInFile = (get_length() - m_readPos -
m_srcData.output_frames_gen) * get_num_channels();
+ int remainingFramesRequested = frameCount - framesRead;
+ int remainingFramesInFile = get_length() - m_readPos -
m_srcData.output_frames_gen;
- if (samplesRead == 0 && remainingSamplesRequested > 0 &&
remainingSamplesInFile > 0) {
- int padLength = (remainingSamplesRequested >
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
- memset(dst + samplesRead, 0, padLength *
sizeof(audio_sample_t));
- samplesRead += padLength;
+ if (framesRead == 0 && remainingFramesRequested > 0 &&
remainingFramesInFile > 0) {
+ int padLength = (remainingFramesRequested >
remainingFramesInFile) ? remainingFramesInFile : remainingFramesRequested;
+ for (int c = 0; c < get_num_channels(); c++) {
+ memset(buffer[c] + framesRead, 0, padLength *
sizeof(audio_sample_t));
+ }
+ framesRead += padLength;
printf("Resampler: padding: %d\n", padLength);
}
// Truncate so we don't return too many samples
- if (samplesRead > (uint)remainingSamplesInFile) {
- printf("Resampler: truncating: %d\n", samplesRead -
remainingSamplesInFile);
- samplesRead = remainingSamplesInFile;
+ if (framesRead > (uint)remainingFramesInFile) {
+ printf("Resampler: truncating: %d\n", framesRead -
remainingFramesInFile);
+ framesRead = remainingFramesInFile;
}
-
- //printf("Resampler: req: %d, got: %d\n", sampleCount, samplesRead);
- return samplesRead;
+ return framesRead;
}
Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- ResampleAudioReader.h 18 Jul 2007 13:13:06 -0000 1.6
+++ ResampleAudioReader.h 18 Jul 2007 18:15:22 -0000 1.7
@@ -23,6 +23,7 @@
#define RESAMPLEAUDIOREADER_H
#include <AbstractAudioReader.h>
+#include <QVector>
#include <samplerate.h>
@@ -37,7 +38,7 @@
nframes_t get_length();
int get_rate();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, int sampleCount);
+ nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
protected:
@@ -47,10 +48,11 @@
nframes_t song_to_file_frame(nframes_t frame);
nframes_t file_to_song_frame(nframes_t frame);
+ bool m_valid;
AbstractAudioReader* m_reader;
- SRC_STATE* m_srcState;
+ QVector<SRC_STATE*> m_srcStates;
SRC_DATA m_srcData;
- audio_sample_t *m_fileBuffer;
+ QVector<audio_sample_t*> m_fileBuffers;
long m_fileBufferLength;
};
Index: SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- SFAudioReader.cpp 18 Jul 2007 13:13:07 -0000 1.4
+++ SFAudioReader.cpp 18 Jul 2007 18:15:22 -0000 1.5
@@ -41,11 +41,18 @@
if ((m_sf = sf_open ((m_fileName.toUtf8().data()), SFM_READ,
&m_sfinfo)) == 0) {
PERROR("Couldn't open soundfile (%s)", QS_C(m_fileName));
}
+
+ m_tmpBuffer = 0;
+ m_tmpBufferSize = 0;
}
SFAudioReader::~SFAudioReader()
{
+ if (m_tmpBuffer) {
+ delete m_tmpBuffer;
+ }
+
if (m_sf) {
if (sf_close(m_sf)) {
qWarning("sf_close returned an error!");
@@ -104,13 +111,6 @@
}
-// Should this exist? Should we just be smarter in MonoReader so we don't
need this?
-bool SFAudioReader::is_compressed()
-{
- return ((m_sfinfo.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_FLAC );
-}
-
-
bool SFAudioReader::seek(nframes_t start)
{
Q_ASSERT(m_sf);
@@ -131,14 +131,38 @@
}
-int SFAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t SFAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
{
Q_ASSERT(m_sf);
- int samplesRead = sf_read_float (m_sf, dst, sampleCount);
+ // Make sure the temp buffer is big enough for this read
+ if (m_tmpBufferSize < frameCount) {
+ if (m_tmpBuffer) {
+ delete m_tmpBuffer;
+ }
+ m_tmpBuffer = new audio_sample_t[frameCount *
get_num_channels()];
+ }
+ nframes_t framesRead = sf_readf_float(m_sf, m_tmpBuffer, frameCount);
- // FIXME: deinterlace here instead of in MonoReader
+ // De-interlace
+ switch (get_num_channels()) {
+ case 1:
+ memcpy(buffer[0], m_tmpBuffer, framesRead *
sizeof(audio_sample_t));
+ break;
+ case 2:
+ for (int f = 0; f < framesRead; f++) {
+ buffer[0][f] = m_tmpBuffer[f * 2];
+ buffer[1][f] = m_tmpBuffer[f * 2 + 1];
+ }
+ break;
+ default:
+ for (int f = 0; f < framesRead; f++) {
+ for (int c = 0; c < get_num_channels(); c++) {
+ buffer[c][f] = m_tmpBuffer[f *
get_num_channels() + c];
+ }
+ }
+ }
- return samplesRead;
+ return framesRead;
}
Index: SFAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- SFAudioReader.h 8 Jul 2007 23:16:56 -0000 1.3
+++ SFAudioReader.h 18 Jul 2007 18:15:22 -0000 1.4
@@ -35,15 +35,16 @@
int get_num_channels();
nframes_t get_length();
int get_rate();
- bool is_compressed();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, int sampleCount);
+ nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
static bool can_decode(QString filename);
protected:
SNDFILE* m_sf;
SF_INFO m_sfinfo;
+ audio_sample_t *m_tmpBuffer;
+ int m_tmpBufferSize;
};
#endif
Index: Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -b -r1.123 -r1.124
--- Song.cpp 18 Jul 2007 13:13:07 -0000 1.123
+++ Song.cpp 18 Jul 2007 18:15:22 -0000 1.124
@@ -1256,6 +1256,7 @@
#if defined (THREAD_CHECK)
Q_ASSERT(QThread::currentThreadId() == threadId);
#endif
+ printf("set_transport_pos(%lu)\n", position);
audiodevice().transport_seek_to(m_audiodeviceClient, position);
}
Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- VorbisAudioReader.cpp 18 Jul 2007 13:13:07 -0000 1.6
+++ VorbisAudioReader.cpp 18 Jul 2007 18:15:23 -0000 1.7
@@ -127,41 +127,37 @@
}
-int VorbisAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t VorbisAudioReader::read(audio_sample_t** buffer, nframes_t
frameCount)
{
Q_ASSERT(m_file);
- nframes_t totalRead = 0;
+ nframes_t totalFramesRead = 0;
- while (totalRead < sampleCount) {
+ while (totalFramesRead < frameCount) {
audio_sample_t** tmp;
int bs;
- int samplesRead = ov_read_float(&m_vf, &tmp, (sampleCount -
totalRead) / get_num_channels(), &bs);
+ nframes_t framesRead = ov_read_float(&m_vf, &tmp, frameCount -
totalFramesRead, &bs);
- if (samplesRead == OV_HOLE) {
+ if (framesRead == OV_HOLE) {
// Hole detected: recursive retry
PERROR("VorbisAudioReader: OV_HOLE");
- return read(dst, sampleCount);
+ return read(buffer, frameCount);
}
- else if (samplesRead == 0) {
+ else if (framesRead == 0) {
/* EOF */
break;
- } else if (samplesRead < 0) {
+ } else if (framesRead < 0) {
/* error in the stream. */
PERROR("VorbisFile decoding error");
break;
}
- // FIXME: Instead of interlacing here, deinterlace in other
AudioReaders!! (since we deinterlace later anyway)
- int frames = samplesRead;
- for (int f=0; f < frames; f++) {
for (int c=0; c < get_num_channels(); c++) {
- dst[totalRead + f * get_num_channels() + c] =
tmp[c][f];
+ memcpy(buffer[c] + totalFramesRead, tmp[c], framesRead
* sizeof(audio_sample_t));
}
- }
- totalRead += samplesRead * get_num_channels();
+ totalFramesRead += framesRead;
}
- return totalRead;
+ return totalFramesRead;
}
Index: VorbisAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- VorbisAudioReader.h 13 Jul 2007 07:41:03 -0000 1.4
+++ VorbisAudioReader.h 18 Jul 2007 18:15:23 -0000 1.5
@@ -38,7 +38,7 @@
nframes_t get_length();
int get_rate();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, int sampleCount);
+ nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
static bool can_decode(QString filename);
Index: core.pro
===================================================================
RCS file: /sources/traverso/traverso/src/core/core.pro,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- core.pro 18 Jul 2007 13:13:05 -0000 1.33
+++ core.pro 18 Jul 2007 18:15:23 -0000 1.34
@@ -55,7 +55,8 @@
FlacAudioReader.cpp \
ResampleAudioReader.cpp \
VorbisAudioReader.cpp \
- MadAudioReader.cpp
+# MadAudioReader.cpp
+
HEADERS = precompile.h \
AudioClip.h \
AudioClipList.h \
@@ -104,7 +105,8 @@
FlacAudioReader.h \
ResampleAudioReader.h \
VorbisAudioReader.h \
- MadAudioReader.h
+# MadAudioReader.h
+
macx{
QMAKE_LIBDIR += /usr/local/qt/lib
}
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/08
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/09
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/13
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/15
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...,
Ben Levitt <=
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/19
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/20
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/24
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/25