[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src/audiofileio/decode AbstractAudioRe...
From: |
Remon Sijrier |
Subject: |
[Traverso-commit] traverso/src/audiofileio/decode AbstractAudioRe... |
Date: |
Fri, 12 Oct 2007 19:39:07 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Remon Sijrier <r_sijrier> 07/10/12 19:39:07
Modified files:
src/audiofileio/decode: AbstractAudioReader.cpp
AbstractAudioReader.h
ResampleAudioReader.cpp
ResampleAudioReader.h
Log message:
* Use a dedicated DecodeBuffer for ResampleAudioReaders' readers. Makes
DecodeBuffer much cleaner, and seems to solve problems I have now when
audiodevice samplerate != file samplerate
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.h?cvsroot=traverso&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.h?cvsroot=traverso&r1=1.11&r2=1.12
Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- AbstractAudioReader.cpp 12 Oct 2007 08:55:36 -0000 1.15
+++ AbstractAudioReader.cpp 12 Oct 2007 19:39:07 -0000 1.16
@@ -172,13 +172,9 @@
DecodeBuffer::DecodeBuffer()
{
destination = 0;
- resampleBuffer = 0;
readBuffer = 0;
- origDestination = 0;
- m_noDestBuffer = m_childReadActive = false;
- m_channels = destinationBufferSize = resampleBufferSize =
readBufferSize = 0;
+ m_channels = destinationBufferSize = readBufferSize = 0;
m_bufferSizeCheckCounter = m_totalCheckSize = m_smallerReadCounter = 0;
-
}
@@ -198,7 +194,7 @@
}*/
- if ((destinationBufferSize < size || m_channels < channels) &&
!m_childReadActive/* && !m_noDestBuffer*/) {
+ if ((destinationBufferSize < size || m_channels < channels)) {
delete_destination_buffers();
@@ -223,66 +219,27 @@
}
}
-void DecodeBuffer::check_resamplebuffer_capacity(uint frames)
-{
-
- if (resampleBufferSize < frames) {
-
- delete_resample_buffers();
-
- resampleBuffer = new audio_sample_t*[m_channels];
-
- for (uint chan = 0; chan < m_channels; chan++) {
- resampleBuffer[chan] = new audio_sample_t[frames];
- }
-
- resampleBufferSize = frames;
-// printf("resizing resamplebuffer to %.3f KB\n",
(float)frames*4/1024);
- }
-}
-
-void DecodeBuffer::use_custom_destination_buffer(bool custom)
-{
- if (custom) {
- delete_destination_buffers();
- m_noDestBuffer = true;
- }
-}
-
void DecodeBuffer::delete_destination_buffers()
{
- if (m_noDestBuffer) {
- return;
- }
if (destination) {
for (uint chan = 0; chan < m_channels; chan++) {
delete [] destination[chan];
}
+
delete [] destination;
- }
+
destination = 0;
destinationBufferSize = 0;
+ }
}
void DecodeBuffer::delete_readbuffer()
{
if (readBuffer) {
+
delete [] readBuffer;
- }
+
readBuffer = 0;
readBufferSize = 0;
-}
-
-void DecodeBuffer::delete_resample_buffers()
-{
- if (resampleBuffer) {
- for (uint chan = 0; chan < m_channels; chan++) {
- if (resampleBufferSize) {
- delete [] resampleBuffer[chan];
- }
- }
- delete [] resampleBuffer;
}
- resampleBuffer = 0;
- resampleBufferSize = 0;
}
Index: AbstractAudioReader.h
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- AbstractAudioReader.h 27 Sep 2007 19:20:29 -0000 1.16
+++ AbstractAudioReader.h 12 Oct 2007 19:39:07 -0000 1.17
@@ -33,53 +33,20 @@
~DecodeBuffer() {
delete_destination_buffers();
delete_readbuffer();
- delete_resample_buffers();
}
- void use_custom_destination_buffer(bool custom);
void check_buffers_capacity(uint size, uint channels);
- void check_resamplebuffer_capacity(uint frames);
-
- void prepare_for_child_read(nframes_t offset) {
- if (resampleBuffer) {
- m_childReadActive = true;
- 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 < m_channels; chan++) {
- resampleBuffer[chan] += offset;
- }
- }
- }
-
- void finish_child_read(nframes_t offset) {
- if (origDestination) {
- m_childReadActive = false;
- destination = origDestination;
- origDestination = 0;
-
- for (uint chan = 0; chan < m_channels; chan++) {
- resampleBuffer[chan] -= offset;
- }
- }
- }
audio_sample_t** destination;
audio_sample_t* readBuffer;
- audio_sample_t** resampleBuffer;
uint destinationBufferSize;
uint readBufferSize;
- uint resampleBufferSize;
private:
uint m_channels;
uint m_smallerReadCounter;
long m_totalCheckSize;
uint m_bufferSizeCheckCounter;
- audio_sample_t** origDestination; // Used to store destination during a
child read in the resampler
- bool m_noDestBuffer;
bool m_childReadActive;
void delete_destination_buffers();
Index: ResampleAudioReader.cpp
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- ResampleAudioReader.cpp 28 Sep 2007 18:33:43 -0000 1.15
+++ ResampleAudioReader.cpp 12 Oct 2007 19:39:07 -0000 1.16
@@ -49,6 +49,8 @@
m_isResampleAvailable = false;
m_overflowBuffers = 0;
m_overflowUsed = 0;
+ m_resampleDecodeBufferIsMine = false;
+ m_resampleDecodeBuffer = 0;
}
@@ -69,6 +71,10 @@
}
delete [] m_overflowBuffers;
}
+
+ if (m_resampleDecodeBufferIsMine) {
+ delete m_resampleDecodeBuffer;
+ }
}
@@ -138,7 +144,7 @@
int ResampleAudioReader::get_file_rate()
{
- m_reader->get_file_rate();
+ return m_reader->get_file_rate();
}
void ResampleAudioReader::set_output_rate(int rate)
@@ -150,7 +156,7 @@
m_nframes = file_to_resampled_frame(m_reader->get_nframes());
m_length = TimeRef(m_nframes, m_outputRate);
- reset();
+// reset();
}
@@ -192,24 +198,33 @@
fileCnt = 1;
}
+ if (!m_resampleDecodeBuffer) {
+ m_resampleDecodeBuffer = new DecodeBuffer;
+ m_resampleDecodeBufferIsMine = true;
+ }
+
// Make sure the buffer has large enough resampleBuffers
- buffer->check_resamplebuffer_capacity(fileCnt + m_readExtraFrames);
+// buffer->check_resamplebuffer_capacity(fileCnt + m_readExtraFrames);
+ m_resampleDecodeBuffer->check_buffers_capacity(fileCnt +
m_readExtraFrames, m_channels);
+
bufferUsed = m_overflowUsed;
if (m_overflowUsed) {
// Copy pre-existing overflow into the buffer
for (int chan = 0; chan < m_channels; chan++) {
- memcpy(buffer->resampleBuffer[chan],
m_overflowBuffers[chan], m_overflowUsed * sizeof(audio_sample_t));
+// memcpy(buffer->resampleBuffer[chan],
m_overflowBuffers[chan], m_overflowUsed * sizeof(audio_sample_t));
+ memcpy(m_resampleDecodeBuffer->destination[chan],
m_overflowBuffers[chan], m_overflowUsed * sizeof(audio_sample_t));
}
}
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);
+ for (int chan = 0; chan < m_channels; chan++) {
+ m_resampleDecodeBuffer->destination[chan] +=
m_overflowUsed;
+ }
+ bufferUsed += m_reader->read(m_resampleDecodeBuffer, fileCnt +
m_readExtraFrames - m_overflowUsed);
+ for (int chan = 0; chan < m_channels; chan++) {
+ m_resampleDecodeBuffer->destination[chan] -=
m_overflowUsed;
+ }
//printf("Resampler: Read %lu of %lu (%lu)\n", bufferUsed,
fileCnt + OVERFLOW_SIZE - m_overflowUsed, m_reader->get_length());
}
@@ -227,7 +242,8 @@
for (int chan = 0; chan < m_channels; chan++) {
// Set up sample rate converter struct for s.r.c. processing
- m_srcData.data_in = buffer->resampleBuffer[chan];
+// m_srcData.data_in = buffer->resampleBuffer[chan];
+ m_srcData.data_in = m_resampleDecodeBuffer->destination[chan];
m_srcData.input_frames = bufferUsed;
m_srcData.data_out = buffer->destination[chan];
m_srcData.output_frames = framesToConvert;
@@ -248,7 +264,7 @@
if (m_overflowUsed) {
// If there was overflow, save it for the next read.
for (int chan = 0; chan < m_channels; chan++) {
- memcpy(m_overflowBuffers[chan],
buffer->resampleBuffer[chan] + m_srcData.input_frames_used, m_overflowUsed *
sizeof(audio_sample_t));
+ memcpy(m_overflowBuffers[chan],
m_resampleDecodeBuffer->destination[chan] + m_srcData.input_frames_used,
m_overflowUsed * sizeof(audio_sample_t));
}
}
@@ -295,3 +311,13 @@
}
}
+void ResampleAudioReader::set_resample_decode_buffer(DecodeBuffer * buffer)
+{
+ if (m_resampleDecodeBufferIsMine && m_resampleDecodeBuffer) {
+ delete m_resampleDecodeBuffer;
+ m_resampleDecodeBufferIsMine = false;
+ }
+ m_resampleDecodeBuffer = buffer;
+ reset();
+}
+
Index: ResampleAudioReader.h
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- ResampleAudioReader.h 28 Sep 2007 18:33:43 -0000 1.11
+++ ResampleAudioReader.h 12 Oct 2007 19:39:07 -0000 1.12
@@ -48,6 +48,7 @@
int get_file_rate();
void set_output_rate(int rate);
void set_converter_type(int converter_type);
+ void set_resample_decode_buffer(DecodeBuffer* buffer);
protected:
void reset();
@@ -69,6 +70,8 @@
private:
void create_overflow_buffers();
+ DecodeBuffer* m_resampleDecodeBuffer;
+ bool m_resampleDecodeBufferIsMine;
};
#endif