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: Tue, 14 Aug 2007 10:49:56 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/08/14 10:49:56

Modified files:
        src/audiofileio/decode: AbstractAudioReader.cpp 
                                AbstractAudioReader.h 
                                FlacAudioReader.cpp FlacAudioReader.h 
                                MadAudioReader.cpp MadAudioReader.h 
                                ResampleAudioReader.cpp 
                                ResampleAudioReader.h SFAudioReader.cpp 
                                SFAudioReader.h VorbisAudioReader.cpp 
                                VorbisAudioReader.h WPAudioReader.cpp 
                                WPAudioReader.h 
        src/commands   : AudioClipExternalProcessing.cpp commands.pro 
        src/core       : AudioClip.cpp AudioSource.h DiskIO.cpp DiskIO.h 
                         Peak.cpp ReadSource.cpp ReadSource.h Song.cpp 
                         WriteSource.cpp WriteSource.h 
        src/engine     : defines.h 
        src/traverso/songcanvas: SongView.cpp 
        src/traverso/widgets: MessageWidget.cpp 

Log message:
        * Added DecodeBuffer struct, used to share  buffers among multiple 
audio readers, reducing memory pressure.
        ResampleAudioReader needs to be converted still, as well as the readers 
that have internal (overflow based) buffers like MAD
        * few micro-optimizations

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/FlacAudioReader.cpp?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/FlacAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/MadAudioReader.cpp?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/MadAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/SFAudioReader.cpp?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/SFAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/VorbisAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/WPAudioReader.cpp?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/WPAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/commands/AudioClipExternalProcessing.cpp?cvsroot=traverso&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/traverso/src/commands/commands.pro?cvsroot=traverso&r1=1.20&r2=1.21
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.cpp?cvsroot=traverso&r1=1.118&r2=1.119
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioSource.h?cvsroot=traverso&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/DiskIO.cpp?cvsroot=traverso&r1=1.41&r2=1.42
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/DiskIO.h?cvsroot=traverso&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.46&r2=1.47
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.h?cvsroot=traverso&r1=1.31&r2=1.32
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.129&r2=1.130
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/WriteSource.cpp?cvsroot=traverso&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/WriteSource.h?cvsroot=traverso&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/defines.h?cvsroot=traverso&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/SongView.cpp?cvsroot=traverso&r1=1.73&r2=1.74
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/widgets/MessageWidget.cpp?cvsroot=traverso&r1=1.5&r2=1.6

Patches:
Index: audiofileio/decode/AbstractAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- audiofileio/decode/AbstractAudioReader.cpp  31 Jul 2007 18:45:12 -0000      
1.1
+++ audiofileio/decode/AbstractAudioReader.cpp  14 Aug 2007 10:49:52 -0000      
1.2
@@ -35,7 +35,6 @@
 
 
 AbstractAudioReader::AbstractAudioReader(const QString& filename)
- : QObject(0)
 {
        m_fileName = filename;
        m_readPos = 0;
@@ -49,7 +48,7 @@
 
 // Read cnt frames starting at start from the AudioReader, into dst
 // uses seek() and read() from AudioReader subclass
-nframes_t AbstractAudioReader::read_from(audio_sample_t** buffer, nframes_t 
start, nframes_t count)
+nframes_t AbstractAudioReader::read_from(DecodeBuffer* buffer, nframes_t 
start, nframes_t count)
 {
 //     printf("read_from:: before_seek from %d, framepos is %d\n", start, 
m_readPos);
        
@@ -104,7 +103,7 @@
 }
 
 
