[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src/core MadAudioReader.cpp
From: |
Ben Levitt |
Subject: |
[Traverso-commit] traverso/src/core MadAudioReader.cpp |
Date: |
Sun, 15 Jul 2007 19:59:35 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Ben Levitt <benjie> 07/07/15 19:59:35
Modified files:
src/core : MadAudioReader.cpp
Log message:
Fix 2 mad bugs that caused crashes during resampling (and that could
have crashed even when not resampling, but memory layout was just lucky. :P )
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5
Patches:
Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- MadAudioReader.cpp 15 Jul 2007 05:14:47 -0000 1.4
+++ MadAudioReader.cpp 15 Jul 2007 19:59:35 -0000 1.5
@@ -691,7 +691,7 @@
//printf("seekOffset: %lu (start: %lu)\n", frameOffset, start);
d->outputBuffer = 0; // Zeros so that we write to overflow
d->outputBufferEnd = 0;
- d->outputPointer = d->outputBufferEnd + 1;
+ d->outputPointer = 0;
createPcmSamples(d->handle->madSynth);
d->overflowStart = frameOffset;
d->overflowSize -= frameOffset;
@@ -828,7 +828,7 @@
// is get_length() reporting incorrectly?
// are we not outputting the last mp3-frame for some reason?
int remainingSamplesRequested = sampleCount - samplesWritten;
- int remainingSamplesInFile = (get_length() - m_nextFrame) *
get_num_channels();
+ int remainingSamplesInFile = (get_length() - m_nextFrame) *
get_num_channels() - samplesWritten;
if (remainingSamplesRequested > 0 && remainingSamplesInFile > 0) {
int padLength = (remainingSamplesRequested >
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
memset(d->outputPointer, 0, padLength * sizeof(audio_sample_t));
@@ -851,13 +851,18 @@
bool MadAudioReader::createPcmSamples(mad_synth* synth)
{
- unsigned short nframes = synth->pcm.length;
+ nframes_t nframes = synth->pcm.length;
bool overflow = false;
int i;
+ if ((nframes + ((d->outputPointer - d->outputBuffer)/get_num_channels()
+ m_nextFrame)) > get_length()) {
+ nframes = get_length() - ((d->outputPointer -
d->outputBuffer)/get_num_channels() + m_nextFrame);
+ //printf("!!!nframes: %lu, length: %lu, current: %lu\n",
nframes, get_length(), (d->outputPointer - d->outputBuffer)/get_num_channels()
+ m_nextFrame);
+ }
+
// now create the output
for (i = 0; i < nframes; i++) {
- if (overflow == false && d->outputPointer > d->outputBufferEnd)
{
+ if (overflow == false && d->outputPointer >=
d->outputBufferEnd) {
d->outputPointer = d->overflowBuffer;
overflow = true;
}