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: Tue, 24 Jul 2007 17:57:06 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Ben Levitt <benjie>     07/07/24 17:57:06

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

Log message:
        Clean up the AudioReader classes.  Pull more common code into 
        AbstractAudioReader.  Pull all traverso-specific calls out of the 
        AudioReaders.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.cpp?cvsroot=traverso&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.h?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.h?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.42&r2=1.43
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.h?cvsroot=traverso&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.h?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.h?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/WPAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/WPAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4

Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- AbstractAudioReader.cpp     23 Jul 2007 22:33:50 -0000      1.13
+++ AbstractAudioReader.cpp     24 Jul 2007 17:57:05 -0000      1.14
@@ -64,6 +64,36 @@
 }
 
 
+int AbstractAudioReader::get_num_channels()
+{
+       return m_channels;
+}
+
+
+nframes_t AbstractAudioReader::get_length()
+{
+       return m_length;
+}
+
+
+int AbstractAudioReader::get_file_rate()
+{
+       return m_rate;
+}
+
+
+bool AbstractAudioReader::eof()
+{
+       return (m_readPos >= m_length);
+}
+
+
+nframes_t AbstractAudioReader::pos()
+{
+       return m_readPos;
+}
+
+
 bool AbstractAudioReader::seek(nframes_t start)
 {
        if (m_readPos != start) {
@@ -79,7 +109,7 @@
 
 nframes_t AbstractAudioReader::read(audio_sample_t** buffer, nframes_t count)
 {
-       if (count && m_readPos < get_length()) {
+       if (count && m_readPos < m_length) {
        //      printf("read_from:: after_seek from %d, framepos is %d\n", 
start, m_readPos);
                nframes_t framesRead = read_private(buffer, count);
                
@@ -116,27 +146,11 @@
                return 0;
        }
        
-       if (newReader->get_rate() <= 0) {
-               PERROR("new reader has rate=0!");
+       if (newReader->get_num_channels() <= 0) {
+               PERROR("new reader has 0 channels!");
                return 0;
        }
 
        return newReader;
 }
 
-
-// Static method used by other classes to get an automatically resampling 
AudioReader that wraps
-// an AudioReader chosen by create_audio_reader().
-AbstractAudioReader* AbstractAudioReader::create_resampled_audio_reader(const 
QString& filename, int converter_type)
-{
-       ResampleAudioReader* newReader;
-
-       newReader = new ResampleAudioReader(filename, converter_type);
-
-       if (newReader->get_rate() > 0) {
-               return newReader;
-       }
-       
-       return 0;
-}
-

Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- AbstractAudioReader.h       20 Jul 2007 23:04:21 -0000      1.11
+++ AbstractAudioReader.h       24 Jul 2007 17:57:05 -0000      1.12
@@ -37,15 +37,17 @@
        AbstractAudioReader(const QString& filename);
        ~AbstractAudioReader();
        
-       virtual int get_num_channels() = 0;
-       virtual nframes_t get_length() = 0;
-       virtual int get_rate() = 0;
+       int get_num_channels();
+       nframes_t get_length();
+       int get_file_rate();
+       bool eof();
+       nframes_t pos();
+       
        nframes_t read_from(audio_sample_t** buffer, nframes_t start, nframes_t 
count);
        bool seek(nframes_t start);
        nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
        
        static AbstractAudioReader* create_audio_reader(const QString& 
filename);
-       static AbstractAudioReader* create_resampled_audio_reader(const 
QString& filename, int converter_type);
 
 protected:
        virtual bool seek_private(nframes_t start) = 0;
@@ -53,8 +55,11 @@
        
        QString         m_fileName;
        QMutex          m_mutex;
-       nframes_t       m_readPos;
 
+       nframes_t       m_readPos;
+       nframes_t       m_channels;
+       nframes_t       m_length;
+       nframes_t       m_rate;
 };
 
 #endif

Index: FlacAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- FlacAudioReader.cpp 21 Jul 2007 01:00:23 -0000      1.9
+++ FlacAudioReader.cpp 24 Jul 2007 17:57:05 -0000      1.10
@@ -265,6 +265,12 @@
  : AbstractAudioReader(filename)
 {
        m_flac = new FlacPrivate(filename);
+       
+       if (m_flac) {
+               m_channels = m_flac->m_channels;
+               m_length = m_flac->m_samples;
+               m_rate = m_flac->m_rate;
+       }
 }
 
 
@@ -337,34 +343,6 @@
 }
 
 
-int FlacAudioReader::get_num_channels()
-{
-       if (m_flac) {
-               return m_flac->m_channels;
-       }
-       return 0;
-}
-
-
-nframes_t FlacAudioReader::get_length()
-{
-       if (m_flac) {
-               // Is this returning one frame too long?
-               return m_flac->m_samples;
-       }
-       return 0;
-}
-
-
-int FlacAudioReader::get_rate()
-{
-       if (m_flac) {
-               return m_flac->m_rate;
-       }
-       return 0;
-}
-
-
 bool FlacAudioReader::seek_private(nframes_t start)
 {
        Q_ASSERT(m_flac);

Index: FlacAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- FlacAudioReader.h   20 Jul 2007 23:04:21 -0000      1.4
+++ FlacAudioReader.h   24 Jul 2007 17:57:05 -0000      1.5
@@ -33,10 +33,6 @@
        FlacAudioReader(QString filename);
        ~FlacAudioReader();
 
-       int get_num_channels();
-       nframes_t get_length();
-       int get_rate();
-       
        static bool can_decode(QString filename);
        
 protected:

Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- MadAudioReader.cpp  23 Jul 2007 22:33:50 -0000      1.12
+++ MadAudioReader.cpp  24 Jul 2007 17:57:05 -0000      1.13
@@ -485,10 +485,7 @@
        
        initDecoderInternal();
 
-       m_channels = 0;
-       m_frames = countFrames();
-       
-       if (m_frames <= 0) {
+       if (m_length <= 0) {
                d->handle->cleanup();
                delete d->handle;
                delete d;
@@ -505,6 +502,9 @@
                        m_channels = 2;
        }
 
+       m_length = countFrames();
+       m_rate = d->firstHeader.samplerate;
+       
        for (int c = 0; c < m_channels; c++) {
                d->overflowBuffers.append(new audio_sample_t[1152]);
        }
@@ -596,38 +596,11 @@
 }
 
 
-int MadAudioReader::get_num_channels()
-{
-       if (d) {
-               return m_channels;
-       }
-       return 0;
-}
-
-
-nframes_t MadAudioReader::get_length()
-{
-       if (d) {
-               return m_frames;
-       }
-       return 0;
-}
-
-
-int MadAudioReader::get_rate()
-{
-       if (d) {
-               return d->firstHeader.samplerate;
-       }
-       return 0;
-}
-
-
 bool MadAudioReader::seek_private(nframes_t start)
 {
        Q_ASSERT(d);
        
-       if (start >= get_length()) {
+       if (start >= m_length) {
                return false;
        }
        
@@ -644,11 +617,11 @@
        //
        double mp3FrameSecs = 
static_cast<double>(d->firstHeader.duration.seconds) + 
static_cast<double>(d->firstHeader.duration.fraction) / 
static_cast<double>(MAD_TIMER_RESOLUTION);
        
-       double posSecs = static_cast<double>(start) / get_rate();
+       double posSecs = static_cast<double>(start) / m_rate;
        
        // seekPosition to seek after frame i
        unsigned int frame = static_cast<unsigned int>(posSecs / mp3FrameSecs);
-       nframes_t frameOffset = (nframes_t)(start - (frame * mp3FrameSecs * 
get_rate() + 0.5));
+       nframes_t frameOffset = (nframes_t)(start - (frame * mp3FrameSecs * 
m_rate + 0.5));
        
        // K3b source: Rob said: 29 frames is the theoretically max frame 
reservoir limit
        // (whatever that means...) it seems that mad needs at most 29 frames 
to get ready
@@ -765,7 +738,7 @@
        }
        
        if (!d->handle->inputError() && !error) {
-               frames =  get_rate() * (d->handle->madTimer->seconds + 
(unsigned long)(
+               frames =  d->firstHeader.samplerate * 
(d->handle->madTimer->seconds + (unsigned long)(
                        
(float)d->handle->madTimer->fraction/(float)MAD_TIMER_RESOLUTION));
                //kdDebug() << "(K3bMadDecoder) length of track " << seconds << 
endl;
        }
@@ -790,7 +763,7 @@
        if (d->overflowSize > 0) {
                if (d->overflowSize < frameCount) {
                        //printf("output all %d overflow samples\n", 
d->overflowSize);
-                       for (int c = 0; c < get_num_channels(); c++) {
+                       for (int c = 0; c < m_channels; c++) {
                                memcpy(d->outputBuffers[c], 
d->overflowBuffers[c] + d->overflowStart, d->overflowSize * 
sizeof(audio_sample_t));
                        }
                        d->outputPos += d->overflowSize;
@@ -799,7 +772,7 @@
                }
                else {
                        //printf("output %d overflow frames, returned from 
overflow\n", frameCount);
-                       for (int c = 0; c < get_num_channels(); c++) {
+                       for (int c = 0; c < m_channels; c++) {
                                memcpy(d->outputBuffers[c], 
d->overflowBuffers[c] + d->overflowStart, frameCount * sizeof(audio_sample_t));
                        }
                        d->overflowSize -= frameCount;
@@ -839,13 +812,13 @@
        
        // Pad end with zeros if necessary
        // FIXME: This shouldn't be necessary!  :P
-       // is get_length() reporting incorrectly?
+       // is m_length reporting incorrectly?
        // are we not outputting the last mp3-frame for some reason?
        /*int remainingFramesRequested = frameCount - framesWritten;
-       int remainingFramesInFile = get_length() - (m_readPos + framesWritten);
+       int remainingFramesInFile = m_length - (m_readPos + framesWritten);
        if (remainingFramesRequested > 0 && remainingFramesInFile > 0) {
                int padLength = (remainingFramesRequested > 
remainingFramesInFile) ? remainingFramesInFile : remainingFramesRequested;
-               for (int c = 0; c < get_num_channels(); c++) {
+               for (int c = 0; c < m_channels; c++) {
                        //memset(d->outputBuffers[c] + framesWritten, 0, 
padLength * sizeof(audio_sample_t));
                }
                framesWritten += padLength;
@@ -853,12 +826,12 @@
        }
 
        // Truncate so we don't return too many frames
-       if (framesWritten + m_readPos > get_length()) {
-               printf("truncating by %d!\n", get_length() - (framesWritten + 
m_readPos));
-               framesWritten = get_length() - m_readPos;
+       if (framesWritten + m_readPos > m_length) {
+               printf("truncating by %d!\n", m_length - (framesWritten + 
m_readPos));
+               framesWritten = m_length - m_readPos;
        }*/
        
-       //printf("request: %d (returned: %d), now at: %lu (total: %lu)\n", 
frameCount, framesWritten, m_readPos + framesWritten, m_frames);
+       //printf("request: %d (returned: %d), now at: %lu (total: %lu)\n", 
frameCount, framesWritten, m_readPos + framesWritten, m_length);
        
        return framesWritten;
 }
@@ -872,9 +845,9 @@
        bool            overflow = false;
        int             i;
        
-       if (writeBuffers && (m_readPos + d->outputPos + nframes) > 
get_length()) {
-               nframes = get_length() - (m_readPos + offset);
-               //printf("!!!nframes: %lu, length: %lu, current: %lu\n", 
nframes, get_length(), d->outputPos + m_readPos);
+       if (writeBuffers && (m_readPos + d->outputPos + nframes) > m_length) {
+               nframes = m_length - (m_readPos + offset);
+               //printf("!!!nframes: %lu, length: %lu, current: %lu\n", 
nframes, m_length, d->outputPos + m_readPos);
        }
        
        // now create the output

Index: MadAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- MadAudioReader.h    20 Jul 2007 23:04:21 -0000      1.5
+++ MadAudioReader.h    24 Jul 2007 17:57:05 -0000      1.6
@@ -35,10 +35,6 @@
        MadAudioReader(QString filename);
        ~MadAudioReader();
 
-       int get_num_channels();
-       nframes_t get_length();
-       int get_rate();
-       
        static bool can_decode(QString filename);
        
 protected:
@@ -50,8 +46,6 @@
        bool createPcmSamples(mad_synth* synth);
        
        static int      MaxAllowedRecoverableErrors;
-       nframes_t       m_frames;
-       int             m_channels;
 
        class MadDecoderPrivate;
        MadDecoderPrivate* d;

Index: ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -b -r1.42 -r1.43
--- ReadSource.cpp      18 Jul 2007 18:15:21 -0000      1.42
+++ ReadSource.cpp      24 Jul 2007 17:57:06 -0000      1.43
@@ -21,6 +21,7 @@
 
 #include "ReadSource.h"
 #include "AbstractAudioReader.h"
+#include "ResampleAudioReader.h"
 
 #include "Peak.h"
 #include "ProjectManager.h"
@@ -172,7 +173,11 @@
                converter_type = config().get_property("Conversion", 
"RTResamplingConverterType", 2).toInt();
                // There should be another config option for ConverterType to 
use for export (higher quality)
                //converter_type = config().get_property("Conversion", 
"ExportResamplingConverterType", 0).toInt();
-               m_audioReader = 
AbstractAudioReader::create_resampled_audio_reader(m_fileName, converter_type);
+               m_audioReader = new ResampleAudioReader(m_fileName, 
converter_type);
+               if (m_audioReader) {
+                       output_rate_changed();
+                       connect(&audiodevice(), SIGNAL(driverParamsChanged()), 
this, SLOT(output_rate_changed()));
+               }
        }
        else {
                m_audioReader = 
AbstractAudioReader::create_audio_reader(m_fileName);
@@ -197,7 +202,7 @@
        }
 
        m_length = m_audioReader->get_length();
-       m_rate = m_audioReader->get_rate();
+       m_rate = m_audioReader->get_file_rate();
        
        m_bufferstatus = new BufferStatus;
        
@@ -205,6 +210,12 @@
 }
 
 
+void ReadSource::output_rate_changed()
+{
+       
((ResampleAudioReader*)m_audioReader)->set_output_rate(audiodevice().get_sample_rate());
+}
+
+
 int ReadSource::file_read(audio_sample_t** dst, nframes_t start, nframes_t 
cnt, audio_sample_t* readbuffer) const
 {
 #if defined (profile)
@@ -220,8 +231,6 @@
                return (int)result;
        }
 
-       float *ptr;
-       
        // The readbuffer 'assumes' that there is max 2 channels...
        Q_ASSERT(m_audioReader->get_num_channels() <= 2);
        
@@ -231,18 +240,6 @@
        if (processtime > 40000)
                printf("Process time for %s: %d useconds\n\n", 
QS_C(m_fileName), processtime);
 #endif
-       /*ptr = readbuffer;
-
-       for (int32_t n = 0; n < nread; ++n) {
-               dst[0][n] = *ptr;
-               ptr += m_audioReader->get_num_channels();
-       }
-       
-       ptr = readbuffer+1;
-       for (int32_t n = 0; n < nread; ++n) {
-               dst[1][n] = *ptr;
-               ptr += m_audioReader->get_num_channels();
-       }*/
        
        return nread;
 }

