traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src/core AudioClip.cpp AudioSource.cpp...


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src/core AudioClip.cpp AudioSource.cpp...
Date: Mon, 04 Jun 2007 18:22:53 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/06/04 18:22:53

Modified files:
        src/core       : AudioClip.cpp AudioSource.cpp AudioSource.h 
                         DiskIO.cpp DiskIO.h MonoReader.cpp MonoReader.h 
                         Peak.cpp Project.cpp ReadSource.cpp 
                         ReadSource.h Song.h 

Log message:
        supply a 'readbuffer' to the file_read function of AudioSources.
        Large buffer are created on the heap, avoiding possible stack overflows.
        By passing them as an argument to the file_read function, there is only 
need
        for one buffer per diskio, reducing memory overhead.
        Hopefully fixes crashing problem on mac os x.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.cpp?cvsroot=traverso&r1=1.104&r2=1.105
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioSource.cpp?cvsroot=traverso&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioSource.h?cvsroot=traverso&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/DiskIO.cpp?cvsroot=traverso&r1=1.36&r2=1.37
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/DiskIO.h?cvsroot=traverso&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MonoReader.cpp?cvsroot=traverso&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MonoReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.28&r2=1.29
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Project.cpp?cvsroot=traverso&r1=1.47&r2=1.48
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.34&r2=1.35
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.h?cvsroot=traverso&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.h?cvsroot=traverso&r1=1.58&r2=1.59

Patches:
Index: AudioClip.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.cpp,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -b -r1.104 -r1.105
--- AudioClip.cpp       31 May 2007 05:22:31 -0000      1.104
+++ AudioClip.cpp       4 Jun 2007 18:22:52 -0000       1.105
@@ -431,7 +431,7 @@
        if (m_song->realtime_path()) {
                read_frames = m_readSource->rb_read(channel, mixdown, mix_pos, 
nframes);
        } else {
-               read_frames = m_readSource->file_read(channel, mixdown, 
mix_pos, nframes);
+               read_frames = m_readSource->file_read(channel, mixdown, 
mix_pos, nframes, m_song->readbuffer);
        }
 
        if (read_frames == 0) {

Index: AudioSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioSource.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- AudioSource.cpp     24 May 2007 18:48:48 -0000      1.21
+++ AudioSource.cpp     4 Jun 2007 18:22:52 -0000       1.22
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: AudioSource.cpp,v 1.21 2007/05/24 18:48:48 r_sijrier Exp $
+$Id: AudioSource.cpp,v 1.22 2007/06/04 18:22:52 r_sijrier Exp $
 */
 
 
@@ -174,4 +174,3 @@
 }
 
 // eof
-

Index: AudioSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioSource.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- AudioSource.h       24 May 2007 17:45:19 -0000      1.16
+++ AudioSource.h       4 Jun 2007 18:22:52 -0000       1.17
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: AudioSource.h,v 1.16 2007/05/24 17:45:19 r_sijrier Exp $
+$Id: AudioSource.h,v 1.17 2007/06/04 18:22:52 r_sijrier Exp $
 */
 
 #ifndef AUDIOSOURCE_H
@@ -40,6 +40,7 @@
        ~AudioSource();
        
        virtual void process_ringbuffer(audio_sample_t* framebuffer, bool 
seeking=false);
+       virtual void process_ringbuffer(audio_sample_t* framebuffer, 
audio_sample_t* readbuffer, bool seeking=false);
 
        void set_name(const QString& name);
        void set_dir(const QString& name);
@@ -79,7 +80,7 @@
 inline uint AudioSource::get_channel_count( ) const {return m_channelCount;}
 
 inline void AudioSource::process_ringbuffer(audio_sample_t*, bool) {}
-
+inline void AudioSource::process_ringbuffer(audio_sample_t* , audio_sample_t* 
, bool ) {}
 inline qint64 AudioSource::get_id( ) const {return m_id;}
 
 #endif

Index: DiskIO.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/DiskIO.cpp,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -b -r1.36 -r1.37
--- DiskIO.cpp  10 May 2007 20:02:36 -0000      1.36
+++ DiskIO.cpp  4 Jun 2007 18:22:52 -0000       1.37
@@ -151,6 +151,8 @@
        
        // TODO This is a LARGE buffer, any ideas how to make it smaller ??
        framebuffer = new audio_sample_t[audiodevice().get_sample_rate() * 
writebuffertime];
+       // We assume here that the audiofiles have max 2 channels, and 
readbuffer time is max 3 seconds.
+       m_readbuffer = new audio_sample_t[audiodevice().get_sample_rate() * 6];
 
        // Move this instance to the workthread
        moveToThread(m_diskThread);
