[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso/src/audiofileio/decode AbstractAudioRe...,
Ben Levitt <=