[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src audiofileio/decode/AbstractAudioRe...
From: |
Ben Levitt |
Subject: |
[Traverso-commit] traverso/src audiofileio/decode/AbstractAudioRe... |
Date: |
Thu, 16 Aug 2007 06:43:51 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Ben Levitt <benjie> 07/08/16 06:43:51
Modified files:
src/audiofileio/decode: AbstractAudioReader.h
ResampleAudioReader.cpp
ResampleAudioReader.h
src/core : AudioClip.cpp DiskIO.cpp Peak.cpp
ReadSource.cpp
Log message:
Fix ResampleAudioReader to use DecodeBuffer, fix DecodeBuffer to be
usable by
ResampleAudioReader. :)
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.cpp?cvsroot=traverso&r1=1.123&r2=1.124
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/DiskIO.cpp?cvsroot=traverso&r1=1.43&r2=1.44
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.41&r2=1.42
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.47&r2=1.48
Patches:
Index: audiofileio/decode/AbstractAudioReader.h
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- audiofileio/decode/AbstractAudioReader.h 14 Aug 2007 10:49:53 -0000
1.3
+++ audiofileio/decode/AbstractAudioReader.h 16 Aug 2007 06:43:50 -0000
1.4
@@ -51,9 +51,48 @@
}
}
+ void check_resamplebuffer_capacity(uint frames) {
+ if (resampleBufferSize < frames) {
+ if (!resampleBuffer) {
+ resampleBuffer = new
audio_sample_t*[destinationChannelCount];
+ }
+ for (uint chan = 0; chan < destinationChannelCount;
chan++) {
+ if (resampleBufferSize) {
+ delete [] resampleBuffer[chan];
+ }
+ resampleBuffer[chan] = new
audio_sample_t[frames];
+ }
+ resampleBufferSize = frames;
+ }
+ }
+
+ void prepare_for_child_read(nframes_t offset) {
+ if (resampleBuffer) {
+ origDestination = destination;
+ destination = resampleBuffer;
+
+ // Let the child reader write into the buffer starting
offset samples past the beginning.
+ // This lets the resampler prefill the buffers with the
pre-existing overflow.
+ for (uint chan = 0; chan < destinationChannelCount;
chan++) {
+ resampleBuffer[chan] += offset;
+ }
+ }
+ }
+
+ void finish_child_read(nframes_t offset) {
+ if (origDestination) {
+ destination = origDestination;
+
+ for (uint chan = 0; chan < destinationChannelCount;
chan++) {
+ resampleBuffer[chan] -= offset;
+ }
+ }
+ }
+
audio_sample_t** destination;
+ audio_sample_t** origDestination; // Used to store destination during a
child read in the resampler
audio_sample_t* readBuffer;
- audio_sample_t* resampleBuffer;
+ audio_sample_t** resampleBuffer;
uint destinationChannelCount;
uint destinationBufferSize;
uint readBufferSize;
Index: audiofileio/decode/ResampleAudioReader.cpp
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- audiofileio/decode/ResampleAudioReader.cpp 15 Aug 2007 17:09:02 -0000
1.4
+++ audiofileio/decode/ResampleAudioReader.cpp 16 Aug 2007 06:43:50 -0000
1.5
@@ -22,7 +22,7 @@
#include "ResampleAudioReader.h"
#include <QString>
-#define OVERFLOW_SIZE 1024
+#define OVERFLOW_SIZE 512
// Always put me below _all_ includes, this is needed
// in case we run with memory leak detection enabled!
@@ -44,9 +44,11 @@
m_length = m_reader->get_length();
m_outputRate = m_rate;
- m_fileBuffers.resize(get_num_channels());
- m_filePointers.resize(get_num_channels());
- m_fileBufferLength = 0;
+ m_overflowBuffers = new audio_sample_t*[m_channels];
+ for (int chan = 0; chan < m_channels; chan++) {
+ m_overflowBuffers[chan] = new audio_sample_t[OVERFLOW_SIZE];
+ }
+ m_overflowUsed = 0;
init(converter_type);
}
@@ -63,10 +65,10 @@
delete m_reader;
}
- while (m_fileBuffers.size()) {
- delete [] m_fileBuffers.back();
- m_fileBuffers.pop_back();
+ for (int chan = 0; chan < m_channels; chan++) {
+ delete [] m_overflowBuffers[chan];
}
+ delete [] m_overflowBuffers;
}
@@ -105,6 +107,11 @@
m_srcData.end_of_input = 0;
m_overflowUsed = 0;
+
+ // Read extra frames from the child reader on the first read after a
seek.
+ // This keeps the resampler supplied with plenty of samples to produce
the
+ // requested output on each read.
+ m_readExtraFrames = OVERFLOW_SIZE;
}
@@ -160,30 +167,30 @@
fileCnt = 1;
}
- bufferUsed = m_overflowUsed;
-
- if (!m_reader->eof()) {
- // make sure that the reusable m_fileBuffers are big enough for
this read + OVERFLOW_SIZE
- if ((uint)m_fileBufferLength < fileCnt + OVERFLOW_SIZE) {
- for (int c = 0; c < m_channels; c++) {
- if (m_fileBufferLength) {
- delete [] m_fileBuffers[c];
- }
- m_fileBuffers[c] = new audio_sample_t[fileCnt +
OVERFLOW_SIZE];
- }
- m_fileBufferLength = fileCnt + OVERFLOW_SIZE;
- }
+ // Make sure the buffer has large enough resampleBuffers
+ buffer->check_resamplebuffer_capacity(fileCnt + m_readExtraFrames);
+ bufferUsed = m_overflowUsed;
+ if (m_overflowUsed) {
+ // Copy pre-existing overflow into the buffer
for (int chan = 0; chan < m_channels; chan++) {
- m_filePointers[chan] = m_fileBuffers[chan] +
m_overflowUsed;
+ memcpy(buffer->resampleBuffer[chan],
m_overflowBuffers[chan], m_overflowUsed * sizeof(audio_sample_t));
+ }
}
- // FIXME : this is of course very scary, needs proper fix!
- buffer->destination = m_filePointers.data(); // ????
- bufferUsed += m_reader->read(buffer, fileCnt + OVERFLOW_SIZE -
m_overflowUsed);
+ if (!m_reader->eof()) {
+ // Adjust the buffer so that the child reader will write into
the resample buffer
+ // instead of the real destination buffer. It uses
m_overflowUsed to start the writing
+ // after the overflow from last read that we just coppied in.
+ buffer->prepare_for_child_read(m_overflowUsed);
+ bufferUsed += m_reader->read(buffer, fileCnt +
m_readExtraFrames - m_overflowUsed);
+ buffer->finish_child_read(m_overflowUsed);
//printf("Resampler: Read %lu of %lu (%lu)\n", bufferUsed,
fileCnt + OVERFLOW_SIZE - m_overflowUsed, m_reader->get_length());
}
+ // Don't read extra frames next time.
+ m_readExtraFrames = 0;
+
if (m_reader->eof()) {
m_srcData.end_of_input = 1;
}
@@ -195,7 +202,7 @@
for (int chan = 0; chan < m_channels; chan++) {
// Set up sample rate converter struct for s.r.c. processing
- m_srcData.data_in = m_fileBuffers[chan];
+ m_srcData.data_in = buffer->resampleBuffer[chan];
m_srcData.input_frames = bufferUsed;
m_srcData.data_out = buffer->destination[chan];
m_srcData.output_frames = framesToConvert;
@@ -210,14 +217,13 @@
}
m_overflowUsed = bufferUsed - m_srcData.input_frames_used;
-
if (m_overflowUsed < 0) {
m_overflowUsed = 0;
}
-
- if ((nframes_t)m_srcData.input_frames_used < bufferUsed) {
+ if (m_overflowUsed) {
+ // If there was overflow, save it for the next read.
for (int chan = 0; chan < m_channels; chan++) {
- memmove(m_fileBuffers[chan], m_fileBuffers[chan] +
m_srcData.input_frames_used, m_overflowUsed * sizeof(audio_sample_t));
+ memcpy(m_overflowBuffers[chan],
buffer->resampleBuffer[chan] + m_srcData.input_frames_used, m_overflowUsed *
sizeof(audio_sample_t));
}
}
@@ -226,16 +232,16 @@
int padLength = get_length() - m_readPos;
printf("Resampler: padding: %d\n", padLength);
for (int chan = 0; chan < m_channels; chan++) {
- memset(buffer->destination[chan], 0, padLength *
sizeof(audio_sample_t));
+ memset(buffer->destination[chan] + framesRead, 0,
padLength * sizeof(audio_sample_t));
}
framesRead += padLength;
}
// Truncate so we don't return too many samples
- /*if (m_readPos + framesRead > get_length()) {
+ if (m_readPos + framesRead > get_length()) {
printf("Resampler: truncating: %d\n", framesRead -
(get_length() - m_readPos));
framesRead = get_length() - m_readPos;
- }*/
+ }
//printf("framesRead: %lu of %lu (overflow: %lu) (at: %lu of %lu)\n",
framesRead, frameCount, m_overflowUsed, m_readPos + framesRead, get_length());
Index: audiofileio/decode/ResampleAudioReader.h
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/decode/ResampleAudioReader.h 14 Aug 2007 10:49:53 -0000
1.2
+++ audiofileio/decode/ResampleAudioReader.h 16 Aug 2007 06:43:50 -0000
1.3
@@ -51,11 +51,10 @@
AbstractAudioReader* m_reader;
QVector<SRC_STATE*> m_srcStates;
SRC_DATA m_srcData;
- QVector<audio_sample_t*> m_fileBuffers;
- QVector<audio_sample_t*> m_filePointers;
- long m_fileBufferLength;
+ audio_sample_t** m_overflowBuffers;
long m_overflowUsed;
int m_outputRate;
+ nframes_t m_readExtraFrames;
};
#endif
Index: core/AudioClip.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.cpp,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -b -r1.123 -r1.124
--- core/AudioClip.cpp 16 Aug 2007 00:16:56 -0000 1.123
+++ core/AudioClip.cpp 16 Aug 2007 06:43:50 -0000 1.124
@@ -452,6 +452,7 @@
read_frames = m_readSource->rb_read(mixdown, mix_pos, nframes);
} else {
DecodeBuffer buffer(mixdown, m_song->readbuffer, nframes,
nframes*get_channels());
+ buffer.destinationChannelCount = get_channels();
read_frames = m_readSource->file_read(&buffer, mix_pos,
nframes);
}
Index: core/DiskIO.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/DiskIO.cpp,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -b -r1.43 -r1.44
--- core/DiskIO.cpp 15 Aug 2007 20:07:41 -0000 1.43
+++ core/DiskIO.cpp 16 Aug 2007 06:43:50 -0000 1.44
@@ -154,6 +154,7 @@
framebuffer[1] = new audio_sample_t[audiodevice().get_sample_rate() *
writebuffertime];
m_decodebuffer = new DecodeBuffer;
+ m_decodebuffer->destinationChannelCount = 2; // FIXME?: Hardcoding to
2 channels
m_decodebuffer->destination = framebuffer;
m_decodebuffer->readBufferSize = 0;
Index: core/Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- core/Peak.cpp 15 Aug 2007 20:07:42 -0000 1.41
+++ core/Peak.cpp 16 Aug 2007 06:43:50 -0000 1.42
@@ -313,6 +313,7 @@
audio_sample_t readbuffer[toRead*2];
DecodeBuffer decodebuffer(audiobuf, readbuffer, toRead,
toRead*2);
+ decodebuffer.destinationChannelCount = 2;
nframes_t readFrames = m_source->file_read(&decodebuffer,
startPos, toRead);
Index: core/ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -b -r1.47 -r1.48
--- core/ReadSource.cpp 14 Aug 2007 10:49:55 -0000 1.47
+++ core/ReadSource.cpp 16 Aug 2007 06:43:50 -0000 1.48
@@ -224,8 +224,6 @@
int ReadSource::file_read(DecodeBuffer* buffer, nframes_t start, nframes_t
cnt) const
{
-#define profile
-
#if defined (profile)
trav_time_t starttime = get_microseconds();
#endif