traverso-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...


From: Ben Levitt
Subject: [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...
Date: Wed, 18 Jul 2007 18:15:24 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Ben Levitt <benjie>     07/07/18 18:15:23

Modified files:
        src/core       : AbstractAudioReader.cpp AbstractAudioReader.h 
                         FlacAudioReader.cpp FlacAudioReader.h 
                         MadAudioReader.cpp MadAudioReader.h 
                         ReadSource.cpp ResampleAudioReader.cpp 
                         ResampleAudioReader.h SFAudioReader.cpp 
                         SFAudioReader.h Song.cpp VorbisAudioReader.cpp 
                         VorbisAudioReader.h core.pro 

Log message:
        convert AudioReaders to do the deinterlacing
        convert AudioReader::read() to take, return frames, not samples
        remove use of QVector as buffer from FlacAudioReader
        breaks mp3 decoding
        possibly breaks resampling

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.41&r2=1.42
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.123&r2=1.124
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.h?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/core.pro?cvsroot=traverso&r1=1.33&r2=1.34

Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- AbstractAudioReader.cpp     18 Jul 2007 13:56:52 -0000      1.8
+++ AbstractAudioReader.cpp     18 Jul 2007 18:15:20 -0000      1.9
@@ -22,7 +22,7 @@
 #include "AbstractAudioReader.h"
 #include "SFAudioReader.h"
 #include "FlacAudioReader.h"
-#include "MadAudioReader.h"
+//#include "MadAudioReader.h"
 #include "VorbisAudioReader.h"
 #include "ResampleAudioReader.h"
 
@@ -49,7 +49,7 @@
 
 // Read cnt frames starting at start from the AudioReader, into dst
 // uses seek() and read() from AudioReader subclass
-int AbstractAudioReader::read_from(audio_sample_t* dst, nframes_t start, 
nframes_t cnt)
+nframes_t AbstractAudioReader::read_from(audio_sample_t** buffer, nframes_t 
start, nframes_t count)
 {
        QMutexLocker locker( &m_mutex );
        
@@ -65,11 +65,11 @@
        }
        
 //     printf("read_from:: after_seek from %d, framepos is %d\n", start, 
m_readPos);
-       int samplesRead = read(dst, cnt);
+       nframes_t framesRead = read(buffer, count);
        
-       m_readPos += samplesRead / get_num_channels();
+       m_readPos += framesRead;
        
-       return samplesRead;
+       return framesRead;
 }
 
 
@@ -87,9 +87,9 @@
        else if (SFAudioReader::can_decode(filename)) {
                newReader = new SFAudioReader(filename);
        }
-       else if (MadAudioReader::can_decode(filename)) {
-               newReader = new MadAudioReader(filename);
-       }
+//     else if (MadAudioReader::can_decode(filename)) {
+//             newReader = new MadAudioReader(filename);
+//     }
        else {
                return 0;
        }

Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- AbstractAudioReader.h       18 Jul 2007 13:13:05 -0000      1.7
+++ AbstractAudioReader.h       18 Jul 2007 18:15:20 -0000      1.8
@@ -40,9 +40,9 @@
        virtual int get_num_channels() = 0;
        virtual nframes_t get_length() = 0;
        virtual int get_rate() = 0;
-       int read_from(audio_sample_t* dst, nframes_t start, nframes_t cnt);
+       nframes_t read_from(audio_sample_t** buffer, nframes_t start, nframes_t 
count);
        virtual bool seek(nframes_t start) = 0;
-       virtual int read(audio_sample_t* dst, int sampleCount) = 0;
+       virtual nframes_t read(audio_sample_t** buffer, nframes_t frameCount) = 
0;
        
        static AbstractAudioReader* create_audio_reader(const QString& 
filename);
        static AbstractAudioReader* create_resampled_audio_reader(const 
QString& filename, int converter_type);