@@ -167,6 +169,7 @@
        stop();
        delete cpuTimeBuffer;
        delete [] framebuffer;
+       delete [] m_readbuffer;
 }
 
 /**
@@ -222,7 +225,7 @@
                                return;
                        }
        
-                       source->process_ringbuffer(framebuffer, m_seeking);
+                       source->process_ringbuffer(framebuffer, m_readbuffer, 
m_seeking);
                }
                
                if (whilecount++ > 1000) {
@@ -302,7 +305,7 @@
                                
        
        if (syncSources.size() > 0) {
-               syncSources.at(0)->sync(framebuffer);
+               syncSources.at(0)->sync(framebuffer, m_readbuffer);
                return 1;
        }
        

Index: DiskIO.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/DiskIO.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- DiskIO.h    17 Apr 2007 19:56:46 -0000      1.15
+++ DiskIO.h    4 Jun 2007 18:22:52 -0000       1.16
@@ -88,6 +88,7 @@
        bool                    m_seeking;
        int                     m_hardDiskOverLoadCounter;
        audio_sample_t*         framebuffer;
+       audio_sample_t*         m_readbuffer;
 
        
        void update_time_usage();

Index: MonoReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MonoReader.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- MonoReader.cpp      23 May 2007 12:50:28 -0000      1.15
+++ MonoReader.cpp      4 Jun 2007 18:22:52 -0000       1.16
@@ -127,7 +127,7 @@
 }
 
 
-int MonoReader::file_read (audio_sample_t* dst, nframes_t start, nframes_t 
cnt) const
+int MonoReader::file_read (audio_sample_t* dst, nframes_t start, nframes_t 
cnt, audio_sample_t* readbuffer) const
 {
 //     PWARN("file_read");
        // this equals checking if init() is called!
@@ -160,10 +160,10 @@
        }
 
        float *ptr;
-       int real_cnt = cnt * m_sfinfo.channels;
+       uint real_cnt = cnt * m_sfinfo.channels;
 
-
-       audio_sample_t readbuffer[real_cnt];
+       // The readbuffer 'assumes' that there is max 2 channels...
+       Q_ASSERT(m_sfinfo.channels <= 2);
 
        int nread = sf_read_float (m_sf, readbuffer, real_cnt);
 #if defined (profile)
@@ -221,9 +221,9 @@
 }
 
 
-int MonoReader::rb_file_read( audio_sample_t * dst, nframes_t cnt )
+int MonoReader::rb_file_read(audio_sample_t* dst, nframes_t cnt, 
audio_sample_t* readbuffer )
 {
-       int readFrames = file_read( dst, m_rbFileReadPos, cnt);
+       int readFrames = file_read( dst, m_rbFileReadPos, cnt, readbuffer);
        m_rbFileReadPos += readFrames;
 
        return readFrames;
@@ -263,7 +263,7 @@
        m_rbRelativeFileReadPos = fileposition;
 }
 
-void MonoReader::process_ringbuffer( audio_sample_t * framebuffer, bool 
seeking)
+void MonoReader::process_ringbuffer( audio_sample_t * framebuffer, 
audio_sample_t* readbuffer, bool seeking)
 {
        // Do nothing if we passed the lenght of the AudioFile.
        if (m_rbFileReadPos >= m_length) {
@@ -309,7 +309,7 @@
        }
        
        // Read in the samples from source
-       nframes_t toWrite = rb_file_read(framebuffer, toRead);
+       nframes_t toWrite = rb_file_read(framebuffer, toRead, readbuffer);
 
        // and write it to the ringbuffer
        m_buffer->write(framebuffer, toWrite);
@@ -340,7 +340,7 @@
        m_syncInProgress = 0;
 }
 
-void MonoReader::sync(audio_sample_t* framebuffer)
+void MonoReader::sync(audio_sample_t* framebuffer, audio_sample_t* readbuffer)
 {
        PENTER;
        if (!m_needSync) {
@@ -355,7 +355,7 @@
        // Currently, we fill the buffer completely.
        // For some reason, filling it with 1/4 at a time
        // doesn't fill it consitently, and thus giving audible artifacts.
-       process_ringbuffer(framebuffer);
+       process_ringbuffer(framebuffer, readbuffer);
        
        if (m_buffer->write_space() == 0) {
                finish_resync();

Index: MonoReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/MonoReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- MonoReader.h        23 Mar 2007 13:09:33 -0000      1.1
+++ MonoReader.h        4 Jun 2007 18:22:52 -0000       1.2
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: MonoReader.h,v 1.1 2007/03/23 13:09:33 r_sijrier Exp $
+$Id: MonoReader.h,v 1.2 2007/06/04 18:22:52 r_sijrier Exp $
 */
 
 #ifndef PRIVATE_READSOURCE_H
