[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: |
Sun, 15 Jul 2007 05:14:48 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Ben Levitt <benjie> 07/07/15 05:14:48
Modified files:
src/core : AbstractAudioReader.cpp AbstractAudioReader.h
FlacAudioReader.cpp MadAudioReader.cpp
ResampleAudioReader.cpp ResampleAudioReader.h
VorbisAudioReader.cpp
Log message:
- Flac seems to be solid now (yay!)
- A few other little fixes...
- The only crash I still see is that, when dynamic resampling is
enabled, the mp3
decoder crashes instantly (booo)
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5
Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- AbstractAudioReader.cpp 13 Jul 2007 07:41:02 -0000 1.5
+++ AbstractAudioReader.cpp 15 Jul 2007 05:14:47 -0000 1.6
@@ -97,11 +97,11 @@
// Static method used by other classes to get an automatically resampling
AudioReader that wraps
// an AudioReader chosen by create_audio_reader().
-AbstractAudioReader*
AbstractAudioReader::create_resampled_audio_reader(QString filename)
+AbstractAudioReader*
AbstractAudioReader::create_resampled_audio_reader(QString filename, int
converter_type)
{
ResampleAudioReader* newReader;
- newReader = new ResampleAudioReader(filename);
+ newReader = new ResampleAudioReader(filename, converter_type);
if (newReader->get_rate() > 0) {
return newReader;
Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- AbstractAudioReader.h 13 Jul 2007 07:41:02 -0000 1.5
+++ AbstractAudioReader.h 15 Jul 2007 05:14:47 -0000 1.6
@@ -44,7 +44,7 @@
virtual int read(audio_sample_t* dst, int sampleCount) = 0;
static AbstractAudioReader* create_audio_reader(QString filename);
- static AbstractAudioReader* create_resampled_audio_reader(QString
filename);
+ static AbstractAudioReader* create_resampled_audio_reader(QString
filename, int converter_type);
static bool can_decode(QString filename) { return false; };
protected:
Index: FlacAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- FlacAudioReader.cpp 13 Jul 2007 07:41:02 -0000 1.1
+++ FlacAudioReader.cpp 15 Jul 2007 05:14:47 -0000 1.2
@@ -135,13 +135,18 @@
unsigned i, c, pos = 0;
unsigned frames = frame->header.blocksize;
- internalBuffer->resize(frames * frame->header.channels);
+ if (internalBuffer->size() > 0) {
+ // This shouldn't be happening, but if it does, the code can
handle it now. :)
+ PERROR("internalBuffer is already non-empty");
+ }
+
+ internalBuffer->resize(internalBuffer->size() + 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)));
- internalBuffer->data()[++pos] = value;
+ internalBuffer->data()[bufferStart + (++pos)] = value;
}
}
@@ -358,6 +363,8 @@
m_flac->internalBuffer->resize(0);
m_flac->bufferStart = 0;
+ m_flac->flush();
+
if (!m_flac->seek(start)) {
PERROR("FlacAudioReader: could not seek to frame %d within %s",
start, QS_C(m_fileName));
return false;
@@ -383,36 +390,42 @@
#ifdef LEGACY_FLAC
if (m_flac->get_state() ==
FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) {
//printf("flac file finish\n");
- m_flac->finish();
- m_flac->init();
+ m_flac->reset();
break;
}
else if(m_flac->get_state() ==
FLAC__SEEKABLE_STREAM_DECODER_OK) {
//printf("process1\n");
if (!m_flac->process_single()) {
PERROR("process_single() error\n");
+ m_flac->reset();
+ seek(m_nextFrame);
return -1;
}
}
else {
PERROR("flac_state() = %d\n",
m_flac->get_state());
+ m_flac->reset();
+ seek(m_nextFrame);
return -1;
}
#else
if (m_flac->get_state() ==
FLAC__STREAM_DECODER_END_OF_STREAM) {
//printf("flac file finish\n");
- m_flac->finish();
- m_flac->init();
+ m_flac->reset();
break;
}
else if(m_flac->get_state() <
FLAC__STREAM_DECODER_END_OF_STREAM) {
if (!m_flac->process_single()) {
PERROR("process_single() error\n");
+ m_flac->reset();
+ seek(m_nextFrame);
return -1;
}
}
else {
PERROR("flac_state() = %d\n",
m_flac->get_state());
+ m_flac->reset();
+ seek(m_nextFrame);
return -1;
}
#endif
@@ -437,14 +450,18 @@
}
// Pad end of file with 0s if necessary. (Shouldn't be necessary...)
- /*int remainingSamplesRequested = sampleCount - samplesCoppied;
+ int remainingSamplesRequested = sampleCount - samplesCoppied;
int remainingSamplesInFile = get_length() * get_num_channels() -
(m_nextFrame * get_num_channels() + samplesCoppied);
if (samplesCoppied == 0 && remainingSamplesInFile > 0) {
int padLength = (remainingSamplesRequested >
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
- printf("padLength: %d\n", padLength);
- memset(dst + sampleCount - padLength, 0, padLength *
sizeof(audio_sample_t));
- samplesCoppied += remainingSamplesInFile;
- }*/
+ //PERROR("padLength: %d", padLength);
+ memset(dst + samplesCoppied, 0, padLength *
sizeof(audio_sample_t));
+ samplesCoppied += padLength;
+ }
+ if (samplesCoppied > sampleCount) {
+ //PERROR("Truncating");
+ samplesCoppied = sampleCount;
+ }
m_nextFrame += samplesCoppied / get_num_channels();
Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- MadAudioReader.cpp 13 Jul 2007 07:41:02 -0000 1.3
+++ MadAudioReader.cpp 15 Jul 2007 05:14:47 -0000 1.4
@@ -745,7 +745,7 @@
d->vbr = true;
}
//
- // position in stream: postion in file minus the not yet used
buffer
+ // position in stream: position in file minus the not yet used
buffer
//
unsigned long long seekPos = d->handle->inputPos() -
(d->handle->madStream->bufend -
d->handle->madStream->this_frame + 1);
@@ -801,7 +801,7 @@
// one mad_frame represents a mp3-frame which is always 1152
samples
// for us that means we need 1152 samples per channel of output
buffer
// for every frame
- if (d->outputBufferEnd - d->outputPointer == 0) {
+ if (d->outputPointer >= d->outputBufferEnd) {
bOutputBufferFull = true;
}
else if (d->handle->decodeNextFrame()) {
@@ -821,27 +821,28 @@
}
}
- nframes_t samplesWritten = d->outputPointer - d->outputBuffer;
+ int samplesWritten = d->outputPointer - d->outputBuffer;
// Pad end with zeros if necessary
// FIXME: This shouldn't be necessary! :P
// is get_length() reporting incorrectly?
// are we not outputting the last mp3-frame for some reason?
int remainingSamplesRequested = sampleCount - samplesWritten;
- int remainingSamplesInFile = get_length() * get_num_channels() -
(m_nextFrame * get_num_channels() + samplesWritten);
+ int remainingSamplesInFile = (get_length() - m_nextFrame) *
get_num_channels();
if (remainingSamplesRequested > 0 && remainingSamplesInFile > 0) {
int padLength = (remainingSamplesRequested >
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
memset(d->outputPointer, 0, padLength * sizeof(audio_sample_t));
samplesWritten += padLength;
- //printf("remainingSamplesRequested: %d,
remainingSamplesInFile: %d (using: %d)\n", remainingSamplesRequested,
remainingSamplesInFile, padLength);
+ PERROR("padding: %d", padLength);
}
// Truncate so we don't return too many samples
else if (samplesWritten > remainingSamplesInFile) {
+ PERROR("truncating by %d!", (samplesWritten -
remainingSamplesInFile)/get_num_channels());
samplesWritten = remainingSamplesInFile;
}
- //if (samplesWritten) printf("at: %lu (total: %lu), request: %d
(returned: %d)\n", m_nextFrame, m_frames, sampleCount/get_num_channels(),
samplesWritten/get_num_channels());
+ //printf("at: %lu (total: %lu), request: %d (returned: %d)\n",
m_nextFrame, m_frames, sampleCount/get_num_channels(),
samplesWritten/get_num_channels());
m_nextFrame += samplesWritten / get_num_channels();
return samplesWritten;
@@ -850,11 +851,12 @@
bool MadAudioReader::createPcmSamples(mad_synth* synth)
{
- unsigned short nsamples = synth->pcm.length;
+ unsigned short nframes = synth->pcm.length;
bool overflow = false;
+ int i;
// now create the output
- for (int i = 0; i < nsamples; i++) {
+ for (i = 0; i < nframes; i++) {
if (overflow == false && d->outputPointer > d->outputBufferEnd)
{
d->outputPointer = d->overflowBuffer;
overflow = true;
@@ -875,7 +877,10 @@
d->overflowSize = d->outputPointer - d->overflowBuffer;
d->overflowStart = 0;
d->outputPointer = d->outputBufferEnd;
- //printf("overflowing %lu samples\n", d->overflowSize);
+ //printf("written: %d (overflow: %u)\n", nframes *
synth->pcm.channels - d->overflowSize, d->overflowSize);
+ }
+ else {
+ //printf("written: %d\n", i * synth->pcm.channels);
}
return true;
Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- ResampleAudioReader.cpp 14 Jul 2007 02:40:06 -0000 1.5
+++ ResampleAudioReader.cpp 15 Jul 2007 05:14:47 -0000 1.6
@@ -30,7 +30,7 @@
// On init, creates a child AudioReader for any filetype, and a samplerate
converter
-ResampleAudioReader::ResampleAudioReader(QString filename)
+ResampleAudioReader::ResampleAudioReader(QString filename, int converter_type)
: AbstractAudioReader(filename)
{
m_fileBuffer = 0;
@@ -42,23 +42,18 @@
return;
}
- int error;
- m_srcState = src_new (SRC_SINC_MEDIUM_QUALITY,
m_realReader->get_num_channels(), &error);
- if (!m_srcState) {
- PERROR("ResampleAudioReader: couldn't create libSampleRate
SRC_STATE");
- delete m_realReader;
- m_realReader = 0;
- }
-
- reset();
- seek(0);
+ m_srcState = 0;
+ init(converter_type);
}
ResampleAudioReader::~ResampleAudioReader()
{
- if (m_realReader) {
+ if (m_srcState) {
src_delete(m_srcState);
+ }
+
+ if (m_realReader) {
delete m_realReader;
}
@@ -68,6 +63,25 @@
}
+void ResampleAudioReader::init(int converter_type)
+{
+ if (m_srcState) {
+ src_delete(m_srcState);
+ }
+
+ int error;
+ m_srcState = src_new (converter_type, m_realReader->get_num_channels(),
&error);
+ if (!m_srcState) {
+ PERROR("ResampleAudioReader: couldn't create libSampleRate
SRC_STATE");
+ delete m_realReader;
+ m_realReader = 0;
+ }
+
+ reset();
+ seek(0);
+}
+
+
// Clear the samplerateconverter to a clean state (used on seek)
void ResampleAudioReader::reset()
{
@@ -179,7 +193,7 @@
// Pad end of file with 0s if necessary
int remainingSamplesRequested = sampleCount - samplesRead;
- int remainingSamplesInFile = get_length() * get_num_channels() -
m_nextFrame * get_num_channels() - samplesRead;
+ int remainingSamplesInFile = (get_length() - m_nextFrame -
m_srcData.output_frames_gen) * get_num_channels();
if (samplesRead == 0 && remainingSamplesRequested > 0 &&
remainingSamplesInFile > 0) {
int padLength = (remainingSamplesRequested >
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- ResampleAudioReader.h 13 Jul 2007 07:41:03 -0000 1.4
+++ ResampleAudioReader.h 15 Jul 2007 05:14:48 -0000 1.5
@@ -29,7 +29,7 @@
class ResampleAudioReader : public AbstractAudioReader
{
public:
- ResampleAudioReader(QString filename);
+ ResampleAudioReader(QString filename, int converter_type);
~ResampleAudioReader();
int get_num_channels();
@@ -42,6 +42,7 @@
static bool can_decode(QString filename) {return false;}
protected:
+ void init(int converter_type);
void reset();
nframes_t song_to_file_frame(nframes_t frame);
Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- VorbisAudioReader.cpp 13 Jul 2007 07:41:03 -0000 1.4
+++ VorbisAudioReader.cpp 15 Jul 2007 05:14:48 -0000 1.5
@@ -141,8 +141,8 @@
int samplesRead = ov_read_float(&m_vf, &tmp, (sampleCount -
totalRead) / get_num_channels(), &bs);
if (samplesRead == OV_HOLE) {
+ // Hole detected: recursive retry
PERROR("VorbisAudioReader: OV_HOLE");
- // recursive new try
return read(dst, sampleCount);
}
else if (samplesRead == 0) {
@@ -150,6 +150,7 @@
break;
} else if (samplesRead < 0) {
/* error in the stream. */
+ PERROR("VorbisFile decoding error");
break;
}
- [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 <=
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/18
- [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