traverso-commit
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]