traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src/audiofileio/decode AbstractAudioRe...


From: Ben Levitt
Subject: [Traverso-commit] traverso/src/audiofileio/decode AbstractAudioRe...
Date: Fri, 17 Aug 2007 00:13:27 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Ben Levitt <benjie>     07/08/17 00:13:27

Modified files:
        src/audiofileio/decode: AbstractAudioReader.cpp 
                                AbstractAudioReader.h 
                                FlacAudioReader.cpp FlacAudioReader.h 
                                MadAudioReader.cpp MadAudioReader.h 
                                ResampleAudioReader.cpp 
                                ResampleAudioReader.h SFAudioReader.h 

Log message:
        - Fix crash on startup with clips for deleted audio files.  (But the 
        clip doesn't know that its audio file is missing, so it still crashes 
        later.  :(  Remon, where does the clip determine whether its file is 
        missing?)
        - Add XxxAudioReader::clear_buffers().  Remon, this should be called 
for 
        a clip whenever it is no longer being played.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.h?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/FlacAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/FlacAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/MadAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/MadAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.h?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/SFAudioReader.h?cvsroot=traverso&r1=1.4&r2=1.5

Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- AbstractAudioReader.cpp     16 Aug 2007 14:26:49 -0000      1.3
+++ AbstractAudioReader.cpp     17 Aug 2007 00:13:26 -0000      1.4
@@ -135,9 +135,14 @@
                } else if (decoder == "mad") {
                        newReader = new MadAudioReader(filename);
                }
+               if (newReader && !newReader->is_valid()) {
+                       PERROR("new %s reader is invalid! (channels: %d, 
frames: %d)", (const char *)(newReader->decoder_type().toUtf8()), 
newReader->get_num_channels(), newReader->get_length());
+                       delete newReader;
+                       newReader = 0;
+               }
        }
        
