traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...


From: Ben Levitt
Subject: [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...
Date: Sun, 15 Jul 2007 05:14:48 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Ben Levitt <benjie>     07/07/15 05:14:48

Modified files:
        src/core       : AbstractAudioReader.cpp AbstractAudioReader.h 
                         FlacAudioReader.cpp MadAudioReader.cpp 
                         ResampleAudioReader.cpp ResampleAudioReader.h 
                         VorbisAudioReader.cpp 

Log message:
         - Flac seems to be solid now (yay!)
         - A few other little fixes...
         - The only crash I still see is that, when dynamic resampling is 
enabled, the mp3 
           decoder crashes instantly  (booo)

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.4&r2=1.5

Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- AbstractAudioReader.cpp     13 Jul 2007 07:41:02 -0000      1.5
+++ AbstractAudioReader.cpp     15 Jul 2007 05:14:47 -0000      1.6
@@ -97,11 +97,11 @@
 
 // Static method used by other classes to get an automatically resampling 
AudioReader that wraps
 // an AudioReader chosen by create_audio_reader().
-AbstractAudioReader* 
AbstractAudioReader::create_resampled_audio_reader(QString filename)
+AbstractAudioReader* 
AbstractAudioReader::create_resampled_audio_reader(QString filename, int 
converter_type)
 {
        ResampleAudioReader* newReader;
 
-       newReader = new ResampleAudioReader(filename);
+       newReader = new ResampleAudioReader(filename, converter_type);
 
        if (newReader->get_rate() > 0) {
                return newReader;

Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- AbstractAudioReader.h       13 Jul 2007 07:41:02 -0000      1.5
+++ AbstractAudioReader.h       15 Jul 2007 05:14:47 -0000      1.6
@@ -44,7 +44,7 @@
        virtual int read(audio_sample_t* dst, int sampleCount) = 0;
        
        static AbstractAudioReader* create_audio_reader(QString filename);
-       static AbstractAudioReader* create_resampled_audio_reader(QString 
filename);
+       static AbstractAudioReader* create_resampled_audio_reader(QString 
filename, int converter_type);
        static bool can_decode(QString filename) { return false; };
 
 protected:

Index: FlacAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- FlacAudioReader.cpp 13 Jul 2007 07:41:02 -0000      1.1
+++ FlacAudioReader.cpp 15 Jul 2007 05:14:47 -0000      1.2
@@ -135,13 +135,18 @@
        unsigned i, c, pos = 0;
        unsigned frames = frame->header.blocksize;
        
-       internalBuffer->resize(frames * frame->header.channels);
+       if (internalBuffer->size() > 0) {
+               // This shouldn't be happening, but if it does, the code can 
handle it now. :)
+               PERROR("internalBuffer is already non-empty");
+       }
+       
+       internalBuffer->resize(internalBuffer->size() + frames * 
frame->header.channels);
        
        for (i=0; i < frames; i++) {
                // in FLAC channel 0 is left, 1 is right
                for (c=0; c < frame->header.channels; c++) {
                        audio_sample_t value = 
(audio_sample_t)((float)buffer[c][i] / 
(float)((uint)1<<(frame->header.bits_per_sample)));
-                       internalBuffer->data()[++pos] = value;
+                       internalBuffer->data()[bufferStart + (++pos)] = value;
                }
        }
        
@@ -358,6 +363,8 @@
        m_flac->internalBuffer->resize(0);
        m_flac->bufferStart = 0;
        
+       m_flac->flush();
+       
        if (!m_flac->seek(start)) {
                PERROR("FlacAudioReader: could not seek to frame %d within %s", 
start, QS_C(m_fileName));
                return false;
@@ -383,36 +390,42 @@
 #ifdef LEGACY_FLAC
                        if (m_flac->get_state() == 
FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) {
                                //printf("flac file finish\n");
-                               m_flac->finish();
-                               m_flac->init();
+                               m_flac->reset();
                                break;
                        }
                        else if(m_flac->get_state() == 
FLAC__SEEKABLE_STREAM_DECODER_OK) {
                                //printf("process1\n");
                                if (!m_flac->process_single()) {
                                        PERROR("process_single() error\n");
+                                       m_flac->reset();
+                                       seek(m_nextFrame);
                                        return -1;
                                }
                        }
                        else {
                                PERROR("flac_state() = %d\n", 
m_flac->get_state());
+                               m_flac->reset();
+                               seek(m_nextFrame);
                                return -1;
                        }
 #else
                        if (m_flac->get_state() == 
FLAC__STREAM_DECODER_END_OF_STREAM) {
                                //printf("flac file finish\n");
-                               m_flac->finish();
-                               m_flac->init();
+                               m_flac->reset();
                                break;
                        }
                        else if(m_flac->get_state() < 
FLAC__STREAM_DECODER_END_OF_STREAM) {
                                if (!m_flac->process_single()) {
                                        PERROR("process_single() error\n");
+                                       m_flac->reset();
+                                       seek(m_nextFrame);
                                        return -1;
                                }
                        }
                        else {
                                PERROR("flac_state() = %d\n", 
m_flac->get_state());
+                               m_flac->reset();
+                               seek(m_nextFrame);
                                return -1;
                        }
 #endif
@@ -437,14 +450,18 @@
        }
        
        // Pad end of file with 0s if necessary.  (Shouldn't be necessary...)
-       /*int remainingSamplesRequested = sampleCount - samplesCoppied;
+       int remainingSamplesRequested = sampleCount - samplesCoppied;
        int remainingSamplesInFile = get_length() * get_num_channels() - 
(m_nextFrame * get_num_channels() + samplesCoppied);
        if (samplesCoppied == 0 && remainingSamplesInFile > 0) {
                int padLength = (remainingSamplesRequested > 
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
-               printf("padLength: %d\n", padLength);
-               memset(dst + sampleCount - padLength, 0, padLength * 
sizeof(audio_sample_t));
-               samplesCoppied += remainingSamplesInFile;
-       }*/
+               //PERROR("padLength: %d", padLength);
+               memset(dst + samplesCoppied, 0, padLength * 
sizeof(audio_sample_t));
+               samplesCoppied += padLength;
+       }
+       if (samplesCoppied > sampleCount) {
+               //PERROR("Truncating");
+               samplesCoppied = sampleCount;
+       }
        
        m_nextFrame += samplesCoppied / get_num_channels();
        

Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- MadAudioReader.cpp  13 Jul 2007 07:41:02 -0000      1.3
+++ MadAudioReader.cpp  15 Jul 2007 05:14:47 -0000      1.4
@@ -745,7 +745,7 @@
                        d->vbr = true;
                }
                //