Index: FlacAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- FlacAudioReader.cpp 18 Jul 2007 13:13:05 -0000      1.5
+++ FlacAudioReader.cpp 18 Jul 2007 18:15:21 -0000      1.6
@@ -66,7 +66,9 @@
                }
                
                void cleanup() {
+                       if (internalBuffer) {
                        delete internalBuffer;
+                       }
                        file->close();
                        delete file;
                        finish();
@@ -81,7 +83,9 @@
                uint m_bitsPerSample;
                uint m_samples;
                
-               QVector<audio_sample_t> *internalBuffer;
+               audio_sample_t  *internalBuffer;
+               int             bufferSize;
+               int             bufferUsed;
                int                     bufferStart;
                
        protected:
@@ -112,7 +116,9 @@
                        : FLAC::Decoder::Stream()
 #endif
 {
-       internalBuffer = new QVector<audio_sample_t>();
+       internalBuffer = 0;
+       bufferSize = 0;
+       bufferUsed = 0;
        bufferStart = 0;
        open(filename);
        process_until_end_of_metadata();
@@ -135,21 +141,29 @@
        unsigned i, c, pos = 0;
        unsigned frames = frame->header.blocksize;
        
-       if (internalBuffer->size() > 0) {
-               // This shouldn't be happening, but if it does, the code can 
handle it now. :)
+       if (bufferUsed > 0) {
+               // This shouldn't be happening
                PERROR("internalBuffer is already non-empty");
        }
        
-       internalBuffer->resize(internalBuffer->size() + frames * 
frame->header.channels);
+       if (bufferSize < frames * frame->header.channels) {
+               if (internalBuffer) {
+                       delete internalBuffer;
+               }
+               internalBuffer = new audio_sample_t[frames * 
frame->header.channels];
+               bufferSize = frames * frame->header.channels;
+       }
        
        for (i=0; i < frames; i++) {
                // in FLAC channel 0 is left, 1 is right
                for (c=0; c < frame->header.channels; c++) {
                        audio_sample_t value = 
(audio_sample_t)((float)buffer[c][i] / 
(float)((uint)1<<(frame->header.bits_per_sample-1)));
-                       internalBuffer->data()[bufferStart + (pos++)] = value;
+                       internalBuffer[pos++] = value;
                }
        }
        
+       bufferUsed = frames * frame->header.channels;
+       
        return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
 }
 
@@ -360,7 +374,7 @@
                return false;
        }
        
-       m_flac->internalBuffer->resize(0);
+       m_flac->bufferUsed = 0;
        m_flac->bufferStart = 0;
        
        m_flac->flush();
@@ -374,16 +388,16 @@
 }
 
 