-       if ( (!newReader) || (!newReader->is_valid()) ) {
+       if (!newReader) {
        
                if (FlacAudioReader::can_decode(filename)) {
                        newReader = new FlacAudioReader(filename);
@@ -154,14 +159,12 @@
                else if (MadAudioReader::can_decode(filename)) {
                        newReader = new MadAudioReader(filename);
                }
-               else {
-                       return 0;
-               }
        }
        
-       if (!newReader->is_valid()) {
-               PERROR("new reader is invalid! (channels: %d, frames: %d", 
newReader->get_num_channels(), newReader->get_length());
-               return 0;
+       if (newReader && !newReader->is_valid()) {
+               PERROR("new %s reader is invalid! (channels: %d, frames: %d)", 
(const char *)(newReader->decoder_type().toUtf8()), 
newReader->get_num_channels(), newReader->get_length());
+               delete newReader;
+               newReader = 0;
        }
 
        return newReader;

Index: AbstractAudioReader.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- AbstractAudioReader.h       16 Aug 2007 14:26:49 -0000      1.5
+++ AbstractAudioReader.h       17 Aug 2007 00:13:26 -0000      1.6
@@ -118,6 +118,7 @@
        
        bool is_valid() {return (m_channels > 0 && m_length > 0);}
        virtual QString decoder_type() const = 0;
+       virtual void clear_buffers() {}
        
        static AbstractAudioReader* create_audio_reader(const QString& 
filename, const QString& decoder = 0);
        

Index: FlacAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/FlacAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- FlacAudioReader.cpp 16 Aug 2007 14:26:49 -0000      1.5
+++ FlacAudioReader.cpp 17 Aug 2007 00:13:26 -0000      1.6
@@ -125,9 +125,7 @@
                
                void cleanup()
                {
-                       if (internalBuffer) {
-                               delete [] internalBuffer;
-                       }
+                       clear_buffers();
                        file->close();
                        delete file;
                        
@@ -141,6 +139,14 @@
                }
                
                
+               void clear_buffers()
+               {
+                       if (internalBuffer) {
+                               delete [] internalBuffer;
+                               internalBuffer = 0;
+                       }
+               }
+               
                bool seek(nframes_t start)
                {
 #ifdef LEGACY_FLAC
@@ -398,6 +404,14 @@
 }
 
 
+void FlacAudioReader::clear_buffers()
+{
+       if (m_flac) {
+               m_flac->clear_buffers();
+       }
+}
+
+
 bool FlacAudioReader::can_decode(QString filename)
 {
        if (!libFLAC_is_present) {

Index: FlacAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/FlacAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- FlacAudioReader.h   16 Aug 2007 14:26:49 -0000      1.3
+++ FlacAudioReader.h   17 Aug 2007 00:13:26 -0000      1.4
@@ -34,6 +34,7 @@
        ~FlacAudioReader();
        
        QString decoder_type() const {return "flac";}
+       void clear_buffers();
 
        static bool can_decode(QString filename);
        

Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/MadAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- MadAudioReader.cpp  14 Aug 2007 10:49:53 -0000      1.4
+++ MadAudioReader.cpp  17 Aug 2007 00:13:26 -0000      1.5
@@ -88,6 +88,9 @@
        bool findNextHeader();
        bool checkFrameHeader(mad_header* header) const;
        
+       void createInputBuffer();
+       void clearInputBuffer();
+       
        mad_stream*   madStream;
        mad_frame*    madFrame;
        mad_synth*    madSynth;
@@ -113,11 +116,7 @@
        madSynth  = new mad_synth;
        madTimer  = new mad_timer_t;
        
-       //
-       // we allocate additional MAD_BUFFER_GUARD bytes to always be able to 
append the
-       // zero bytes needed for decoding the last frame.
-       //
-       m_inputBuffer = new unsigned char[INPUT_BUFFER_SIZE+MAD_BUFFER_GUARD];
+       m_inputBuffer = 0;
 }
 
 
@@ -130,7 +129,29 @@
        delete madSynth;
        delete madTimer;
        
+       clearInputBuffer();
+}
+
+
+void K3bMad::createInputBuffer()
+{
+       if (!m_inputBuffer) {
+               //
+               // we allocate additional MAD_BUFFER_GUARD bytes to always be 
able to append the
+               // zero bytes needed for decoding the last frame.
+               //
+               m_inputBuffer = new unsigned 
char[INPUT_BUFFER_SIZE+MAD_BUFFER_GUARD];
+               memset(m_inputBuffer, 0, INPUT_BUFFER_SIZE+MAD_BUFFER_GUARD);
+       }
+}
+
+
+void K3bMad::clearInputBuffer()
+{
+       if (m_inputBuffer) {
        delete [] m_inputBuffer;
+               m_inputBuffer = 0;
+       }
 }
 
 
@@ -150,8 +171,6 @@
        
        initMad();
        
-       memset(m_inputBuffer, 0, INPUT_BUFFER_SIZE+MAD_BUFFER_GUARD);
-       
        return true;
 }
 
@@ -172,6 +191,10 @@
                        return false;
                }
                
+               if (!m_inputBuffer) {
+                       createInputBuffer();
+               }
+               
                long readSize, remaining;
                unsigned char* readStart;
                
@@ -468,7 +491,7 @@
        nframes_t       outputPos;
        nframes_t       outputSize;
        
-       QVector<audio_sample_t*> overflowBuffers;
+       audio_sample_t** overflowBuffers;
        nframes_t       overflowSize;
        nframes_t       overflowStart;
        
@@ -507,11 +530,10 @@
        
        m_rate = d->firstHeader.samplerate;
        
-       for (int c = 0; c < m_channels; c++) {
-               d->overflowBuffers.append(new audio_sample_t[1152]);
-       }
+       d->overflowBuffers = 0;
        
        seek_private(0);
+       clear_buffers();
 }
 
 
@@ -520,15 +542,41 @@
        if (d) {
                d->handle->cleanup();
                delete d->handle;
-               while (d->overflowBuffers.size()) {
-                       delete d->overflowBuffers.back();
-                       d->overflowBuffers.pop_back();
-               }
+               clear_buffers();
                delete d;
        }
 }
 
 