@@ -39,18 +39,18 @@
 {
 public :
        int rb_read(audio_sample_t* dst, nframes_t start, nframes_t cnt);
-       int rb_file_read(audio_sample_t* dst, nframes_t cnt);
+       int rb_file_read(audio_sample_t* dst, nframes_t cnt, audio_sample_t* 
readbuffer);
        void rb_seek_to_file_position(nframes_t position);
 
-       void process_ringbuffer(audio_sample_t* framebuffer, bool 
seeking=false);
+       void process_ringbuffer(audio_sample_t* framebuffer, audio_sample_t* 
readbuffer, bool seeking=false);
        BufferStatus* get_buffer_status();
 
-       int file_read(audio_sample_t* dst, nframes_t start, nframes_t cnt) 
const;
+       int file_read(audio_sample_t* dst, nframes_t start, nframes_t cnt, 
audio_sample_t* readbuffer) const;
 
        int init();
        int ref();
        
-       void sync(audio_sample_t* framebuffer);
+       void sync(audio_sample_t* framebuffer, audio_sample_t* readbuffer);
        void set_audio_clip(AudioClip* clip);
        void prepare_buffer();
 

Index: Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- Peak.cpp    21 May 2007 08:49:46 -0000      1.28
+++ Peak.cpp    4 Jun 2007 18:22:52 -0000       1.29
@@ -295,8 +295,9 @@
                nframes_t readFrames, toRead;
                toRead = pixelcount * zoomStep[zoomLevel];
                audio_sample_t buf[toRead];
+               audio_sample_t readbuffer[toRead*2];
 
-               if ( (readFrames = m_source->file_read(m_channel, buf, 
startPos, toRead)) != toRead) {
+               if ( (readFrames = m_source->file_read(m_channel, buf, 
startPos, toRead, readbuffer)) != toRead) {
                        PWARN("Unable to read nframes %d (only %d available)", 
toRead, readFrames);
                        if (readFrames == 0) {
                                return NO_PEAKDATA_FOUND;
@@ -553,27 +554,24 @@
 {
        PENTER;
        
+       int ret = -1;
+       
        if (prepare_processing() < 0) {
-               return -1;
+               return ret;
        }
        
        nframes_t readFrames = 0;
        nframes_t totalReadFrames = 0;
 
-       #if defined (OSX_BUILD)
-               nframes_t bufferSize = 4096;
-       #else
                nframes_t bufferSize = 65536;
-       #endif
 
        int cycles = m_source->get_nframes() / bufferSize;
        int counter = 0;
        int p = 0;
-       audio_sample_t buf[bufferSize];
 
        if (m_source->get_nframes() == 0) {
                qWarning("Peak::create_from_scratch() : m_source (%s) has 
length 0", m_source->get_name().toAscii().data());
-               return -1;
+               return ret;
        }
 
        if (cycles == 0) {
@@ -581,16 +579,20 @@
                cycles = m_source->get_nframes() / bufferSize;
                if (cycles == 0) {
                        qDebug("source length is too short to display one pixel 
of the audio wave form in macro view");
-                       return -1;
+                       return ret;
                }
        }
 
+       audio_sample_t* buf = new audio_sample_t[bufferSize];
+       audio_sample_t* readbuffer = new audio_sample_t[bufferSize * 2];
+       
        do {
                if (interuptPeakBuild) {
-                       return -1;
+                       ret = -1;
+                       goto out;
                }
                
-               readFrames = m_source->file_read(m_channel, buf, 
totalReadFrames, bufferSize);
+               readFrames = m_source->file_read(m_channel, buf, 
totalReadFrames, bufferSize, readbuffer);
                process(buf, readFrames);
                totalReadFrames += readFrames;
                counter++;
@@ -605,10 +607,17 @@
 
 
        if (finish_processing() < 0) {
-               return -1;
+               ret = -1;
+               goto out;
        }
         
-       return 1;
+       ret = 1;
+       
+out:
+       delete [] buf;
+       delete [] readbuffer;
+        
+       return ret;
 }
 
 
@@ -626,7 +635,8 @@
                int toRead = (int) ((startpos * NORMALIZE_CHUNK_SIZE) - 
startframe);
                
                audio_sample_t buf[toRead];
-               int read = m_source->file_read(m_channel, buf, startframe, 
toRead);
+               audio_sample_t readbuffer[toRead*2];
+               int read = m_source->file_read(m_channel, buf, startframe, 
toRead, readbuffer);
                
                maxamp = Mixer::compute_peak(buf, read, maxamp);
        }
@@ -640,7 +650,8 @@
        int endpos = (int) f;
        int toRead = (int) ((f - (endframe / NORMALIZE_CHUNK_SIZE)) * 
NORMALIZE_CHUNK_SIZE);
        audio_sample_t buf[toRead];
-       int read = m_source->file_read(m_channel, buf, endframe - toRead, 
toRead);
+       audio_sample_t readbuffer[toRead*2];
+       int read = m_source->file_read(m_channel, buf, endframe - toRead, 
toRead, readbuffer);
        maxamp = Mixer::compute_peak(buf, read, maxamp);
        
        

Index: Project.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Project.cpp,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -b -r1.47 -r1.48
--- Project.cpp 3 Jun 2007 12:58:46 -0000       1.47
+++ Project.cpp 4 Jun 2007 18:22:52 -0000       1.48
@@ -503,6 +503,7 @@
        spec->blocksize = 32768;
 
        spec->dataF = new audio_sample_t[spec->blocksize * spec->channels];
+       audio_sample_t* readbuffer = new audio_sample_t[spec->blocksize * 
spec->channels];
 
        overallExportProgress = renderedSongs = 0;
        songsToRender.clear();
@@ -523,6 +524,7 @@
                emit exportStartedForSong(song);
                spec->resumeTransport = false;
                spec->resumeTransportFrame = song->get_transport_frame();
+               song->readbuffer = readbuffer;
                
                if (spec->normalize) {
                        spec->peakvalue = 0.0;
@@ -576,6 +578,7 @@
        overallExportProgress = 0;
        
        delete [] spec->dataF;
+       delete [] readbuffer;
        spec->dataF = 0;
 
        emit exportFinished();

Index: ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- ReadSource.cpp      30 May 2007 19:48:45 -0000      1.34
+++ ReadSource.cpp      4 Jun 2007 18:22:53 -0000       1.35
@@ -197,10 +197,10 @@
        return result;
 }
 
-int ReadSource::file_read (int channel, audio_sample_t* dst, nframes_t start, 
nframes_t cnt) const
+int ReadSource::file_read (int channel, audio_sample_t* dst, nframes_t start, 
nframes_t cnt, audio_sample_t* readbuffer) const
 {
        Q_ASSERT(channel < m_sources.size());
-       return m_sources.at(channel)->file_read(dst, start, cnt);
+       return m_sources.at(channel)->file_read(dst, start, cnt, readbuffer);
 }
 
 

Index: ReadSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- ReadSource.h        30 May 2007 13:14:46 -0000      1.25
+++ ReadSource.h        4 Jun 2007 18:22:53 -0000       1.26
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: ReadSource.h,v 1.25 2007/05/30 13:14:46 r_sijrier Exp $
+$Id: ReadSource.h,v 1.26 2007/06/04 18:22:53 r_sijrier Exp $
 */
 
 #ifndef READSOURCE_H
@@ -49,7 +49,7 @@
        ReadSource* deep_copy();
 
        int rb_read(int channel, audio_sample_t* dst, nframes_t start, 
nframes_t cnt);
-       int file_read(int channel, audio_sample_t* dst, nframes_t start, 
nframes_t cnt) const;
+       int file_read(int channel, audio_sample_t* dst, nframes_t start, 
nframes_t cnt, audio_sample_t* readbuffer) const;
 
        int init();
        int get_error() const {return m_error;}

Index: Song.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.h,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- Song.h      2 Jun 2007 23:02:33 -0000       1.58
+++ Song.h      4 Jun 2007 18:22:53 -0000       1.59
@@ -139,6 +139,7 @@
        QString get_cdrdao_tracklist(ExportSpecification* spec, bool pregap = 
false);
 
        audio_sample_t*         mixdown;
+       audio_sample_t*         readbuffer;
        audio_sample_t*         gainbuffer;
        
        unsigned long   threadId;




reply via email to

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