Index: ReadSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.h,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- ReadSource.h        18 Jul 2007 13:13:06 -0000      1.30
+++ ReadSource.h        24 Jul 2007 17:57:06 -0000      1.31
@@ -68,6 +68,9 @@
        size_t is_active() const;
        BufferStatus* get_buffer_status();
 
+public slots:
+       void output_rate_changed();
+       
 private:
        QList<RingBufferNPT<float>*> m_buffers;
        AbstractAudioReader*    m_audioReader;

Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- ResampleAudioReader.cpp     23 Jul 2007 16:23:39 -0000      1.13
+++ ResampleAudioReader.cpp     24 Jul 2007 17:57:06 -0000      1.14
@@ -22,7 +22,6 @@
 #include "ResampleAudioReader.h"
 #include <QString>
 #include "Utils.h"
-#include "AudioDevice.h"
 
 #define OVERFLOW_SIZE 1024
 
@@ -41,6 +40,11 @@
                return;
        }
        
+       m_channels = m_reader->get_num_channels();
+       m_rate = m_reader->get_file_rate();
+       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;
@@ -102,46 +106,22 @@
        
        m_srcData.end_of_input = 0;
        m_overflowUsed = 0;
-       m_eof = 0;
 }
 
 
-// Get from child AudioReader
-int ResampleAudioReader::get_num_channels()
+int ResampleAudioReader::get_output_rate()
 {
-       if (m_reader) {
-               return m_reader->get_num_channels();
-       }
-       
-       return 0;
+       return m_outputRate;
 }
 
 
