[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso/src/core AudioClip.cpp AudioSource.cpp...,
Remon Sijrier <=