-int FlacAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t FlacAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
 {
        Q_ASSERT(m_flac);
        
-       int samplesToCopy;
-       int samplesAvailable;
-       int samplesCoppied = 0;
+       nframes_t framesToCopy;
+       nframes_t framesAvailable;
+       nframes_t framesCoppied = 0;
        
-       while (samplesCoppied < sampleCount) {
-               if (m_flac->internalBuffer->size() == 0) {
+       while (framesCoppied < frameCount) {
+               if (m_flac->bufferUsed == 0) {
                        // want more data
 #ifdef LEGACY_FLAC
                        if (m_flac->get_state() == 
FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) {
@@ -429,40 +443,57 @@
 #endif
                }
                
-               samplesAvailable = m_flac->internalBuffer->size() - 
m_flac->bufferStart;
-               samplesToCopy = (sampleCount - samplesCoppied < 
samplesAvailable) ? sampleCount - samplesCoppied : samplesAvailable;
-               for (int i = 0; i < samplesToCopy; i++) {
-                       dst[samplesCoppied + i] = 
m_flac->internalBuffer->at(m_flac->bufferStart + i);
+               framesAvailable = (m_flac->bufferUsed - m_flac->bufferStart) / 
get_num_channels() ;
+               framesToCopy = (frameCount - framesCoppied < framesAvailable) ? 
frameCount - framesCoppied : framesAvailable;
+               switch (get_num_channels()) {
+                       case 1:
+                               memcpy(buffer[0] + framesCoppied, 
m_flac->internalBuffer + m_flac->bufferStart, framesToCopy);
+                               break;
+                       case 2:
+                               for (int 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];
+                               }
+                               break;
+                       default:
+                               for (int 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];
+                                       }
+                               }
+                               break;
                }
                
-               if(samplesToCopy == samplesAvailable) {
-                       m_flac->internalBuffer->resize(0);
+               if(framesToCopy == framesAvailable) {
+                       m_flac->bufferUsed = 0;
                        m_flac->bufferStart = 0;
                }
                else {
-                       m_flac->bufferStart += samplesToCopy;
+                       m_flac->bufferStart += framesToCopy * 
get_num_channels();
                }
-               samplesCoppied += samplesToCopy;
+               framesCoppied += framesToCopy;
                
-               //printf("samplesCoppied = %d (%d, %d)\n", samplesCoppied, 
m_flac->bufferStart, m_flac->internalBuffer->size());
+               //printf("samplesCoppied = %d (%d, %d)\n", samplesCoppied, 
m_flac->bufferStart, m_flac->buferSize);
        }
        
        // Pad end of file with 0s if necessary.  (Shouldn't be necessary...)
-       int remainingSamplesRequested = sampleCount - samplesCoppied;
-       int remainingSamplesInFile = get_length() * get_num_channels() - 
(m_readPos * get_num_channels() + samplesCoppied);
-       if (samplesCoppied == 0 && remainingSamplesInFile > 0) {
-               int padLength = (remainingSamplesRequested > 
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
+       int remainingFramesRequested = frameCount - framesCoppied;
+       int remainingFramesInFile = get_length() - (m_readPos + framesCoppied);
+       if (framesCoppied == 0 && remainingFramesInFile > 0) {
+               int padLength = (remainingFramesRequested > 
remainingFramesInFile) ? remainingFramesInFile : remainingFramesRequested;
                //PERROR("padLength: %d", padLength);
-               memset(dst + samplesCoppied, 0, padLength * 
sizeof(audio_sample_t));
-               samplesCoppied += padLength;
+               for (int c = 0; c < get_num_channels(); c++) {
+                       memset(buffer[c] + framesCoppied, 0, padLength * 
sizeof(audio_sample_t));
+               }
+               framesCoppied += padLength;
        }
-       if (samplesCoppied > sampleCount) {
+       if (framesCoppied > frameCount) {
                //PERROR("Truncating");
-               samplesCoppied = sampleCount;
+               framesCoppied = frameCount;
        }
        
        //printf("copied %d of %d.  nextFrame: %lu of %lu\n", samplesCoppied, 
sampleCount, m_readPos, get_length());
        
-       return samplesCoppied;
+       return framesCoppied;
 }
 

Index: FlacAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- FlacAudioReader.h   13 Jul 2007 07:41:02 -0000      1.1
+++ FlacAudioReader.h   18 Jul 2007 18:15:21 -0000      1.2
@@ -37,7 +37,7 @@
        nframes_t get_length();
        int get_rate();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, int sampleCount);
+       nframes_t read(audio_sample_t** buffer, nframes_t sampleCount);
        
        static bool can_decode(QString filename);
 

Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- MadAudioReader.cpp  18 Jul 2007 13:13:06 -0000      1.6
+++ MadAudioReader.cpp  18 Jul 2007 18:15:21 -0000      1.7
@@ -767,11 +767,11 @@
 }
 
 
-int MadAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t MadAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
 {
-       d->outputBuffer = dst;
-       d->outputBufferEnd = d->outputBuffer + sampleCount;
-       d->outputPointer = d->outputBuffer;
+       d->outputBuffers = buffer;
+       d->bufferSize = frameCount
+       d->bufferPos = 0;
        
        bool bOutputBufferFull = false;
        

Index: MadAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- MadAudioReader.h    13 Jul 2007 07:41:02 -0000      1.2
+++ MadAudioReader.h    18 Jul 2007 18:15:21 -0000      1.3
@@ -39,7 +39,7 @@
        nframes_t get_length();
        int get_rate();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, int sampleCount);
+       nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
 
        static bool can_decode(QString filename);
 

Index: ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- ReadSource.cpp      18 Jul 2007 13:39:57 -0000      1.41
+++ ReadSource.cpp      18 Jul 2007 18:15:21 -0000      1.42
@@ -211,32 +211,27 @@
        trav_time_t starttime = get_microseconds();
 #endif
        if (m_audioReader->get_num_channels() == 1) {
-               int result = m_audioReader->read_from(dst[0], start, cnt);
+               nframes_t result = m_audioReader->read_from(dst, start, cnt);
 #if defined (profile)
                int processtime = (int) (get_microseconds() - starttime);
                if (processtime > 40000)
                        printf("Process time for %s: %d useconds\n\n", 
QS_C(m_fileName), processtime);
 #endif
-               return result;
+               return (int)result;
        }
 
        float *ptr;