+void MadAudioReader::create_buffers()
+{
+       if (!d->overflowBuffers) {
+               d->overflowBuffers = new audio_sample_t*[m_channels];
+               for (int chan = 0; chan < m_channels; chan++) {
+                       d->overflowBuffers[chan] = new audio_sample_t[1152];
+               }
+       }
+}
+       
+
+void MadAudioReader::clear_buffers()
+{
+       if (d->overflowBuffers) {
+               for (int chan = 0; chan < m_channels; chan++) {
+                       delete [] d->overflowBuffers[chan];
+               }
+               delete [] d->overflowBuffers;
+               d->overflowBuffers = 0;
+               d->overflowStart = 0;
+               d->overflowSize = 0;
+       }
+       
+       if (d && d->handle) {
+               d->handle->clearInputBuffer();
+       }
+}
+
+
 bool MadAudioReader::can_decode(QString filename)
 {
        if (!libmad_is_present) {
@@ -769,8 +817,8 @@
        if (d->overflowSize > 0) {
                if (d->overflowSize < frameCount) {
                        //printf("output all %d overflow samples\n", 
d->overflowSize);
-                       for (int c = 0; c < m_channels; c++) {
-                               memcpy(d->outputBuffers[c], 
d->overflowBuffers[c] + d->overflowStart, d->overflowSize * 
sizeof(audio_sample_t));
+                       for (int chan = 0; chan < m_channels; chan++) {
+                               memcpy(d->outputBuffers[chan], 
d->overflowBuffers[chan] + d->overflowStart, d->overflowSize * 
sizeof(audio_sample_t));
                        }
                        d->outputPos += d->overflowSize;
                        d->overflowSize = 0;
@@ -778,8 +826,8 @@
                }
                else {
                        //printf("output %d overflow frames, returned from 
overflow\n", frameCount);
-                       for (int c = 0; c < m_channels; c++) {
-                               memcpy(d->outputBuffers[c], 
d->overflowBuffers[c] + d->overflowStart, frameCount * sizeof(audio_sample_t));
+                       for (int chan = 0; chan < m_channels; chan++) {
+                               memcpy(d->outputBuffers[chan], 
d->overflowBuffers[chan] + d->overflowStart, frameCount * 
sizeof(audio_sample_t));
                        }
                        d->overflowSize -= frameCount;
                        d->overflowStart += frameCount;
@@ -851,6 +899,10 @@
        bool            overflow = false;
        nframes_t       i;
        
+       if (!d->overflowBuffers) {
+               create_buffers();
+       }
+       
        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);
@@ -859,7 +911,7 @@
        // now create the output
        for (i = 0; i < nframes; i++) {
                if (overflow == false && d->outputPos + i >= d->outputSize) {
-                       writeBuffers = d->overflowBuffers.data();
+                       writeBuffers = d->overflowBuffers;
                        offset = 0 - i;
                        overflow = true;
                }

Index: MadAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/MadAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- MadAudioReader.h    16 Aug 2007 14:26:49 -0000      1.3
+++ MadAudioReader.h    17 Aug 2007 00:13:27 -0000      1.4
@@ -36,6 +36,7 @@
        ~MadAudioReader();
        
        QString decoder_type() const {return "mad";}
+       void clear_buffers();
        
        static bool can_decode(QString filename);
        
@@ -43,6 +44,7 @@
        bool seek_private(nframes_t start);
        nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount);
        
+       void create_buffers();
        bool initDecoderInternal();
        unsigned long countFrames();
        bool createPcmSamples(mad_synth* synth);

Index: ResampleAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- ResampleAudioReader.cpp     16 Aug 2007 14:26:49 -0000      1.6
+++ ResampleAudioReader.cpp     17 Aug 2007 00:13:27 -0000      1.7
@@ -53,20 +53,38 @@
 
 ResampleAudioReader::~ResampleAudioReader()
 {
+       if (!m_reader) {
+               return;
+       }
+       
+       delete m_reader;
+       
        while (m_srcStates.size()) {
                src_delete(m_srcStates.back());
                m_srcStates.pop_back();
        }
        
-       if (m_reader) {
-               delete m_reader;
+       if (m_overflowBuffers) {
+               for (int chan = 0; chan < m_channels; chan++) {
+                       delete [] m_overflowBuffers[chan];
+               }
+               delete [] m_overflowBuffers;
        }
+}
+
        
+void ResampleAudioReader::clear_buffers()
+{
        if (m_overflowBuffers) {
                for (int chan = 0; chan < m_channels; chan++) {
                        delete [] m_overflowBuffers[chan];
                }
                delete [] m_overflowBuffers;
+               m_overflowBuffers = 0;
+       }
+       
+       if (m_reader) {
+               m_reader->clear_buffers();
        }
 }
 

Index: ResampleAudioReader.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- ResampleAudioReader.h       16 Aug 2007 15:25:43 -0000      1.5
+++ ResampleAudioReader.h       17 Aug 2007 00:13:27 -0000      1.6
@@ -35,6 +35,7 @@
        ~ResampleAudioReader();
        
        QString decoder_type() const {return (m_reader) ? 
m_reader->decoder_type() : "";}
+       void clear_buffers();
        
        int get_output_rate();
        void set_output_rate(int rate);

Index: SFAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/SFAudioReader.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- SFAudioReader.h     16 Aug 2007 14:26:50 -0000      1.4
+++ SFAudioReader.h     17 Aug 2007 00:13:27 -0000      1.5
@@ -42,8 +42,6 @@
        
        SNDFILE*        m_sf;
        SF_INFO         m_sfinfo;
-       audio_sample_t  *m_tmpBuffer;
-       nframes_t       m_tmpBufferSize;
 };
 
 #endif




reply via email to

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