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: Thu, 27 Sep 2007 19:20:30 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/09/27 19:20:30

Modified files:
        src/audiofileio/decode: AbstractAudioReader.h 
                                ResampleAudioReader.cpp 
                                ResampleAudioReader.h 
        src/core       : ReadSource.cpp ReadSource.h 
        src/engine     : defines.h 

Log message:
        * use ResampledAudioReader in ReadSource, not an AbstractAudioReader.
        * add ability to (re)set the converter type for ResampledAudioReader
        * small cleanup, some comments added 

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.h?cvsroot=traverso&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.h?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.62&r2=1.63
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.h?cvsroot=traverso&r1=1.36&r2=1.37
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/defines.h?cvsroot=traverso&r1=1.23&r2=1.24

Patches:
Index: audiofileio/decode/AbstractAudioReader.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- audiofileio/decode/AbstractAudioReader.h    20 Sep 2007 16:04:27 -0000      
1.15
+++ audiofileio/decode/AbstractAudioReader.h    27 Sep 2007 19:20:29 -0000      
1.16
@@ -102,11 +102,6 @@
        bool eof();
        nframes_t pos();
        
-       nframes_t read_from(DecodeBuffer* buffer, TimeRef& start, nframes_t 
count) {
-               return read_from(buffer, start.to_frame(m_rate), count);
-       }
-       bool seek(const TimeRef& start);
-       
        nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t 
count);
        bool seek(nframes_t start);
        nframes_t read(DecodeBuffer* buffer, nframes_t frameCount);

Index: audiofileio/decode/ResampleAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- audiofileio/decode/ResampleAudioReader.cpp  19 Sep 2007 20:27:46 -0000      
1.12
+++ audiofileio/decode/ResampleAudioReader.cpp  27 Sep 2007 19:20:29 -0000      
1.13
@@ -30,36 +30,33 @@
 
 
 // On init, creates a child AudioReader for any filetype, and a samplerate 
converter
-ResampleAudioReader::ResampleAudioReader(QString filename, int converter_type, 
const QString& decoder)
+ResampleAudioReader::ResampleAudioReader(QString filename, const QString& 
decoder)
  : AbstractAudioReader(filename)
 {
        m_reader = AbstractAudioReader::create_audio_reader(filename, decoder);
        if (!m_reader) {
                PERROR("ResampleAudioReader: couldn't create AudioReader");
-               return;
-       }
-       
+               m_channels = m_nframes = 0;
+       } else {
        m_channels = m_reader->get_num_channels();
        m_rate = m_reader->get_file_rate();
        m_nframes = m_reader->get_nframes();
        m_length = m_reader->get_length();
 
        m_outputRate = m_rate;
+       }
        
+       m_isResampleAvailable = false;
        m_overflowBuffers = 0;
        m_overflowUsed = 0;
-       
-       init(converter_type);
 }
 
 
 ResampleAudioReader::~ResampleAudioReader()
 {
-       if (!m_reader) {
-               return;
-       }
-       
+       if (m_reader) {
        delete m_reader;
+       }
        
        while (m_srcStates.size()) {
                src_delete(m_srcStates.back());
@@ -90,33 +87,6 @@
        }
 }
 
-
-void ResampleAudioReader::init(int converter_type)
-{
-       int error;
-       
-       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;
-               }
-               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();
-       seek_private(0);
-}
-
-
 // Clear the samplerateconverter to a clean state (used on seek)
 void ResampleAudioReader::reset()
 {
@@ -133,12 +103,41 @@
        m_readExtraFrames = OVERFLOW_SIZE;
 }
 
+void ResampleAudioReader::set_converter_type(int converter_type)
+{
+       int error;
+       
+       while (m_srcStates.size()) {
+               src_delete(m_srcStates.back());
+               m_srcStates.pop_back();
+       }
+       
+       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");
+                       m_isResampleAvailable = false;
+               } else {
+                       m_isResampleAvailable = true;
+                       clear_buffers();
+               }
+       }
+       
+       // seek_private will reset the src states!
+       seek_private(0);
+}
 
 int ResampleAudioReader::get_output_rate()
 {
        return m_outputRate;
 }
 