-// Get from child AudioReader, convert from file's frames to song's frames
-nframes_t ResampleAudioReader::get_length()
+void ResampleAudioReader::set_output_rate(int rate)
 {
-       if (m_reader) {
-               if (audiodevice().get_sample_rate() == 
(uint)m_reader->get_rate()) {
-                       return m_reader->get_length();
-               }
-               return file_to_song_frame(m_reader->get_length());
-       }
-       
-       return 0;
-}
-
-
-// Always the rate of the audio device
-// Remon @ Ben: why is that? imo it should just return the real rate, how else
-// is anything gonna to know what the 'real' rate of an audiofile is ?
-int ResampleAudioReader::get_rate()
-{
-       if (m_reader) {
-               return m_reader->get_rate();
-//             return audiodevice().get_sample_rate();
+       if (!m_reader) {
+               return;
        }
-       
-       return 0;
+       m_outputRate = rate;
+       m_length = file_to_song_frame(m_reader->get_length());
 }
 
 
@@ -151,7 +131,7 @@
 {
        Q_ASSERT(m_reader);
        
-       if (audiodevice().get_sample_rate() == (uint)m_reader->get_rate()) {
+       if (m_outputRate == m_rate) {
                return m_reader->seek(start);
        }
        
@@ -168,7 +148,7 @@
        Q_ASSERT(m_reader);
        
        // pass through if not changing sampleRate.
-       if (audiodevice().get_sample_rate() == (uint)m_reader->get_rate()) {
+       if (m_outputRate == m_rate) {
                return m_reader->read(buffer, frameCount);
        }
        
@@ -183,10 +163,10 @@
        
        bufferUsed = m_overflowUsed;
        
-       if (!m_eof) { // FIXME: add and use Reader::eof()
+       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 < get_num_channels(); c++) {
+                       for (int c = 0; c < m_channels; c++) {
                                if (m_fileBufferLength) {
                                        delete m_fileBuffers[c];
                                }
@@ -195,7 +175,7 @@
                        m_fileBufferLength = fileCnt + OVERFLOW_SIZE;
                }
                
-               for (int c = 0; c < get_num_channels(); c++) {
+               for (int c = 0; c < m_channels; c++) {
                        m_filePointers[c] = m_fileBuffers[c] + m_overflowUsed;
                }
                
@@ -203,23 +183,22 @@
                //printf("Resampler: Read %lu of %lu (%lu)\n", bufferUsed, 
fileCnt + OVERFLOW_SIZE - m_overflowUsed, m_reader->get_length());
        }
        
-       if (bufferUsed < fileCnt) {
+       if (m_reader->eof()) {
                m_srcData.end_of_input = 1;
-               m_eof = 1;
        }
        
        nframes_t framesToConvert = frameCount;
-       if (frameCount > get_length() - m_readPos) {
-               framesToConvert = get_length() - m_readPos;
+       if (frameCount > m_length - m_readPos) {
+               framesToConvert = m_length - m_readPos;
        }
        
-       for (int c = 0; c < get_num_channels(); c++) {
+       for (int c = 0; c < m_channels; c++) {
                // 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.output_frames = framesToConvert;
-               m_srcData.src_ratio = (double) audiodevice().get_sample_rate() 
/ m_reader->get_rate();
+               m_srcData.src_ratio = (double) m_outputRate / m_rate;
                src_set_ratio(m_srcStates[c], m_srcData.src_ratio);
                
                if (src_process(m_srcStates[c], &m_srcData)) {
@@ -236,7 +215,7 @@
        }
        
        if (m_srcData.input_frames_used < bufferUsed) {
-               for (int c = 0; c < get_num_channels(); c++) {
+               for (int c = 0; c < m_channels; c++) {
                        memmove(m_fileBuffers[c], m_fileBuffers[c] + 
m_srcData.input_frames_used, m_overflowUsed * sizeof(audio_sample_t));
                }
        }
@@ -244,7 +223,7 @@
        // Pad end of file with 0s if necessary
        if (framesRead == 0 && m_readPos < get_length()) {
                int padLength = m_readPos;
-               for (int c = 0; c < get_num_channels(); c++) {
+               for (int c = 0; c < m_channels; c++) {
                        memset(buffer[c] + framesRead, 0, padLength * 
sizeof(audio_sample_t));
                }
                framesRead += padLength;
@@ -267,7 +246,7 @@
 {
        Q_ASSERT(m_reader);
        
-       return (nframes_t)(frame * (((double) m_reader->get_rate()) / 
audiodevice().get_sample_rate()));
+       return (nframes_t)(frame * ((double) m_rate / m_outputRate));
 }
 
 
@@ -275,6 +254,6 @@
 {
        Q_ASSERT(m_reader);
        
-       return (nframes_t)(frame * (((double) audiodevice().get_sample_rate()) 
/ m_reader->get_rate()));
+       return (nframes_t)(frame * ((double) m_outputRate / m_rate));
 }
 

Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- ResampleAudioReader.h       23 Jul 2007 16:23:39 -0000      1.10
+++ ResampleAudioReader.h       24 Jul 2007 17:57:06 -0000      1.11
@@ -34,9 +34,8 @@
        ResampleAudioReader(QString filename, int converter_type);
        ~ResampleAudioReader();
        
-       int get_num_channels();
-       nframes_t get_length();
-       int get_rate();
+       int get_output_rate();
+       void set_output_rate(int rate);
        
 protected:
        void init(int converter_type);
@@ -56,7 +55,7 @@
        QVector<audio_sample_t*> m_filePointers;
        long                    m_fileBufferLength;
        long                    m_overflowUsed;
-       bool                    m_eof;
+       int                     m_outputRate;
 };
 
 #endif

Index: SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- SFAudioReader.cpp   20 Jul 2007 23:04:21 -0000      1.7
+++ SFAudioReader.cpp   24 Jul 2007 17:57:06 -0000      1.8
@@ -42,6 +42,10 @@
                PERROR("Couldn't open soundfile (%s)", QS_C(m_fileName));
        }
        
+       m_channels = m_sfinfo.channels;
+       m_length = m_sfinfo.frames;
+       m_rate = m_sfinfo.samplerate;
+       
        m_tmpBuffer = 0;
        m_tmpBufferSize = 0;
 }
@@ -84,39 +88,12 @@
 }
 
 
-int SFAudioReader::get_num_channels()
-{
-       if (m_sf) {
-               return m_sfinfo.channels;
-       }
-       return 0;
-}
-
-
-nframes_t SFAudioReader::get_length()
-{
-       if (m_sf) {
-               return m_sfinfo.frames;
-       }
-       return 0;
-}
-
-
-int SFAudioReader::get_rate()
-{
-       if (m_sf) {
-               return m_sfinfo.samplerate;
-       }
-       return 0;
-}
-
-
 bool SFAudioReader::seek_private(nframes_t start)
 {
        Q_ASSERT(m_sf);
        
        
-       if (start >= get_length()) {
+       if (start >= m_length) {
                return false;
        }
        
@@ -140,12 +117,12 @@
                if (m_tmpBuffer) {
                        delete m_tmpBuffer;
                }
-               m_tmpBuffer = new audio_sample_t[frameCount * 
get_num_channels()];
+               m_tmpBuffer = new audio_sample_t[frameCount * m_channels];
        }
        nframes_t framesRead = sf_readf_float(m_sf, m_tmpBuffer, frameCount);
        
        // De-interlace
-       switch (get_num_channels()) {
+       switch (m_channels) {
                case 1:
                        memcpy(buffer[0], m_tmpBuffer, framesRead * 
sizeof(audio_sample_t));
                        break;  
@@ -157,8 +134,8 @@
                        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];
+                               for (int c = 0; c < m_channels; c++) {
+                                       buffer[c][f] = m_tmpBuffer[f * 
m_channels + c];
                                }
                        }
        }

Index: SFAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- SFAudioReader.h     20 Jul 2007 23:04:21 -0000      1.5
+++ SFAudioReader.h     24 Jul 2007 17:57:06 -0000      1.6
@@ -32,10 +32,6 @@
        SFAudioReader(QString filename);
        ~SFAudioReader();
 
-       int get_num_channels();
-       nframes_t get_length();
-       int get_rate();
-
        static bool can_decode(QString filename);
 
 protected:

Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- VorbisAudioReader.cpp       20 Jul 2007 23:04:21 -0000      1.9
+++ VorbisAudioReader.cpp       24 Jul 2007 17:57:06 -0000      1.10
@@ -51,6 +51,10 @@
 
        ov_pcm_seek(&m_vf, 0);
        m_vi = ov_info(&m_vf,-1);
+       
+       m_channels = m_vi->channels;
+       m_length = ov_pcm_total(&m_vf, -1);
+       m_rate = m_vi->rate;
 }
 
 
@@ -83,38 +87,11 @@
 }
 
 
-int VorbisAudioReader::get_num_channels()
-{
-       if (m_file) {
-               return m_vi->channels;
-       }
-       return 0;
-}
-
-
-nframes_t VorbisAudioReader::get_length()
-{
-       if (m_file) {
-               return ov_pcm_total(&m_vf, -1);
-       }
-       return 0;
-}
-
-
-int VorbisAudioReader::get_rate()
-{
-       if (m_file) {
-               return m_vi->rate;
-       }
-       return 0;
-}
-
-
 bool VorbisAudioReader::seek_private(nframes_t start)
 {
        Q_ASSERT(m_file);
        
-       if (start >= get_length()) {
+       if (start >= m_length) {
                return false;
        }
        
@@ -152,7 +129,7 @@
                        break;
                }
                
-               for (int c=0; c < get_num_channels(); c++) {
+               for (int c=0; c < m_channels; c++) {
                        memcpy(buffer[c] + totalFramesRead, tmp[c], framesRead 
* sizeof(audio_sample_t));
                }
                totalFramesRead += framesRead;

Index: VorbisAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- VorbisAudioReader.h 20 Jul 2007 23:04:21 -0000      1.6
+++ VorbisAudioReader.h 24 Jul 2007 17:57:06 -0000      1.7
@@ -34,10 +34,6 @@
        VorbisAudioReader(QString filename);
        ~VorbisAudioReader();
 
-       int get_num_channels();
-       nframes_t get_length();
-       int get_rate();
-
        static bool can_decode(QString filename);
 
 protected:

Index: WPAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/WPAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- WPAudioReader.cpp   20 Jul 2007 23:04:21 -0000      1.4
+++ WPAudioReader.cpp   24 Jul 2007 17:57:06 -0000      1.5
@@ -42,6 +42,8 @@
        m_isFloat = ((WavpackGetMode(m_wp) & MODE_FLOAT) != 0);
        m_bitsPerSample = WavpackGetBitsPerSample(m_wp);
        m_channels = WavpackGetReducedChannels(m_wp);
+       m_length = WavpackGetNumSamples(m_wp);
+       m_rate = WavpackGetSampleRate(m_wp);
        
        m_tmpBuffer = 0;
        m_tmpBufferSize = 0;
@@ -76,39 +78,12 @@
 }
 
 
-int WPAudioReader::get_num_channels()
-{
-       if (m_wp) {
-               return m_channels;
-       }
-       return 0;
-}
-
-
-nframes_t WPAudioReader::get_length()
-{
-       if (m_wp) {
-               return WavpackGetNumSamples(m_wp);
-       }
-       return 0;
-}
-
-
-int WPAudioReader::get_rate()
-{
-       if (m_wp) {
-               return WavpackGetSampleRate(m_wp);
-       }
-       return 0;
-}
-
-
 bool WPAudioReader::seek_private(nframes_t start)
 {
        Q_ASSERT(m_wp);
        
        
-       if (start >= get_length()) {
+       if (start >= m_length) {
                return false;
        }
        
@@ -130,13 +105,13 @@
                if (m_tmpBuffer) {
                        delete m_tmpBuffer;
                }
-               m_tmpBuffer = new int32_t[frameCount * get_num_channels()];
+               m_tmpBuffer = new int32_t[frameCount * m_channels];
        }
        nframes_t framesRead = WavpackUnpackSamples(m_wp, m_tmpBuffer, 
frameCount);
        
        // De-interlace
        if (m_isFloat) {
-               switch (get_num_channels()) {
+               switch (m_channels) {
                        case 1:
                                memcpy(buffer[0], m_tmpBuffer, framesRead * 
sizeof(audio_sample_t));
                                break;  
@@ -148,14 +123,14 @@
                                break;  
                        default:
                                for (int f = 0; f < framesRead; f++) {
-                                       for (int c = 0; c < get_num_channels(); 
c++) {
-                                               buffer[c][f] = 
((float*)m_tmpBuffer)[f * get_num_channels() + c];
+                                       for (int c = 0; c < m_channels; c++) {
+                                               buffer[c][f] = 
((float*)m_tmpBuffer)[f * m_channels + c];
                                        }
                                }
                }
        }
        else {
-               switch (get_num_channels()) {
+               switch (m_channels) {
                        case 1:
                                for (int f = 0; f < framesRead; f++) {
                                        buffer[0][f] = 
(float)((float)m_tmpBuffer[f]/ (float)((uint)1<<(m_bitsPerSample-1)));
@@ -169,8 +144,8 @@
                                break;  
                        default:
                                for (int f = 0; f < framesRead; f++) {
-                                       for (int c = 0; c < get_num_channels(); 
c++) {
-                                               buffer[c][f] = 
(float)((float)m_tmpBuffer[f + get_num_channels() + c]/ 
(float)((uint)1<<(m_bitsPerSample-1)));
+                                       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)));
                                        }
                                }
                }

Index: WPAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/WPAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- WPAudioReader.h     20 Jul 2007 23:04:21 -0000      1.3
+++ WPAudioReader.h     24 Jul 2007 17:57:06 -0000      1.4
@@ -32,10 +32,6 @@
        WPAudioReader(QString filename);
        ~WPAudioReader();
 
-       int get_num_channels();
-       nframes_t get_length();
-       int get_rate();
-
        static bool can_decode(QString filename);
 
 protected:
@@ -45,7 +41,6 @@
        WavpackContext* m_wp;
        bool            m_isFloat;
        int             m_bitsPerSample;
-       int             m_channels;
        int32_t         *m_tmpBuffer;
        int             m_tmpBufferSize;
 };




reply via email to

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