-       uint real_cnt = cnt * m_audioReader->get_num_channels();
        
        // The readbuffer 'assumes' that there is max 2 channels...
        Q_ASSERT(m_audioReader->get_num_channels() <= 2);
        
-       int nread = m_audioReader->read_from(readbuffer, start, real_cnt);
+       nframes_t nread = m_audioReader->read_from(dst, start, cnt);
 #if defined (profile)
        int processtime = (int) (get_microseconds() - starttime);
        if (processtime > 40000)
                printf("Process time for %s: %d useconds\n\n", 
QS_C(m_fileName), processtime);
 #endif
-       ptr = readbuffer;
-       nread /= m_audioReader->get_num_channels();
-
-       /* stride through the interleaved data */
-       // FIXME: deinterlace in AudioReader Classes instead of here
+       /*ptr = readbuffer;
 
        for (int32_t n = 0; n < nread; ++n) {
                dst[0][n] = *ptr;
@@ -247,8 +242,7 @@
        for (int32_t n = 0; n < nread; ++n) {
                dst[1][n] = *ptr;
                ptr += m_audioReader->get_num_channels();
-       }
-
+       }*/
 
        return nread;
 }

Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- ResampleAudioReader.cpp     18 Jul 2007 13:13:06 -0000      1.7
+++ ResampleAudioReader.cpp     18 Jul 2007 18:15:21 -0000      1.8
@@ -33,48 +33,49 @@
 ResampleAudioReader::ResampleAudioReader(QString filename, int converter_type)
  : AbstractAudioReader(filename)
 {
-       m_fileBuffer = 0;
-       m_fileBufferLength = 0;
-       
        m_reader = AbstractAudioReader::create_audio_reader(filename);
        if (!m_reader) {
                PERROR("ResampleAudioReader: couldn't create AudioReader");
                return;
        }
        
-       m_srcState = 0;
+       m_fileBuffers.resize(get_num_channels());
+       m_fileBufferLength = 0;
+       
        init(converter_type);
 }
 
 
 ResampleAudioReader::~ResampleAudioReader()
 {
-       if (m_srcState) {
-               src_delete(m_srcState);
+       while (m_srcStates.size()) {
+               src_delete(m_srcStates.back());
+               m_srcStates.pop_back();
        }
        
        if (m_reader) {
                delete m_reader;
        }
        
-       if (m_fileBuffer) {
-               delete m_fileBuffer;
+       while (m_fileBuffers.size()) {
+               delete m_fileBuffers.back();
+               m_fileBuffers.pop_back();
        }
 }
 
 
 void ResampleAudioReader::init(int converter_type)
 {
-       if (m_srcState) {
-               src_delete(m_srcState);
-       }
-       
        int error;
-       m_srcState = src_new (converter_type, m_reader->get_num_channels(), 
&error);
-       if (!m_srcState) {
+       
+       for (int c = 0; c < m_reader->get_num_channels(); c++) {
+               m_srcStates.append(src_new(converter_type, 1, &error));
+               if (!m_srcStates[c]) {
                PERROR("ResampleAudioReader: couldn't create libSampleRate 
SRC_STATE");
                delete m_reader;
                m_reader = 0;
+                       return;
+               }
        }
        
        reset();
@@ -85,7 +86,10 @@
 // Clear the samplerateconverter to a clean state (used on seek)
 void ResampleAudioReader::reset()
 {
-       src_reset(m_srcState);
+       for (int c = 0; c < m_reader->get_num_channels(); c++) {
+               src_reset(m_srcStates[c]);
+       }
+       
        m_srcData.end_of_input = 0;
 }
 
@@ -96,6 +100,7 @@
        if (m_reader) {
                return m_reader->get_num_channels();
        }
+       
        return 0;
 }
 
@@ -109,6 +114,7 @@
                }
                return file_to_song_frame(m_reader->get_length());
        }
+       
        return 0;
 }
 
@@ -118,8 +124,12 @@
 // is anything gonna to know what the 'real' rate of an audiofile is ?
 int ResampleAudioReader::get_rate()
 {
-       return m_reader->get_rate();
-//     return audiodevice().get_sample_rate();
+       if (m_reader) {
+               //return m_reader->get_rate();
+               return audiodevice().get_sample_rate();
+       }
+       
+       return 0;
 }
 
 
@@ -141,9 +151,10 @@
 
 // If no conversion is necessary, pass the read straight to the child 
AudioReader,
 // otherwise get data from childreader and use libsamplerate to convert
-int ResampleAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t ResampleAudioReader::read(audio_sample_t** buffer, nframes_t 
frameCount)
 {
-       uint samplesRead;
+       nframes_t sourceFramesRead;
+       nframes_t framesRead;
        Q_ASSERT(m_reader);
        
        /////////////////////////////////
@@ -153,64 +164,69 @@
        
        // pass through if not changing sampleRate.
        if (audiodevice().get_sample_rate() == (uint)m_reader->get_rate()) {
-               samplesRead = m_reader->read(dst, sampleCount);
-               return samplesRead;
+               sourceFramesRead = m_reader->read(buffer, frameCount);
+               return framesRead;
        }
        
-       uint fileCnt = (song_to_file_frame(sampleCount / get_num_channels())) * 
get_num_channels();
+       nframes_t fileCnt = song_to_file_frame(frameCount);
        
-       if (sampleCount && fileCnt / get_num_channels() < 1) {
-               fileCnt = 1 * get_num_channels();
+       if (frameCount && !fileCnt) {
+               fileCnt = 1;
        }
        
-       // make sure that the reusable m_fileBuffer is big enough for this read
+       // make sure that the reusable m_fileBuffers are big enough for this 
read
        if ((uint)m_fileBufferLength < fileCnt) {
-               if (m_fileBuffer) {
-                       delete m_fileBuffer;
+               for (int c = 0; c < get_num_channels(); c++) {
+                       if (m_fileBuffers.size()) {
+                               delete m_fileBuffers[c];
+                       }
+                       m_fileBuffers[c] = new audio_sample_t[fileCnt];
                }
-               m_fileBuffer = new audio_sample_t[fileCnt];
                m_fileBufferLength = fileCnt;
        }
        
-       samplesRead = m_reader->read(m_fileBuffer, fileCnt);
+       framesRead = m_reader->read(m_fileBuffers.data(), fileCnt);
        
        //printf("Resampler: sampleCount %lu, fileCnt %lu, returned %lu\n", 
sampleCount/get_num_channels(), fileCnt/get_num_channels(), 
samplesRead/get_num_channels());
        
+       for (int c = 0; c < get_num_channels(); c++) {
        // Set up sample rate converter struct for s.r.c. processing
-       m_srcData.data_in = m_fileBuffer;
-       m_srcData.input_frames = samplesRead / get_num_channels();
-       m_srcData.data_out = dst;
-       m_srcData.output_frames = sampleCount / get_num_channels();
+               m_srcData.data_in = m_fileBuffers[c];
+               m_srcData.input_frames = sourceFramesRead;
+               m_srcData.data_out = buffer[c];
+               m_srcData.output_frames = frameCount;
        m_srcData.src_ratio = (double) audiodevice().get_sample_rate() / 
m_reader->get_rate();
-       src_set_ratio(m_srcState, m_srcData.src_ratio);
+               src_set_ratio(m_srcStates[c], m_srcData.src_ratio);
        
-       if (src_process(m_srcState, &m_srcData)) {
+               if (src_process(m_srcStates[c], &m_srcData)) {
                PERROR("Resampler: src_process() error!");
                return 0;
        }
-       
-       samplesRead = m_srcData.output_frames_gen * get_num_channels();
+               framesRead = m_srcData.output_frames_gen;
+               printf("%lu -- ", framesRead);
+       }
+       printf("(frames read per channel)\n");
        
        // Pad end of file with 0s if necessary
-       int remainingSamplesRequested = sampleCount - samplesRead;
-       int remainingSamplesInFile = (get_length() - m_readPos - 
m_srcData.output_frames_gen) * get_num_channels();
+       int remainingFramesRequested = frameCount - framesRead;
+       int remainingFramesInFile = get_length() - m_readPos - 
m_srcData.output_frames_gen;
        
-       if (samplesRead == 0 && remainingSamplesRequested > 0 && 
remainingSamplesInFile > 0) {
-               int padLength = (remainingSamplesRequested > 
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
-               memset(dst + samplesRead, 0, padLength * 
sizeof(audio_sample_t));
-               samplesRead += padLength;
+       if (framesRead == 0 && remainingFramesRequested > 0 && 
remainingFramesInFile > 0) {
+               int padLength = (remainingFramesRequested > 
remainingFramesInFile) ? remainingFramesInFile : remainingFramesRequested;
+               for (int c = 0; c < get_num_channels(); c++) {
+                       memset(buffer[c] + framesRead, 0, padLength * 
sizeof(audio_sample_t));
+               }
+               framesRead += padLength;
                printf("Resampler: padding: %d\n", padLength);
        }       
        
        // Truncate so we don't return too many samples
-       if (samplesRead > (uint)remainingSamplesInFile) {
-               printf("Resampler: truncating: %d\n", samplesRead - 
remainingSamplesInFile);
-               samplesRead = remainingSamplesInFile;
+       if (framesRead > (uint)remainingFramesInFile) {
+               printf("Resampler: truncating: %d\n", framesRead - 
remainingFramesInFile);
+               framesRead = remainingFramesInFile;
        }
        
-       
-       //printf("Resampler: req: %d, got: %d\n", sampleCount, samplesRead);
-       return samplesRead;
+       return framesRead;
 }
 
 

Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- ResampleAudioReader.h       18 Jul 2007 13:13:06 -0000      1.6
+++ ResampleAudioReader.h       18 Jul 2007 18:15:22 -0000      1.7
@@ -23,6 +23,7 @@
 #define RESAMPLEAUDIOREADER_H
 
 #include <AbstractAudioReader.h>
+#include <QVector>
 #include <samplerate.h>
 
 
@@ -37,7 +38,7 @@
        nframes_t get_length();
        int get_rate();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, int sampleCount);
+       nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
 
 
 protected:
@@ -47,10 +48,11 @@
        nframes_t song_to_file_frame(nframes_t frame);
        nframes_t file_to_song_frame(nframes_t frame);
 
+       bool                    m_valid;
        AbstractAudioReader*    m_reader;
-       SRC_STATE*      m_srcState;
+       QVector<SRC_STATE*>     m_srcStates;
        SRC_DATA        m_srcData;
-       audio_sample_t  *m_fileBuffer;
+       QVector<audio_sample_t*> m_fileBuffers;
        long            m_fileBufferLength;
 };
 

Index: SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- SFAudioReader.cpp   18 Jul 2007 13:13:07 -0000      1.4
+++ SFAudioReader.cpp   18 Jul 2007 18:15:22 -0000      1.5
@@ -41,11 +41,18 @@
        if ((m_sf = sf_open ((m_fileName.toUtf8().data()), SFM_READ, 
&m_sfinfo)) == 0) {
                PERROR("Couldn't open soundfile (%s)", QS_C(m_fileName));
        }
+       
+       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!");
@@ -104,13 +111,6 @@
 }
 
 
-// Should this exist?  Should we just be smarter in MonoReader so we don't 
need this?
-bool SFAudioReader::is_compressed()
-{
-       return ((m_sfinfo.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_FLAC );
-}
-
-
 bool SFAudioReader::seek(nframes_t start)
 {
        Q_ASSERT(m_sf);
@@ -131,14 +131,38 @@
 }
 
 
-int SFAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t SFAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
 {
        Q_ASSERT(m_sf);
        
-       int samplesRead = sf_read_float (m_sf, dst, sampleCount);
+       // 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 * 
get_num_channels()];
+       }
+       nframes_t framesRead = sf_readf_float(m_sf, m_tmpBuffer, frameCount);
        
-       // FIXME: deinterlace here instead of in MonoReader
+       // De-interlace
+       switch (get_num_channels()) {
+               case 1:
+                       memcpy(buffer[0], m_tmpBuffer, 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];
+                       }
+                       break;  
+               default:
+                       for (int f = 0; f < framesRead; f++) {
+                               for (int c = 0; c < get_num_channels(); c++) {
+                                       buffer[c][f] = m_tmpBuffer[f * 
get_num_channels() + c];
+                               }
+                       }
+       }
        
-       return samplesRead;
+       return framesRead;
 }
 

Index: SFAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- SFAudioReader.h     8 Jul 2007 23:16:56 -0000       1.3
+++ SFAudioReader.h     18 Jul 2007 18:15:22 -0000      1.4
@@ -35,15 +35,16 @@
        int get_num_channels();
        nframes_t get_length();
        int get_rate();
-       bool is_compressed();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, int sampleCount);
+       nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
 
        static bool can_decode(QString filename);
 
 protected:
        SNDFILE*        m_sf;
        SF_INFO         m_sfinfo;