+int ResampleAudioReader::get_file_rate()
+{
+       m_reader->get_file_rate();
+}
 
 void ResampleAudioReader::set_output_rate(int rate)
 {
@@ -157,7 +156,7 @@
 {
        Q_ASSERT(m_reader);
        
-       if (m_outputRate == m_rate) {
+       if (m_outputRate == m_rate || !m_isResampleAvailable) {
                return m_reader->seek(start);
        }
        
@@ -174,7 +173,7 @@
        Q_ASSERT(m_reader);
        
        // pass through if not changing sampleRate.
-       if (m_outputRate == m_rate) {
+       if (m_outputRate == m_rate || !m_isResampleAvailable) {
                return m_reader->read(buffer, frameCount);
        } else if (!m_overflowBuffers) {
                create_overflow_buffers();

Index: audiofileio/decode/ResampleAudioReader.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- audiofileio/decode/ResampleAudioReader.h    20 Sep 2007 16:04:27 -0000      
1.8
+++ audiofileio/decode/ResampleAudioReader.h    27 Sep 2007 19:20:29 -0000      
1.9
@@ -31,17 +31,18 @@
 {
 
 public:
-       ResampleAudioReader(QString filename, int converter_type, const 
QString& decoder);
+       ResampleAudioReader(QString filename, const QString& decoder);
        ~ResampleAudioReader();
        
        QString decoder_type() const {return (m_reader) ? 
m_reader->decoder_type() : "";}
        void clear_buffers();
        
        int get_output_rate();
+       int get_file_rate();
        void set_output_rate(int rate);
+       void set_converter_type(int converter_type);
        
 protected:
-       void init(int converter_type);
        void reset();
        
        bool seek_private(nframes_t start);
@@ -56,6 +57,7 @@
        audio_sample_t**        m_overflowBuffers;
        long                    m_overflowUsed;
        int                     m_outputRate;
+       bool                    m_isResampleAvailable;
        nframes_t               m_readExtraFrames;
        
 private:

Index: core/ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -b -r1.62 -r1.63
--- core/ReadSource.cpp 24 Sep 2007 00:57:50 -0000      1.62
+++ core/ReadSource.cpp 27 Sep 2007 19:20:29 -0000      1.63
@@ -20,10 +20,8 @@
 */
 
 #include "ReadSource.h"
-#include "AbstractAudioReader.h"
 #include "ResampleAudioReader.h"
 
-#include "Peak.h"
 #include "ProjectManager.h"
 #include "Project.h"
 #include "AudioClip.h"
@@ -222,20 +220,19 @@
        if (useResampling) {
                int converter_type;
                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 = new ResampleAudioReader(m_fileName, 
converter_type, m_decodertype);
+               m_audioReader = new ResampleAudioReader(m_fileName, 
m_decodertype);
+               
                if (m_audioReader->is_valid()) {
                        set_output_rate(audiodevice().get_sample_rate());
-               }
-               else {
+                       m_audioReader->set_converter_type(converter_type);
+               } else {
                        delete m_audioReader;
                        m_audioReader = 0;
                }
        }
-       else {
-               m_audioReader = 
AbstractAudioReader::create_audio_reader(m_fileName, m_decodertype);
-       }
        
        if (m_audioReader == 0) {
                return COULD_NOT_OPEN_FILE;
@@ -243,22 +240,24 @@
        
        // (re)set the decoder type
        m_decodertype = m_audioReader->decoder_type();
+       m_channelCount = m_audioReader->get_num_channels();
        
-       if (m_audioReader->get_num_channels() > 2) {
-               PERROR("ReadAudioSource: file contains %d channels; only 2 
channels are supported", m_audioReader->get_num_channels());
+       // @Ben: I thought we support any channel count now ??
+       if (m_channelCount > 2) {
+               PERROR("ReadAudioSource: file contains %d channels; only 2 
channels are supported", m_channelCount);
                delete m_audioReader;
                m_audioReader = 0;
                return INVALID_CHANNEL_COUNT;
        }
 
-       if (m_audioReader->get_num_channels() == 0) {
-               PERROR("ReadAudioSource: not a valid channel count: %d", 
m_audioReader->get_num_channels());
+       // Never reached, it's allready checked in 
AbstractAudioReader::is_valid() which was allready called!
+       if (m_channelCount == 0) {
+               PERROR("ReadAudioSource: not a valid channel count: %d", 
m_channelCount);
                delete m_audioReader;
                m_audioReader = 0;
                return ZERO_CHANNELS;
        }
        
-       m_channelCount = m_audioReader->get_num_channels();
        m_rate = m_audioReader->get_file_rate();
        m_length = m_audioReader->get_length();
        
@@ -269,43 +268,23 @@
 void ReadSource::set_output_rate(int rate)
 {
        Q_ASSERT(rate > 0);
-       ResampleAudioReader* reader = 
dynamic_cast<ResampleAudioReader*>(m_audioReader);
-       if (reader) {
-               reader->set_output_rate(rate);
+       
+       m_audioReader->set_output_rate(rate);
+       
                // The length could have become slightly smaller/larger due
                // rounding issues involved with converting to one samplerate 
to another.
                // Should be at the order of one sample at most, but for 
reading purposes we 
                // need sample accurate information!
-               m_length = reader->get_length();
-       }
+       m_length = m_audioReader->get_length();
 }
 
 
 int ReadSource::file_read(DecodeBuffer* buffer, TimeRef& start, nframes_t cnt) 
const
 {
-#if defined (profile)
-       trav_time_t starttime = get_microseconds();
-#endif
-       
-       int rate = audiodevice().get_sample_rate();
-       
-       // Oh boy, the rate we have to use is the output rate of the resampled 
reader
-       // in case the audioreader is a ResampleAudioReader. Somehow Remon 
thinks it's
-       // better to use TimeRef based read_from() ....
-       ResampleAudioReader* reader = 
dynamic_cast<ResampleAudioReader*>(m_audioReader);
-       if (reader) {
-               rate = reader->get_output_rate();
-       }
-       
+//     PROFILE_START;
+       int rate = m_audioReader->get_output_rate();
        nframes_t result = m_audioReader->read_from(buffer, 
start.to_frame(rate), 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
-       
+//     PROFILE_END("ReadSource::fileread");
        return result;
 }
 
@@ -624,14 +603,19 @@
 
 int ReadSource::file_read(DecodeBuffer * buffer, nframes_t start, nframes_t 
cnt)
 {
-       TimeRef startlocation(start, get_rate());
+       TimeRef startlocation(start, m_audioReader->get_output_rate());
        return file_read(buffer, startlocation, cnt);
 }
 
 
 int ReadSource::get_file_rate() const
 {
-       Q_ASSERT(m_audioReader);
+       if (m_audioReader) {
        return m_audioReader->get_file_rate();
+       } else {
+               PERROR("ReadSource::get_file_rate(), but no audioreader 
available!!");
+       }
+       
+       return pm().get_project()->get_rate(); 
 }
 

Index: core/ReadSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.h,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -b -r1.36 -r1.37
--- core/ReadSource.h   17 Sep 2007 13:40:34 -0000      1.36
+++ core/ReadSource.h   27 Sep 2007 19:20:29 -0000      1.37
@@ -27,7 +27,7 @@
 #include <QDomDocument>
 
 
-class AbstractAudioReader;
+class ResampleAudioReader;
 class AudioClip;
 struct BufferStatus;
 class DecodeBuffer;
@@ -79,7 +79,7 @@
        void set_output_rate(int rate);
        
 private:
-       AbstractAudioReader*    m_audioReader;
+       ResampleAudioReader*    m_audioReader;
        AudioClip*              m_clip;
        int                     m_refcount;
        int                     m_error;

Index: engine/defines.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/defines.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- engine/defines.h    26 Sep 2007 21:19:39 -0000      1.23
+++ engine/defines.h    27 Sep 2007 19:20:30 -0000      1.24
@@ -375,6 +375,9 @@
 #endif // endif RELAYTOOL_PRESENT
 
 
+#define PROFILE_START trav_time_t starttime = get_microseconds();
+#define PROFILE_END(args...) int processtime = (int) (get_microseconds() - 
starttime);printf("Process time for %s: %d useconds\n\n", args, processtime);
+
 #endif // endif TRAVERSO_TYPES_H
 
 //eof




reply via email to

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