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: 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




reply via email to

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