-               // position in stream: postion in file minus the not yet used 
buffer
+               // position in stream: position in file minus the not yet used 
buffer
                //
                unsigned long long seekPos = d->handle->inputPos() - 
                (d->handle->madStream->bufend - 
d->handle->madStream->this_frame + 1);
@@ -801,7 +801,7 @@
                // one mad_frame represents a mp3-frame which is always 1152 
samples
                // for us that means we need 1152 samples per channel of output 
buffer
                // for every frame
-               if (d->outputBufferEnd - d->outputPointer == 0) {
+               if (d->outputPointer >= d->outputBufferEnd) {
                        bOutputBufferFull = true;
                }
                else if (d->handle->decodeNextFrame()) {
@@ -821,27 +821,28 @@
                }
        }
        
-       nframes_t samplesWritten = d->outputPointer - d->outputBuffer;
+       int samplesWritten = d->outputPointer - d->outputBuffer;
        
        // Pad end with zeros if necessary
        // FIXME: This shouldn't be necessary!  :P
        // is get_length() reporting incorrectly?
        // are we not outputting the last mp3-frame for some reason?
        int remainingSamplesRequested = sampleCount - samplesWritten;
-       int remainingSamplesInFile = get_length() * get_num_channels() - 
(m_nextFrame * get_num_channels() + samplesWritten);
+       int remainingSamplesInFile = (get_length() - m_nextFrame) * 
get_num_channels();
        if (remainingSamplesRequested > 0 && remainingSamplesInFile > 0) {
                int padLength = (remainingSamplesRequested > 
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
                memset(d->outputPointer, 0, padLength * sizeof(audio_sample_t));
                samplesWritten += padLength;
-               //printf("remainingSamplesRequested: %d, 
remainingSamplesInFile: %d (using: %d)\n", remainingSamplesRequested, 
remainingSamplesInFile, padLength);
+               PERROR("padding: %d", padLength);
        }
 
        // Truncate so we don't return too many samples
        else if (samplesWritten > remainingSamplesInFile) {
+               PERROR("truncating by %d!", (samplesWritten - 
remainingSamplesInFile)/get_num_channels());
                samplesWritten = remainingSamplesInFile;
        }
        
-       //if (samplesWritten) printf("at: %lu (total: %lu), request: %d 
(returned: %d)\n", m_nextFrame, m_frames, sampleCount/get_num_channels(), 
samplesWritten/get_num_channels());
+       //printf("at: %lu (total: %lu), request: %d (returned: %d)\n", 
m_nextFrame, m_frames, sampleCount/get_num_channels(), 
samplesWritten/get_num_channels());
        
        m_nextFrame += samplesWritten / get_num_channels();
        return samplesWritten;