-nframes_t AbstractAudioReader::read(audio_sample_t** buffer, nframes_t count)
+nframes_t AbstractAudioReader::read(DecodeBuffer* buffer, nframes_t count)
 {
        if (count && m_readPos < m_length) {
        //      printf("read_from:: after_seek from %d, framepos is %d\n", 
start, m_readPos);

Index: audiofileio/decode/AbstractAudioReader.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/decode/AbstractAudioReader.h    4 Aug 2007 04:21:27 -0000       
1.2
+++ audiofileio/decode/AbstractAudioReader.h    14 Aug 2007 10:49:53 -0000      
1.3
@@ -22,19 +22,50 @@
 #ifndef ABSTRACTAUDIOREADER_H
 #define ABSTRACTAUDIOREADER_H
 
-#include <QObject>
-
 #include "defines.h"
 
-class QString;
+#include <QString>
+
+struct DecodeBuffer {
+       
+       DecodeBuffer() {
+               readBuffer = 0;
+               resampleBuffer = 0;
+               destinationChannelCount = destinationBufferSize = 
resampleBufferSize = readBufferSize = 0;
+       }
+       
+       DecodeBuffer(audio_sample_t** dest, audio_sample_t* readbuf, uint 
destbufsize, uint readbufsize) {
+               destination = dest;
+               readBuffer = readbuf;
+               destinationBufferSize = destbufsize;
+               readBufferSize = readbufsize;
+       }
+       
+       void check_readbuffer_capacity(uint size) {
+               if (readBufferSize < size) {
+                       if (readBuffer) {
+                               delete [] readBuffer;
+                       }
+                       readBuffer = new audio_sample_t[size];
+                       readBufferSize = size;
+               }
+       }
+       
+       audio_sample_t** destination;
+       audio_sample_t* readBuffer;
+       audio_sample_t* resampleBuffer;
+       uint destinationChannelCount;
+       uint destinationBufferSize;
+       uint readBufferSize;
+       uint resampleBufferSize; // ????
+};
 
-class AbstractAudioReader : public QObject
+class AbstractAudioReader
 {
-       Q_OBJECT
        
 public:
        AbstractAudioReader(const QString& filename);
-       ~AbstractAudioReader();
+       virtual ~AbstractAudioReader();
        
        int get_num_channels();
        nframes_t get_length();
@@ -42,15 +73,15 @@
        bool eof();
        nframes_t pos();
        
-       nframes_t read_from(audio_sample_t** buffer, nframes_t start, nframes_t 
count);
+       nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t 
count);
        bool seek(nframes_t start);
-       nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
+       nframes_t read(DecodeBuffer* buffer, nframes_t frameCount);
        
        static AbstractAudioReader* create_audio_reader(const QString& 
filename);
        
 protected:
        virtual bool seek_private(nframes_t start) = 0;
-       virtual nframes_t read_private(audio_sample_t** buffer, nframes_t 
frameCount) = 0;
+       virtual nframes_t read_private(DecodeBuffer* buffer, nframes_t 
frameCount) = 0;
        
        QString         m_fileName;
 

Index: audiofileio/decode/FlacAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/FlacAudioReader.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- audiofileio/decode/FlacAudioReader.cpp      14 Aug 2007 04:12:56 -0000      
1.3
+++ audiofileio/decode/FlacAudioReader.cpp      14 Aug 2007 10:49:53 -0000      
1.4
@@ -126,7 +126,7 @@
                void cleanup()
                {
                        if (internalBuffer) {
-                               delete internalBuffer;
+                               delete [] internalBuffer;
                        }
                        file->close();
                        delete file;
@@ -211,7 +211,7 @@
        
        if ((nframes_t)fp->bufferSize < frames * frame->header.channels) {
                if (fp->internalBuffer) {
-                       delete fp->internalBuffer;
+                       delete [] fp->internalBuffer;
                }
                fp->internalBuffer = new audio_sample_t[frames * 
frame->header.channels];
                fp->bufferSize = frames * frame->header.channels;
@@ -487,7 +487,7 @@
 }
 
 
-nframes_t FlacAudioReader::read_private(audio_sample_t** buffer, nframes_t 
frameCount)
+nframes_t FlacAudioReader::read_private(DecodeBuffer* buffer, nframes_t 
frameCount)
 {
        Q_ASSERT(m_flac);
        
@@ -549,18 +549,18 @@
                framesToCopy = (frameCount - framesCoppied < framesAvailable) ? 
frameCount - framesCoppied : framesAvailable;
                switch (get_num_channels()) {
                        case 1:
-                               memcpy(buffer[0] + framesCoppied, 
m_flac->internalBuffer + m_flac->bufferStart, framesToCopy);
+                               memcpy(buffer->destination[0] + framesCoppied, 
m_flac->internalBuffer + m_flac->bufferStart, framesToCopy);
                                break;
                        case 2:
                                for (nframes_t i = 0; i < framesToCopy; i++) {
-                                       buffer[0][framesCoppied + i] = 
m_flac->internalBuffer[m_flac->bufferStart + i * 2];
-                                       buffer[1][framesCoppied + i] = 
m_flac->internalBuffer[m_flac->bufferStart + i * 2 + 1];
+                                       buffer->destination[0][framesCoppied + 
i] = m_flac->internalBuffer[m_flac->bufferStart + i * 2];
+                                       buffer->destination[1][framesCoppied + 
i] = m_flac->internalBuffer[m_flac->bufferStart + i * 2 + 1];
                                }
                                break;
                        default:
                                for (nframes_t i = 0; i < framesToCopy; i++) {
                                        for (int c = 0; c < get_num_channels(); 
c++) {
-                                               buffer[c][framesCoppied + i] = 
m_flac->internalBuffer[m_flac->bufferStart + i * get_num_channels() + c];
+                                               
buffer->destination[c][framesCoppied + i] = 
m_flac->internalBuffer[m_flac->bufferStart + i * get_num_channels() + c];
                                        }
                                }
                                break;

Index: audiofileio/decode/FlacAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/FlacAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- audiofileio/decode/FlacAudioReader.h        31 Jul 2007 18:45:12 -0000      
1.1
+++ audiofileio/decode/FlacAudioReader.h        14 Aug 2007 10:49:53 -0000      
1.2
@@ -37,7 +37,7 @@
        
 protected:
        bool seek_private(nframes_t start);
-       nframes_t read_private(audio_sample_t** buffer, nframes_t sampleCount);
+       nframes_t read_private(DecodeBuffer* buffer, nframes_t sampleCount);
        
        FlacPrivate *m_flac;
 };

Index: audiofileio/decode/MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/MadAudioReader.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- audiofileio/decode/MadAudioReader.cpp       14 Aug 2007 04:12:56 -0000      
1.3
+++ audiofileio/decode/MadAudioReader.cpp       14 Aug 2007 10:49:53 -0000      
1.4
@@ -1,6 +1,6 @@
 /*
 Copyright (C) 2007 Ben Levitt 
- * This file based on the mp3 decoding plugin of the K3b project.
+ * This file is based on the mp3 decoding plugin of the K3b project.
  * Copyright (C) 1998-2007 Sebastian Trueg <address@hidden>
 
 This file is part of Traverso
@@ -757,9 +757,9 @@
 }
 
 
-nframes_t MadAudioReader::read_private(audio_sample_t** buffer, nframes_t 
frameCount)
+nframes_t MadAudioReader::read_private(DecodeBuffer* buffer, nframes_t 
frameCount)
 {
-       d->outputBuffers = buffer;
+       d->outputBuffers = buffer->destination;
        d->outputSize = frameCount;
        d->outputPos = 0;
        

Index: audiofileio/decode/MadAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/MadAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- audiofileio/decode/MadAudioReader.h 31 Jul 2007 18:45:12 -0000      1.1
+++ audiofileio/decode/MadAudioReader.h 14 Aug 2007 10:49:53 -0000      1.2
@@ -39,7 +39,7 @@
        
 protected:
        bool seek_private(nframes_t start);
-       nframes_t read_private(audio_sample_t** buffer, nframes_t frameCount);
+       nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount);
        
        bool initDecoderInternal();
        unsigned long countFrames();

Index: audiofileio/decode/ResampleAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/decode/ResampleAudioReader.cpp  4 Aug 2007 04:21:27 -0000       
1.2
+++ audiofileio/decode/ResampleAudioReader.cpp  14 Aug 2007 10:49:53 -0000      
1.3
@@ -64,7 +64,7 @@
        }
        
        while (m_fileBuffers.size()) {
-               delete m_fileBuffers.back();
+               delete [] m_fileBuffers.back();
                m_fileBuffers.pop_back();
        }
 }
@@ -142,7 +142,7 @@
 
 // If no conversion is necessary, pass the read straight to the child 
AudioReader,
 // otherwise get data from childreader and use libsamplerate to convert
-nframes_t ResampleAudioReader::read_private(audio_sample_t** buffer, nframes_t 
frameCount)
+nframes_t ResampleAudioReader::read_private(DecodeBuffer* buffer, nframes_t 
frameCount)
 {
        Q_ASSERT(m_reader);
        
@@ -167,7 +167,7 @@
                if ((uint)m_fileBufferLength < fileCnt + OVERFLOW_SIZE) {
                        for (int c = 0; c < m_channels; c++) {
                                if (m_fileBufferLength) {
-                                       delete m_fileBuffers[c];
+                                       delete [] m_fileBuffers[c];
                                }
                                m_fileBuffers[c] = new audio_sample_t[fileCnt + 
OVERFLOW_SIZE];
                        }
@@ -178,7 +178,9 @@
                        m_filePointers[c] = m_fileBuffers[c] + m_overflowUsed;
                }
                
-               bufferUsed += m_reader->read(m_filePointers.data(), fileCnt + 
OVERFLOW_SIZE - m_overflowUsed);
+               // 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);
                //printf("Resampler: Read %lu of %lu (%lu)\n", bufferUsed, 
fileCnt + OVERFLOW_SIZE - m_overflowUsed, m_reader->get_length());
        }
        
@@ -195,7 +197,7 @@
                // Set up sample rate converter struct for s.r.c. processing
                m_srcData.data_in = m_fileBuffers[c];
                m_srcData.input_frames = bufferUsed;
-               m_srcData.data_out = buffer[c];
+               m_srcData.data_out = buffer->destination[c];
                m_srcData.output_frames = framesToConvert;
                m_srcData.src_ratio = (double) m_outputRate / m_rate;
                src_set_ratio(m_srcStates[c], m_srcData.src_ratio);
@@ -221,9 +223,10 @@
        
        // Pad end of file with 0s if necessary
        if (framesRead == 0 && m_readPos < get_length()) {
+               // NOTE WHOOPTYDOOOO, are you sure about this Ben ???
                int padLength = m_readPos;
                for (int c = 0; c < m_channels; c++) {
-                       memset(buffer[c] + framesRead, 0, padLength * 
sizeof(audio_sample_t));
+                       memset(buffer->destination[c] + framesRead, 0, 
padLength * sizeof(audio_sample_t));
                }
                framesRead += padLength;
                printf("Resampler: padding: %d\n", padLength);

Index: audiofileio/decode/ResampleAudioReader.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- audiofileio/decode/ResampleAudioReader.h    31 Jul 2007 18:45:12 -0000      
1.1
+++ audiofileio/decode/ResampleAudioReader.h    14 Aug 2007 10:49:53 -0000      
1.2
@@ -42,7 +42,7 @@
        void reset();
        
        bool seek_private(nframes_t start);
-       nframes_t read_private(audio_sample_t** buffer, nframes_t frameCount);
+       nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount);
        
        nframes_t song_to_file_frame(nframes_t frame);
        nframes_t file_to_song_frame(nframes_t frame);

Index: audiofileio/decode/SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/SFAudioReader.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/decode/SFAudioReader.cpp        4 Aug 2007 04:21:27 -0000       
1.2
+++ audiofileio/decode/SFAudioReader.cpp        14 Aug 2007 10:49:53 -0000      
1.3
@@ -44,18 +44,11 @@
        m_channels = m_sfinfo.channels;
        m_length = m_sfinfo.frames;
        m_rate = m_sfinfo.samplerate;
-       
-       m_tmpBuffer = 0;
-       m_tmpBufferSize = 0;
 }
 
 
 SFAudioReader::~SFAudioReader()
 {
-       if (m_tmpBuffer) {
-               delete m_tmpBuffer;
-       }
-       
        if (m_sf) {
                if (sf_close(m_sf)) {
                        qWarning("sf_close returned an error!");
@@ -107,34 +100,31 @@
 }
 
 
-nframes_t SFAudioReader::read_private(audio_sample_t** buffer, nframes_t 
frameCount)
+nframes_t SFAudioReader::read_private(DecodeBuffer* buffer, nframes_t 
frameCount)
 {
        Q_ASSERT(m_sf);
        
-       // Make sure the temp buffer is big enough for this read
-       if (m_tmpBufferSize < frameCount) {
-               if (m_tmpBuffer) {
-                       delete m_tmpBuffer;
-               }
-               m_tmpBuffer = new audio_sample_t[frameCount * m_channels];
-       }
-       int framesRead = sf_readf_float(m_sf, m_tmpBuffer, frameCount);
+       // Make sure the read buffer is big enough for this read
+       buffer->check_readbuffer_capacity(frameCount * m_channels); 
+       
+       int framesRead = sf_readf_float(m_sf, buffer->readBuffer, frameCount);
        
        // De-interlace
        switch (m_channels) {
                case 1:
-                       memcpy(buffer[0], m_tmpBuffer, framesRead * 
sizeof(audio_sample_t));
+                       memcpy(buffer->destination[0], buffer->readBuffer, 
framesRead * sizeof(audio_sample_t));
                        break;  
                case 2:
                        for (int f = 0; f < framesRead; f++) {
-                               buffer[0][f] = m_tmpBuffer[f * 2];
-                               buffer[1][f] = m_tmpBuffer[f * 2 + 1];
+                               int pos = f*2;
+                               buffer->destination[0][f] = 
buffer->readBuffer[pos];
+                               buffer->destination[1][f] = 
buffer->readBuffer[pos + 1];
                        }
                        break;  
                default:
                        for (int f = 0; f < framesRead; f++) {
                                for (int c = 0; c < m_channels; c++) {
-                                       buffer[c][f] = m_tmpBuffer[f * 
m_channels + c];
+                                       buffer->destination[c][f] = 
buffer->readBuffer[f * m_channels + c];
                                }
                        }
        }

Index: audiofileio/decode/SFAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/SFAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/decode/SFAudioReader.h  4 Aug 2007 04:21:27 -0000       1.2
+++ audiofileio/decode/SFAudioReader.h  14 Aug 2007 10:49:54 -0000      1.3
@@ -36,7 +36,7 @@
 
 protected:
        bool seek_private(nframes_t start);
-       nframes_t read_private(audio_sample_t** buffer, nframes_t frameCount);
+       nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount);
        
        SNDFILE*        m_sf;
        SF_INFO         m_sfinfo;

Index: audiofileio/decode/VorbisAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/VorbisAudioReader.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/decode/VorbisAudioReader.cpp    14 Aug 2007 04:12:56 -0000      
1.2
+++ audiofileio/decode/VorbisAudioReader.cpp    14 Aug 2007 10:49:54 -0000      
1.3
@@ -102,6 +102,7 @@
        
        if (int result = ov_pcm_seek(&m_vf, start) < 0) {
                PERROR("VorbisAudioReader: could not seek to frame %d within %s 
(%d)", start, m_fileName.toUtf8().data(), result);
+               Q_UNUSED(result);
                return false;
        }
        
@@ -109,7 +110,7 @@
 }
 
 
-nframes_t VorbisAudioReader::read_private(audio_sample_t** buffer, nframes_t 
frameCount)
+nframes_t VorbisAudioReader::read_private(DecodeBuffer* buffer, nframes_t 
frameCount)
 {
        Q_ASSERT(m_file);
        
@@ -135,7 +136,7 @@
                }
                
                for (int c=0; c < m_channels; c++) {
-                       memcpy(buffer[c] + totalFramesRead, tmp[c], framesRead 
* sizeof(audio_sample_t));
+                       memcpy(buffer->destination[c] + totalFramesRead, 
tmp[c], framesRead * sizeof(audio_sample_t));
                }
                totalFramesRead += framesRead;
        }

Index: audiofileio/decode/VorbisAudioReader.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/VorbisAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- audiofileio/decode/VorbisAudioReader.h      31 Jul 2007 18:45:13 -0000      
1.1
+++ audiofileio/decode/VorbisAudioReader.h      14 Aug 2007 10:49:54 -0000      
1.2
@@ -38,7 +38,7 @@
 
 protected:
        bool seek_private(nframes_t start);
-       nframes_t read_private(audio_sample_t** buffer, nframes_t frameCount);
+       nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount);
        
        FILE*           m_file;
        OggVorbis_File  m_vf;

Index: audiofileio/decode/WPAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/WPAudioReader.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- audiofileio/decode/WPAudioReader.cpp        14 Aug 2007 04:12:57 -0000      
1.3
+++ audiofileio/decode/WPAudioReader.cpp        14 Aug 2007 10:49:54 -0000      
1.4
@@ -45,18 +45,11 @@
        m_channels = WavpackGetReducedChannels(m_wp);
        m_length = WavpackGetNumSamples(m_wp);
        m_rate = WavpackGetSampleRate(m_wp);
-       
-       m_tmpBuffer = 0;
-       m_tmpBufferSize = 0;
 }
 
 
 WPAudioReader::~WPAudioReader()
 {
-       if (m_tmpBuffer) {
-               delete m_tmpBuffer;
-       }
-       
        if (m_wp) {
                WavpackCloseFile(m_wp);
        }
@@ -101,35 +94,37 @@
 }
 
 
-nframes_t WPAudioReader::read_private(audio_sample_t** buffer, nframes_t 
frameCount)
+nframes_t WPAudioReader::read_private(DecodeBuffer* buffer, nframes_t 
frameCount)
 {
        Q_ASSERT(m_wp);
        
-       // Make sure the temp buffer is big enough for this read
-       if (m_tmpBufferSize < frameCount) {
-               if (m_tmpBuffer) {
-                       delete m_tmpBuffer;
-               }
-               m_tmpBuffer = new int32_t[frameCount * m_channels];
-       }
-       nframes_t framesRead = WavpackUnpackSamples(m_wp, m_tmpBuffer, 
frameCount);
+       // Make sure the read buffer is big enough for this read
+       buffer->check_readbuffer_capacity(frameCount * m_channels);
+       
+       // WavPack only reads into a int32_t buffer...
+       int32_t* readbuffer = (int32_t*)buffer->readBuffer;
+       
+       nframes_t framesRead = WavpackUnpackSamples(m_wp, readbuffer, 
frameCount);
+       
+       const uint divider = ((uint)1<<(m_bitsPerSample-1));
        
        // De-interlace
        if (m_isFloat) {
                switch (m_channels) {
                        case 1:
-                               memcpy(buffer[0], m_tmpBuffer, framesRead * 
sizeof(audio_sample_t));
+                               memcpy(buffer->destination[0], readbuffer, 
framesRead * sizeof(audio_sample_t));
                                break;  
                        case 2:
                                for (nframes_t f = 0; f < framesRead; f++) {
-                                       buffer[0][f] = ((float*)m_tmpBuffer)[f 
* 2];
-                                       buffer[1][f] = ((float*)m_tmpBuffer)[f 
* 2 + 1];
+                                       uint pos = f*2;
+                                       buffer->destination[0][f] = 
((float*)readbuffer)[pos];
+                                       buffer->destination[1][f] = 
((float*)readbuffer)[pos + 1];
                                }
                                break;  
                        default:
                                for (nframes_t f = 0; f < framesRead; f++) {
                                        for (int c = 0; c < m_channels; c++) {
-                                               buffer[c][f] = 
((float*)m_tmpBuffer)[f * m_channels + c];
+                                               buffer->destination[c][f] = 
((float*)readbuffer)[f * m_channels + c];
                                        }
                                }
                }
@@ -138,19 +133,20 @@
                switch (m_channels) {
                        case 1:
                                for (nframes_t f = 0; f < framesRead; f++) {
-                                       buffer[0][f] = 
(float)((float)m_tmpBuffer[f]/ (float)((uint)1<<(m_bitsPerSample-1)));
+                                       buffer->destination[0][f] = 
(float)((float)readbuffer[f]/ divider);
                                }
                                break;  
                        case 2:
                                for (nframes_t f = 0; f < framesRead; f++) {
-                                       buffer[0][f] = 
(float)((float)m_tmpBuffer[f * 2]/ (float)((uint)1<<(m_bitsPerSample-1)));
-                                       buffer[1][f] = 
(float)((float)m_tmpBuffer[f * 2 + 1]/ (float)((uint)1<<(m_bitsPerSample-1)));
+                                       uint pos = f*2;
+                                       buffer->destination[0][f] = 
(float)((float)readbuffer[pos]/ divider);
+                                       buffer->destination[1][f] = 
(float)((float)readbuffer[pos + 1]/ divider);
                                }
                                break;  
                        default:
                                for (nframes_t f = 0; f < framesRead; f++) {
                                        for (int c = 0; c < m_channels; c++) {
-                                               buffer[c][f] = 
(float)((float)m_tmpBuffer[f + m_channels + c]/ 
(float)((uint)1<<(m_bitsPerSample-1)));
+                                               buffer->destination[c][f] = 
(float)((float)readbuffer[f + m_channels + c]/ divider);
                                        }
                                }
                }

Index: audiofileio/decode/WPAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/WPAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/decode/WPAudioReader.h  4 Aug 2007 04:21:27 -0000       1.2
+++ audiofileio/decode/WPAudioReader.h  14 Aug 2007 10:49:54 -0000      1.3
@@ -36,13 +36,11 @@
 
 protected:
        bool seek_private(nframes_t start);
-       nframes_t read_private(audio_sample_t** buffer, nframes_t frameCount);
+       nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount);
        
        WavpackContext* m_wp;
        bool            m_isFloat;
        int             m_bitsPerSample;
-       int32_t         *m_tmpBuffer;
-       nframes_t       m_tmpBufferSize;
 };
 
 #endif

Index: commands/AudioClipExternalProcessing.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/commands/AudioClipExternalProcessing.cpp,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- commands/AudioClipExternalProcessing.cpp    13 Aug 2007 10:48:56 -0000      
1.23
+++ commands/AudioClipExternalProcessing.cpp    14 Aug 2007 10:49:54 -0000      
1.24
@@ -21,6 +21,7 @@
 
 #include "AudioClipExternalProcessing.h"
 
+#include "AbstractAudioReader.h"
 #include <AudioClip.h>
 #include <AudioClipView.h>
 #include <Track.h>
@@ -56,6 +57,7 @@
                audio_sample_t readbuffer[buffersize];
                audio_sample_t* mixdown[2];
                for (int i=0; i<2; ++i) mixdown[i] = new audio_sample_t[2 * 
buffersize];
+               DecodeBuffer decodebuffer(mixdown, readbuffer, buffersize, 
buffersize*2);
        
                ExportSpecification* spec = new ExportSpecification();
                spec->start_frame = 0;
@@ -83,7 +85,7 @@
                
                        memset (spec->dataF, 0, sizeof (spec->dataF[0]) * 
nframes * spec->channels);
                
-                       m_readsource->file_read(mixdown, spec->pos, nframes, 
readbuffer);
+                       m_readsource->file_read(&decodebuffer, spec->pos, 
nframes);
                        
                        for (int chan=0; chan < 2; ++chan) {
                                for (uint x = 0; x < nframes; ++x) {

Index: commands/commands.pro
===================================================================
RCS file: /sources/traverso/traverso/src/commands/commands.pro,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- commands/commands.pro       21 Jun 2007 14:31:10 -0000      1.20
+++ commands/commands.pro       14 Aug 2007 10:49:54 -0000      1.21
@@ -50,6 +50,7 @@
 ../engine \
 ../plugins \
 ../plugins/native \
+../audiofileio/decode \
 
 win32{
     INCLUDEPATH += ../../3thparty/include

Index: core/AudioClip.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.cpp,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -b -r1.118 -r1.119
--- core/AudioClip.cpp  11 Aug 2007 22:54:57 -0000      1.118
+++ core/AudioClip.cpp  14 Aug 2007 10:49:54 -0000      1.119
@@ -51,6 +51,8 @@
 #include "PluginChain.h"
 #include "GainEnvelope.h"
 
+#include "AbstractAudioReader.h"
+
 #include <commands.h>
 
 // Always put me below _all_ includes, this is needed
@@ -449,7 +451,8 @@
        if (m_song->realtime_path()) {
                read_frames = m_readSource->rb_read(mixdown, mix_pos, nframes);
        } else {
-               read_frames = m_readSource->file_read(mixdown, mix_pos, 
nframes, m_song->readbuffer);
+               DecodeBuffer buffer(mixdown, m_song->readbuffer, nframes, 
nframes*get_channels());
+               read_frames = m_readSource->file_read(&buffer, mix_pos, 
nframes);
        }
        
        if (read_frames <= 0) {

Index: core/AudioSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioSource.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- core/AudioSource.h  18 Jul 2007 13:13:05 -0000      1.21
+++ core/AudioSource.h  14 Aug 2007 10:49:55 -0000      1.22
@@ -38,8 +38,6 @@
        AudioSource(){};
        ~AudioSource();
        
-       virtual void process_ringbuffer(audio_sample_t** framebuffer, 
audio_sample_t* readbuffer = 0, bool seeking=false);
-
        void set_name(const QString& name);
        void set_dir(const QString& name);
        void set_original_bit_depth(uint bitDepth);
@@ -74,8 +72,6 @@
 
 
 inline uint AudioSource::get_channel_count( ) const {return m_channelCount;}
-
-inline void AudioSource::process_ringbuffer(audio_sample_t**, audio_sample_t*, 
bool) {}
 inline qint64 AudioSource::get_id( ) const {return m_id;}
 
 #endif

Index: core/DiskIO.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/DiskIO.cpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- core/DiskIO.cpp     26 Jul 2007 00:45:41 -0000      1.41
+++ core/DiskIO.cpp     14 Aug 2007 10:49:55 -0000      1.42
@@ -68,6 +68,7 @@
 
 #endif // endif Q_WS_X11
 
+#include "AbstractAudioReader.h"
 #include "AudioSource.h"
 #include "ReadSource.h"
 #include "WriteSource.h"
@@ -152,14 +153,16 @@
        framebuffer[0] = new audio_sample_t[audiodevice().get_sample_rate() * 
writebuffertime];
        framebuffer[1] = new audio_sample_t[audiodevice().get_sample_rate() * 
writebuffertime];
        // We assume here that the audiofiles have max 2 channels, and 
readbuffer time is max 3 seconds.
-       m_readbuffer = new audio_sample_t[audiodevice().get_sample_rate() * 6];
+//     m_readbuffer = new audio_sample_t[audiodevice().get_sample_rate() * 6];
+       m_decodebuffer = new DecodeBuffer;
+       m_decodebuffer->destination = framebuffer;
+       m_decodebuffer->readBufferSize = 0;
 
        // Move this instance to the workthread
        moveToThread(m_diskThread);
        m_workTimer.moveToThread(m_diskThread);
 
        connect(&m_workTimer, SIGNAL(timeout()), this, SLOT(do_work()));
-       connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, 
SLOT(output_rate_changed()));
        
        m_diskThread->start();
 }
@@ -172,6 +175,7 @@
        delete [] framebuffer[0];
        delete [] framebuffer[1];
        delete [] m_readbuffer;
+       delete m_decodebuffer;
 }
 
 /**
@@ -230,15 +234,20 @@
        
        while (there_are_processable_sources()) {
                
-               for (int i=0; i<m_processableSources.size(); ++i) {
-                       AudioSource* source = m_processableSources.at(i);
+               for (int i=0; i<m_processableReadSources.size(); ++i) {
+                       ReadSource* source = m_processableReadSources.at(i);
        
                        if (m_stopWork) {
                                update_time_usage();
                                return;
                        }
        
-                       source->process_ringbuffer(framebuffer, m_readbuffer, 
m_seeking);
+                       source->process_ringbuffer(m_decodebuffer, m_seeking);
+               }
+               
+               for (int i=0; i<m_processableWriteSources.size(); ++i) {
+                       WriteSource* source = m_processableWriteSources.at(i);
+                       source->process_ringbuffer(framebuffer[0]);
                }
                
                if (whilecount++ > 1000) {
@@ -255,7 +264,8 @@
 // Internal function
 int DiskIO::there_are_processable_sources( )
 {
-       m_processableSources.clear();
+       m_processableReadSources.clear();
+       m_processableWriteSources.clear();
        QList<ReadSource* > syncSources;
                
        for (int i=6; i >= 0; --i) {
@@ -279,7 +289,7 @@
                                        
t_atomic_int_set(&m_writeBufferFillStatus, space);
                                }
                                
-                               m_processableSources.append(source);
+                               m_processableWriteSources.append(source);
                        }
                }
                
@@ -301,7 +311,7 @@
                                        
t_atomic_int_set(&m_readBufferFillStatus, status->fillStatus);
                                }
                                
-                               m_processableSources.append(source);
+                               m_processableReadSources.append(source);
                        
                        } else if (status->needSync) {
 //                             printf("status == bufferUnderRun\n");
@@ -311,14 +321,14 @@
                        }
                }
                
-               if (m_processableSources.size() > 0) {
+               if (m_processableReadSources.size() > 0 || 
m_processableWriteSources.size() > 0) {
                        return 1;
                }
        }
                                
        
        if (syncSources.size() > 0) { 
-               syncSources.at(0)->sync(framebuffer, m_readbuffer);
+               syncSources.at(0)->sync(m_decodebuffer);
                return 1;
        }
        

Index: core/DiskIO.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/DiskIO.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- core/DiskIO.h       26 Jul 2007 00:45:41 -0000      1.19
+++ core/DiskIO.h       14 Aug 2007 10:49:55 -0000      1.20
@@ -34,6 +34,7 @@
 class RingBuffer;
 class DiskIOThread;
 class Song;
+struct DecodeBuffer;
 
 struct BufferStatus {
        int     fillStatus;
@@ -54,6 +55,7 @@
        static const int bufferdividefactor = 8;
 
        void prepare_for_seek();
+       void output_rate_changed();
 
        void register_read_source(ReadSource* source);
        void register_write_source(WriteSource* source);
@@ -69,8 +71,9 @@
        Song*                   m_song;
        volatile size_t         m_stopWork;
        QList<ReadSource*>      m_readSources;
-       QList<AudioSource*>     m_processableSources;
        QList<WriteSource*>     m_writeSources;
+       QList<ReadSource*>      m_processableReadSources;
+       QList<WriteSource*>     m_processableWriteSources;
        DiskIOThread*           m_diskThread;
        QTimer                  m_workTimer;
        QMutex                  mutex;
@@ -84,6 +87,7 @@
        int                     m_hardDiskOverLoadCounter;
        audio_sample_t*         framebuffer[2];
        audio_sample_t*         m_readbuffer;
+       DecodeBuffer*           m_decodebuffer;
 
        
        void update_time_usage();
@@ -97,7 +101,6 @@
        void seek(uint position);
        void start_io();
        void stop_io();
-       void output_rate_changed();
        
 private slots:
        void do_work();

Index: core/Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- core/Peak.cpp       11 Aug 2007 22:54:57 -0000      1.39
+++ core/Peak.cpp       14 Aug 2007 10:49:55 -0000      1.40
@@ -22,6 +22,8 @@
 #include "libtraversocore.h"
 
 #include "Peak.h"
+
+#include "AbstractAudioReader.h"
 #include "ReadSource.h"
 #include "ResourcesManager.h"
 #include "defines.h"
@@ -311,7 +313,9 @@
                }
                audio_sample_t readbuffer[toRead*2];
                
-               nframes_t readFrames = m_source->file_read(audiobuf, startPos, 
toRead, readbuffer);
+               DecodeBuffer decodebuffer(audiobuf, readbuffer, toRead, 
toRead*2);
+               
+               nframes_t readFrames = m_source->file_read(&decodebuffer, 
startPos, toRead);
 
                if (readFrames == 0) {
                        return NO_PEAKDATA_FOUND;
@@ -358,7 +362,7 @@
 #endif
                
                for (uint chan=0; chan < m_source->get_channel_count(); ++chan) 
{
-                       delete audiobuf[chan];
+                       delete [] audiobuf[chan];
                }
                
                return count;
@@ -615,13 +619,16 @@
        }
        audio_sample_t* readbuffer = new audio_sample_t[bufferSize * 2];
        
+       DecodeBuffer decodebuffer(buffer, readbuffer, bufferSize, bufferSize*2);
+       
        do {
                if (interuptPeakBuild) {
                        ret = -1;
                        goto out;
                }
                
-               readFrames = m_source->file_read(buffer, totalReadFrames, 
bufferSize, readbuffer);
+               readFrames = m_source->file_read(&decodebuffer, 
totalReadFrames, bufferSize);
+               
                if (readFrames <= 0) {
                        PERROR("readFrames < 0 during peak building");
                        break;
@@ -647,8 +654,9 @@
        
 out:
        for (uint chan=0; chan<m_source->get_channel_count(); ++chan) {
-               delete buffer[chan];
+               delete [] buffer[chan];
        }
+       
        delete [] readbuffer;
         
        return ret;
@@ -675,10 +683,21 @@
                startpos += 1;
                int toRead = (int) ((startpos * NORMALIZE_CHUNK_SIZE) - 
startframe);
                
-               audio_sample_t buf[toRead];
-//             int read = m_source->file_read(m_channel, buf, startframe, 
toRead, readbuffer);
+               audio_sample_t* buffer[m_source->get_channel_count()];
+               for (uint chan=0; chan<m_source->get_channel_count(); ++chan) {
+                       buffer[chan] = new audio_sample_t[toRead];
+               }
+               audio_sample_t readbuffer[toRead * 2];
+       
+               DecodeBuffer decodebuffer(buffer, readbuffer, toRead, toRead*2);
+               
+               int read = m_source->file_read(&decodebuffer, startframe, 
toRead);
                
-//             maxamp = Mixer::compute_peak(buf, read, maxamp);
+               maxamp = Mixer::compute_peak(buffer[m_channel], read, maxamp);
+               
+               for (uint chan=0; chan<m_source->get_channel_count(); ++chan) {
+                       delete [] buffer[chan];
+               }
        }
        
        

Index: core/ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- core/ReadSource.cpp 2 Aug 2007 22:01:36 -0000       1.46
+++ core/ReadSource.cpp 14 Aug 2007 10:49:55 -0000      1.47
@@ -222,13 +222,15 @@
 }
 
 
-int ReadSource::file_read(audio_sample_t** dst, nframes_t start, nframes_t 
cnt, audio_sample_t* readbuffer) const
+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
        if (m_audioReader->get_num_channels() == 1) {
-               nframes_t result = m_audioReader->read_from(dst, start, cnt);
+               nframes_t result = m_audioReader->read_from(buffer, start, cnt);
 #if defined (profile)
                int processtime = (int) (get_microseconds() - starttime);
                if (processtime > 40000)
@@ -240,7 +242,7 @@
        // The readbuffer 'assumes' that there is max 2 channels...
        Q_ASSERT(m_audioReader->get_num_channels() <= 2);
        
-       nframes_t nread = m_audioReader->read_from(dst, start, cnt);
+       nframes_t nread = m_audioReader->read_from(buffer, start, cnt);
 #if defined (profile)
        int processtime = (int) (get_microseconds() - starttime);
        if (processtime > 40000)
@@ -348,9 +350,9 @@
 }
 
 
-int ReadSource::rb_file_read(audio_sample_t** dst, nframes_t cnt, 
audio_sample_t* readbuffer )
+int ReadSource::rb_file_read(DecodeBuffer* buffer, nframes_t cnt)
 {
-       int readFrames = file_read(dst, m_rbFileReadPos, cnt, readbuffer);
+       int readFrames = file_read(buffer, m_rbFileReadPos, cnt);
        m_rbFileReadPos += readFrames;
 
        return readFrames;
@@ -392,7 +394,7 @@
        m_rbRelativeFileReadPos = fileposition;
 }
 
-void ReadSource::process_ringbuffer(audio_sample_t** framebuffer, 
audio_sample_t* readbuffer, bool seeking)
+void ReadSource::process_ringbuffer(DecodeBuffer* buffer, bool seeking)
 {
        // Do nothing if we passed the lenght of the AudioFile.
        if (m_rbFileReadPos >= m_length) {
@@ -433,11 +435,11 @@
        }
        
        // Read in the samples from source
-       nframes_t toWrite = rb_file_read(framebuffer, toRead, readbuffer);
+       nframes_t toWrite = rb_file_read(buffer, toRead);
 
        // and write it to the ringbuffer
        for (int i=m_buffers.size()-1; i>=0; --i) {
-               m_buffers.at(i)->write(framebuffer[i], toWrite);
+               m_buffers.at(i)->write(buffer->destination[i], toWrite);
        }
 }
 
@@ -466,7 +468,7 @@
        m_syncInProgress = 0;
 }
 
-void ReadSource::sync(audio_sample_t** framebuffer, audio_sample_t* readbuffer)
+void ReadSource::sync(DecodeBuffer* buffer)
 {
        PENTER2;
        if (!m_needSync) {
@@ -481,7 +483,7 @@
        // Currently, we fill the buffer completely.
        // For some reason, filling it with 1/4 at a time
        // doesn't fill it consitently, and thus giving audible artifacts.
-       process_ringbuffer(framebuffer, readbuffer);
+       process_ringbuffer(buffer);
        
        if (m_buffers.at(0)->write_space() == 0) {
                finish_resync();

Index: core/ReadSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- core/ReadSource.h   24 Jul 2007 17:57:06 -0000      1.31
+++ core/ReadSource.h   14 Aug 2007 10:49:55 -0000      1.32
@@ -29,6 +29,7 @@
 class AbstractAudioReader;
 class AudioClip;
 struct BufferStatus;
+struct DecodeBuffer;
 
 class ReadSource : public AudioSource
 {
@@ -52,7 +53,7 @@
        int rb_read(audio_sample_t** dest, nframes_t start, nframes_t cnt);
        void rb_seek_to_file_position(nframes_t position);
        
-       int file_read(audio_sample_t** dst, nframes_t start, nframes_t cnt, 
audio_sample_t* readbuffer) const;
+       int file_read(DecodeBuffer* buffer, nframes_t start, nframes_t cnt) 
const;
 
        int init();
        int get_error() const {return m_error;}
@@ -62,8 +63,8 @@
        void set_audio_clip(AudioClip* clip);
        nframes_t get_nframes() const;
        
-       void sync(audio_sample_t** framebuffer, audio_sample_t* readbuffer);
-       void process_ringbuffer(audio_sample_t** framebuffer, audio_sample_t* 
readbuffer, bool seeking=false);
+       void sync(DecodeBuffer* buffer);
+       void process_ringbuffer(DecodeBuffer* buffer, bool seeking=false);
        void prepare_buffer();
        size_t is_active() const;
        BufferStatus* get_buffer_status();
@@ -98,7 +99,7 @@
        void start_resync(nframes_t position);
        void finish_resync();
        void recover_from_buffer_underrun(nframes_t position);
-       int rb_file_read(audio_sample_t** dst, nframes_t cnt, audio_sample_t* 
readbuffer);
+       int rb_file_read(DecodeBuffer* buffer, nframes_t cnt);
 
        friend class ResourcesManager;
        

Index: core/Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.129
retrieving revision 1.130
diff -u -b -r1.129 -r1.130
--- core/Song.cpp       13 Aug 2007 11:24:49 -0000      1.129
+++ core/Song.cpp       14 Aug 2007 10:49:55 -0000      1.130
@@ -930,8 +930,11 @@
        // with the correct resampled audio data!
        // We need to seek to a different position then the current one,
        // else the seek won't happen at all :)
+       m_diskio->output_rate_changed();
+       
        TimeRef location = m_transportLocation;
        location.add_frames(1, audiodevice().get_sample_rate());
+       
        set_transport_pos(location);
 }
 

Index: core/WriteSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/WriteSource.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- core/WriteSource.cpp        13 Aug 2007 00:01:52 -0000      1.30
+++ core/WriteSource.cpp        14 Aug 2007 10:49:55 -0000      1.31
@@ -433,12 +433,9 @@
        m_isRecording = rec;
 }
 
-void WriteSource::process_ringbuffer( audio_sample_t* framebuffer, 
audio_sample_t* buffer, bool seek)
+void WriteSource::process_ringbuffer(audio_sample_t* buffer)
 {
-       Q_UNUSED(seek);
-       Q_UNUSED(buffer);
-
-       m_spec->dataF = framebuffer;
+       m_spec->dataF = buffer;
        int readSpace = m_buffer->read_space();
 
        if (! m_isRecording ) {

Index: core/WriteSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/WriteSource.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- core/WriteSource.h  3 Aug 2007 23:05:03 -0000       1.16
+++ core/WriteSource.h  14 Aug 2007 10:49:55 -0000      1.17
@@ -44,7 +44,7 @@
 
        int rb_write(audio_sample_t* src, nframes_t cnt);
        int rb_file_write(nframes_t cnt);
-       void process_ringbuffer(audio_sample_t* framebuffer, audio_sample_t* 
buffer, bool seek);
+       void process_ringbuffer(audio_sample_t* buffer);
        int get_processable_buffer_space() const;
        int get_chunck_size() const {return m_chunksize;}
        int get_buffer_size() const {return m_buffersize;}

Index: engine/defines.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/defines.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- engine/defines.h    19 Jul 2007 12:28:42 -0000      1.13
+++ engine/defines.h    14 Aug 2007 10:49:55 -0000      1.14
@@ -48,7 +48,7 @@
        TransportStarting = 3
 };
 
-// Unviversal samplerate for the frequences 22050, 32000, 44100, 88200, 96000 
and 192000 Hz
+// Universal samplerate for the frequences 22050, 32000, 44100, 88200, 96000 
and 192000 Hz
 static const quint64 UNIVERSAL_SAMPLE_RATE = 28224000;
 
 struct TimeRef {

Index: traverso/songcanvas/SongView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/SongView.cpp,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -b -r1.73 -r1.74
--- traverso/songcanvas/SongView.cpp    27 Jun 2007 21:01:21 -0000      1.73
+++ traverso/songcanvas/SongView.cpp    14 Aug 2007 10:49:56 -0000      1.74
@@ -154,6 +154,8 @@
 
 SongView::~SongView()
 {
+       delete m_dragShuttleCurve;
+       delete m_shuttleCurve;
 }
                
 void SongView::scale_factor_changed( )

Index: traverso/widgets/MessageWidget.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/widgets/MessageWidget.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- traverso/widgets/MessageWidget.cpp  30 May 2007 19:48:46 -0000      1.5
+++ traverso/widgets/MessageWidget.cpp  14 Aug 2007 10:49:56 -0000      1.6
@@ -51,6 +51,7 @@
        QQueue<InfoStruct >     m_messageQueue;
        InfoStruct              m_infoStruct;
        QTextBrowser*           m_log;
+       QString                 m_stringLog;
        
        void create_icons();
        void log(InfoStruct infostruct);
@@ -99,9 +100,7 @@
        lay->addStretch(5);
        setLayout(lay);
        
-       m_log = new QTextBrowser(this);
-       m_log->setWindowFlags(Qt::Dialog);
-       m_log->resize(500, 200);
+       m_log = 0;
        
        create_icons();
        
@@ -220,8 +219,13 @@
        }
 
        QString image = "<td width=20><img src=\"" + iconpath + "\" /></td>";
-       m_log->append("<table width=100% " + color + " cellspacing=5><tr>" + 
-                       image + time + "<td>" + infostruct.message + 
"</td></tr></table>");
+       QString string = "<table width=100% " + color + " cellspacing=5><tr>" + 
+                       image + time + "<td>" + infostruct.message + 
"</td></tr></table>";
+       if (m_log) {
+               m_log->append(string);
+       } else {
+               m_stringLog.append(string);
+       }
 }
 
 QSize MessageWidgetPrivate::sizeHint() const
@@ -232,6 +236,14 @@
 
 void MessageWidgetPrivate::show_history()
 {
+       if (!m_log) {
+               m_log = new QTextBrowser(this);
+               m_log->setWindowFlags(Qt::Dialog);
+               m_log->resize(500, 200);
+               m_log->append(m_stringLog);
+               m_stringLog.clear();
+       }
+
        if (m_log->isHidden()) {
                m_log->show();
        } else {




reply via email to

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