+       audio_sample_t  *m_tmpBuffer;
+       int             m_tmpBufferSize;
 };
 
 #endif

Index: Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -b -r1.123 -r1.124
--- Song.cpp    18 Jul 2007 13:13:07 -0000      1.123
+++ Song.cpp    18 Jul 2007 18:15:22 -0000      1.124
@@ -1256,6 +1256,7 @@
 #if defined (THREAD_CHECK)
        Q_ASSERT(QThread::currentThreadId() ==  threadId);
 #endif
+       printf("set_transport_pos(%lu)\n", position);
        audiodevice().transport_seek_to(m_audiodeviceClient, position);
 }
 

Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- VorbisAudioReader.cpp       18 Jul 2007 13:13:07 -0000      1.6
+++ VorbisAudioReader.cpp       18 Jul 2007 18:15:23 -0000      1.7
@@ -127,41 +127,37 @@
 }
 
 
-int VorbisAudioReader::read(audio_sample_t* dst, int sampleCount)
+nframes_t VorbisAudioReader::read(audio_sample_t** buffer, nframes_t 
frameCount)
 {
        Q_ASSERT(m_file);
        
-       nframes_t totalRead = 0;
+       nframes_t totalFramesRead = 0;
        
-       while (totalRead < sampleCount) {
+       while (totalFramesRead < frameCount) {
                audio_sample_t** tmp;
                int bs;
-               int samplesRead = ov_read_float(&m_vf, &tmp, (sampleCount - 
totalRead) / get_num_channels(), &bs);
+               nframes_t framesRead = ov_read_float(&m_vf, &tmp, frameCount - 
totalFramesRead, &bs);
                
-               if (samplesRead == OV_HOLE) {
+               if (framesRead == OV_HOLE) {
                        // Hole detected: recursive retry
                        PERROR("VorbisAudioReader: OV_HOLE");
-                       return read(dst, sampleCount);
+                       return read(buffer, frameCount);
                }
-               else if (samplesRead == 0) {
+               else if (framesRead == 0) {
                        /* EOF */
                        break;
-               } else if (samplesRead < 0) {
+               } else if (framesRead < 0) {
                        /* error in the stream. */
                        PERROR("VorbisFile decoding error");
                        break;
                }
                
-               // FIXME: Instead of interlacing here, deinterlace in other 
AudioReaders!! (since we deinterlace later anyway)
-               int frames = samplesRead;
-               for (int f=0; f < frames; f++) {
                        for (int c=0; c < get_num_channels(); c++) {
-                               dst[totalRead + f * get_num_channels() + c] = 
tmp[c][f];
+                       memcpy(buffer[c] + totalFramesRead, tmp[c], framesRead 
* sizeof(audio_sample_t));
                        }
-               }
-               totalRead += samplesRead * get_num_channels();
+               totalFramesRead += framesRead;
        }
        
-       return totalRead;
+       return totalFramesRead;
 }
 

Index: VorbisAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- VorbisAudioReader.h 13 Jul 2007 07:41:03 -0000      1.4
+++ VorbisAudioReader.h 18 Jul 2007 18:15:23 -0000      1.5
@@ -38,7 +38,7 @@
        nframes_t get_length();
        int get_rate();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, int sampleCount);
+       nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
 
        static bool can_decode(QString filename);
 

Index: core.pro
===================================================================
RCS file: /sources/traverso/traverso/src/core/core.pro,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- core.pro    18 Jul 2007 13:13:05 -0000      1.33
+++ core.pro    18 Jul 2007 18:15:23 -0000      1.34
@@ -55,7 +55,8 @@
        FlacAudioReader.cpp \
        ResampleAudioReader.cpp \
        VorbisAudioReader.cpp \
-       MadAudioReader.cpp
+#      MadAudioReader.cpp
+
 HEADERS = precompile.h \
        AudioClip.h \
        AudioClipList.h \
@@ -104,7 +105,8 @@
        FlacAudioReader.h \
        ResampleAudioReader.h \
        VorbisAudioReader.h \
-       MadAudioReader.h
+#      MadAudioReader.h
+
 macx{
     QMAKE_LIBDIR += /usr/local/qt/lib
 }




reply via email to

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