@@ -850,11 +851,12 @@
 
 bool MadAudioReader::createPcmSamples(mad_synth* synth)
 {
-       unsigned short nsamples = synth->pcm.length;
+       unsigned short nframes = synth->pcm.length;
        bool overflow = false;
+       int i;
        
        // now create the output
-       for (int i = 0; i < nsamples; i++) {
+       for (i = 0; i < nframes; i++) {
                if (overflow == false && d->outputPointer > d->outputBufferEnd) 
{
                        d->outputPointer = d->overflowBuffer;
                        overflow = true;
@@ -875,7 +877,10 @@
                d->overflowSize = d->outputPointer - d->overflowBuffer;
                d->overflowStart = 0;
                d->outputPointer = d->outputBufferEnd;
-               //printf("overflowing %lu samples\n", d->overflowSize);
+               //printf("written: %d (overflow: %u)\n",  nframes * 
synth->pcm.channels - d->overflowSize, d->overflowSize);
+       }
+       else {
+               //printf("written: %d\n",  i * synth->pcm.channels);
        }
        
        return true;

Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- ResampleAudioReader.cpp     14 Jul 2007 02:40:06 -0000      1.5
+++ ResampleAudioReader.cpp     15 Jul 2007 05:14:47 -0000      1.6
@@ -30,7 +30,7 @@
 
 
 // On init, creates a child AudioReader for any filetype, and a samplerate 
converter
-ResampleAudioReader::ResampleAudioReader(QString filename)
+ResampleAudioReader::ResampleAudioReader(QString filename, int converter_type)
  : AbstractAudioReader(filename)
 {
        m_fileBuffer = 0;
@@ -42,23 +42,18 @@
                return;
        }
        
-       int error;
-       m_srcState = src_new (SRC_SINC_MEDIUM_QUALITY, 
m_realReader->get_num_channels(), &error);
-       if (!m_srcState) {
-               PERROR("ResampleAudioReader: couldn't create libSampleRate 
SRC_STATE");
-               delete m_realReader;
-               m_realReader = 0;
-       }
-       
-       reset();
-       seek(0);
+       m_srcState = 0;
+       init(converter_type);
 }
 
 
 ResampleAudioReader::~ResampleAudioReader()
 {
-       if (m_realReader) {
+       if (m_srcState) {
                src_delete(m_srcState);
+       }
+       
+       if (m_realReader) {
                delete m_realReader;
        }
 
@@ -68,6 +63,25 @@
 }
 
 
+void ResampleAudioReader::init(int converter_type)
+{
+       if (m_srcState) {
+               src_delete(m_srcState);
+       }
+       
+       int error;
+       m_srcState = src_new (converter_type, m_realReader->get_num_channels(), 
&error);
+       if (!m_srcState) {
+               PERROR("ResampleAudioReader: couldn't create libSampleRate 
SRC_STATE");
+               delete m_realReader;
+               m_realReader = 0;
+       }
+       
+       reset();
+       seek(0);
+}
+
+
 // Clear the samplerateconverter to a clean state (used on seek)
 void ResampleAudioReader::reset()
 {
@@ -179,7 +193,7 @@
        
        // Pad end of file with 0s if necessary
        int remainingSamplesRequested = sampleCount - samplesRead;
-       int remainingSamplesInFile = get_length() * get_num_channels() - 
m_nextFrame * get_num_channels() - samplesRead;
+       int remainingSamplesInFile = (get_length() - m_nextFrame - 
m_srcData.output_frames_gen) * get_num_channels();
        
        if (samplesRead == 0 && remainingSamplesRequested > 0 && 
remainingSamplesInFile > 0) {
                int padLength = (remainingSamplesRequested > 
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;

Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- ResampleAudioReader.h       13 Jul 2007 07:41:03 -0000      1.4
+++ ResampleAudioReader.h       15 Jul 2007 05:14:48 -0000      1.5
@@ -29,7 +29,7 @@
 class ResampleAudioReader : public AbstractAudioReader
 {
 public:
-       ResampleAudioReader(QString filename);
+       ResampleAudioReader(QString filename, int converter_type);
        ~ResampleAudioReader();
 
        int get_num_channels();
@@ -42,6 +42,7 @@
        static bool can_decode(QString filename) {return false;}
 
 protected:
+       void init(int converter_type);
        void reset();
        
        nframes_t song_to_file_frame(nframes_t frame);

Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- VorbisAudioReader.cpp       13 Jul 2007 07:41:03 -0000      1.4
+++ VorbisAudioReader.cpp       15 Jul 2007 05:14:48 -0000      1.5
@@ -141,8 +141,8 @@
                int samplesRead = ov_read_float(&m_vf, &tmp, (sampleCount - 
totalRead) / get_num_channels(), &bs);
                
                if (samplesRead == OV_HOLE) {
+                       // Hole detected: recursive retry
                        PERROR("VorbisAudioReader: OV_HOLE");
-                       // recursive new try
                        return read(dst, sampleCount);
                }
                else if (samplesRead == 0) {
@@ -150,6 +150,7 @@
                        break;
                } else if (samplesRead < 0) {
                        /* error in the stream. */
+                       PERROR("VorbisFile decoding error");
                        break;
                }
                




reply via email to

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