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: Thu, 19 Jul 2007 04:05:58 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Ben Levitt <benjie>     07/07/19 04:05:58

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

Log message:
        - fix mp3 playing
        - move m_readPos updating on seek() into AbstractAudioReader::seek()  
(was only in 
        read_from() which meant that it never got updated on a direct seek() 
call.)
        - stop Peak::calculate_peaks() from crashing on a negative pixelcount 
(but why is it getting 
        negative pixelcounts?  hmmm...)

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/core.pro?cvsroot=traverso&r1=1.34&r2=1.35

Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- AbstractAudioReader.cpp     18 Jul 2007 18:15:20 -0000      1.9
+++ AbstractAudioReader.cpp     19 Jul 2007 04:05:57 -0000      1.10
@@ -22,7 +22,7 @@
 #include "AbstractAudioReader.h"
 #include "SFAudioReader.h"
 #include "FlacAudioReader.h"
-//#include "MadAudioReader.h"
+#include "MadAudioReader.h"
 #include "VorbisAudioReader.h"
 #include "ResampleAudioReader.h"
 
@@ -47,6 +47,13 @@
 }
 
 
+bool AbstractAudioReader::seek(nframes_t start)
+{
+       m_readPos = start;
+       return true;
+}
+
+
 // Read cnt frames starting at start from the AudioReader, into dst
 // uses seek() and read() from AudioReader subclass
 nframes_t AbstractAudioReader::read_from(audio_sample_t** buffer, nframes_t 
start, nframes_t count)
@@ -59,17 +66,19 @@
 //             printf("starting seek\n");
                if (!seek(start)) {
                        return 0;
-               } else {
-                       m_readPos = start;
                }
        }
        
-//     printf("read_from:: after_seek from %d, framepos is %d\n", start, 
m_readPos);
+       if (count) {
+       //      printf("read_from:: after_seek from %d, framepos is %d\n", 
start, m_readPos);
        nframes_t framesRead = read(buffer, count);
        
        m_readPos += framesRead;
        
        return framesRead;
+       }
+       
+       return 0;
 }
 
 
@@ -87,9 +96,9 @@
        else if (SFAudioReader::can_decode(filename)) {
                newReader = new SFAudioReader(filename);
        }
-//     else if (MadAudioReader::can_decode(filename)) {
-//             newReader = new MadAudioReader(filename);
-//     }
+       else if (MadAudioReader::can_decode(filename)) {
+               newReader = new MadAudioReader(filename);
+       }
        else {
                return 0;
        }

Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- AbstractAudioReader.h       18 Jul 2007 18:15:20 -0000      1.8
+++ AbstractAudioReader.h       19 Jul 2007 04:05:57 -0000      1.9
@@ -41,7 +41,7 @@
        virtual nframes_t get_length() = 0;
        virtual int get_rate() = 0;
        nframes_t read_from(audio_sample_t** buffer, nframes_t start, nframes_t 
count);
-       virtual bool seek(nframes_t start) = 0;
+       virtual bool seek(nframes_t start);
        virtual nframes_t read(audio_sample_t** buffer, nframes_t frameCount) = 
0;
        
        static AbstractAudioReader* create_audio_reader(const QString& 
filename);

Index: FlacAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- FlacAudioReader.cpp 18 Jul 2007 18:15:21 -0000      1.6
+++ FlacAudioReader.cpp 19 Jul 2007 04:05:57 -0000      1.7
@@ -384,6 +384,8 @@
                return false;
        }
        
+       AbstractAudioReader::seek(start);
+       
        return true;
 }
 

Index: FlacAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3

Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- MadAudioReader.cpp  18 Jul 2007 18:15:21 -0000      1.7
+++ MadAudioReader.cpp  19 Jul 2007 04:05:58 -0000      1.8
@@ -447,10 +447,13 @@
 {
 public:
        MadDecoderPrivate()
-       : outputBuffer(0),
-         outputPointer(0),
-         outputBufferEnd(0)
        {
+               outputBuffers = 0;
+               outputPos = 0;
+               outputSize = 0;
+               overflowSize = 0;
+               overflowStart = 0;
+               
                mad_header_init( &firstHeader );
        }
        
@@ -460,13 +463,13 @@
        
        bool bOutputFinished;
        
-       audio_sample_t* outputBuffer;
-       audio_sample_t* outputPointer;
-       audio_sample_t* outputBufferEnd;
-       
-       audio_sample_t* overflowBuffer;
-       int             overflowSize;
-       int             overflowStart;
+       audio_sample_t** outputBuffers;
+       nframes_t       outputPos;
+       nframes_t       outputSize;
+       
+       QVector<audio_sample_t*> overflowBuffers;
+       nframes_t       overflowSize;
+       nframes_t       overflowStart;
        
        // the first frame header for technical info
        mad_header firstHeader;
@@ -502,9 +505,9 @@
                        m_channels = 2;
        }
 
-       d->overflowBuffer = new audio_sample_t[1152 * get_num_channels()];
-       d->overflowSize = 0;
-       d->overflowStart = 0;
+       for (int c = 0; c < m_channels; c++) {
+               d->overflowBuffers.append(new audio_sample_t[1152]);
+       }
        
        seek(0);
 }
@@ -515,7 +518,10 @@
        if (d) {
                d->handle->cleanup();
                delete d->handle;
-               delete d->overflowBuffer;
+               while (d->overflowBuffers.size()) {
+                       delete d->overflowBuffers.back();
+                       d->overflowBuffers.pop_back();
+               }
                delete d;
        }
 }
@@ -578,10 +584,11 @@
                                        return (layer == MAD_LAYER_III);
                                }
                        }
-                       else
+                       else {
                                break;
                }
        }
+       }
        
        //PERROR("unsupported format: %s",QS_C(filename));
        
@@ -641,7 +648,7 @@
        
        // seekPosition to seek after frame i
        unsigned int frame = static_cast<unsigned int>(posSecs / mp3FrameSecs);
-       nframes_t frameOffset = (nframes_t)(start - (frame * mp3FrameSecs * 
get_rate() + 0.5)) * get_num_channels();
+       nframes_t frameOffset = (nframes_t)(start - (frame * mp3FrameSecs * 
get_rate() + 0.5));
        
        // Rob said: 29 frames is the theoretically max frame reservoir limit 
(whatever that means...)
        // it seems that mad needs at most 29 frames to get ready
@@ -686,12 +693,14 @@
        d->overflowStart = 0;
        d->overflowSize = 0;
        
+       AbstractAudioReader::seek(start);
+       
        // Seek to exact traverso frame, within this mp3 frame
        if (frameOffset > 0) {
                //printf("seekOffset: %lu (start: %lu)\n", frameOffset, start);
-               d->outputBuffer = 0; // Zeros so that we write to overflow
-               d->outputBufferEnd = 0;
-               d->outputPointer = 0;
+               d->outputBuffers = 0; // Zeros so that we write to overflow
+               d->outputSize = 0;
+               d->outputPos = 0;
                createPcmSamples(d->handle->madSynth);
                d->overflowStart = frameOffset;
                d->overflowSize -= frameOffset;
@@ -770,26 +779,30 @@
 nframes_t MadAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
 {
        d->outputBuffers = buffer;
-       d->bufferSize = frameCount
-       d->bufferPos = 0;
+       d->outputSize = frameCount;
+       d->outputPos = 0;
        
        bool bOutputBufferFull = false;
        
        // Deal with existing overflow
        if (d->overflowSize > 0) {
-               if (d->overflowSize < sampleCount) {
+               if (d->overflowSize < frameCount) {
                        //printf("output all %d overflow samples\n", 
d->overflowSize);
-                       memcpy(d->outputBuffer, d->overflowBuffer + 
d->overflowStart, d->overflowSize * sizeof(audio_sample_t));
-                       d->outputPointer += d->overflowSize;
+                       for (int c = 0; c < get_num_channels(); c++) {
+                               memcpy(d->outputBuffers[c], 
d->overflowBuffers[c] + d->overflowStart, d->overflowSize * 
sizeof(audio_sample_t));
+                       }
+                       d->outputPos += d->overflowSize;
                        d->overflowSize = 0;
                        d->overflowStart = 0;
                }
                else {
-                       //printf("output %d overflow samples, returned from 
overflow\n", sampleCount);
-                       memcpy(d->outputBuffer, d->overflowBuffer + 
d->overflowStart, sampleCount * sizeof(audio_sample_t));
-                       d->overflowSize -= sampleCount;
-                       d->overflowStart += sampleCount;
-                       return sampleCount;
+                       //printf("output %d overflow frames, returned from 
overflow\n", frameCount);
+                       for (int c = 0; c < get_num_channels(); c++) {
+                               memcpy(d->outputBuffers[c], 
d->overflowBuffers[c] + d->overflowStart, frameCount * sizeof(audio_sample_t));
+                       }
+                       d->overflowSize -= frameCount;
+                       d->overflowStart += frameCount;
+                       return frameCount;
                }
        }
        
@@ -798,7 +811,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->outputPointer >= d->outputBufferEnd) {
+               if (d->outputPos >= d->outputSize) {
                        bOutputBufferFull = true;
                }
                else if (d->handle->decodeNextFrame()) {
@@ -818,70 +831,75 @@
                }
        }
        
-       int samplesWritten = d->outputPointer - d->outputBuffer;
+       nframes_t framesWritten = d->outputPos;
        
        // 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() - m_readPos) * 
get_num_channels() - samplesWritten;
-       if (remainingSamplesRequested > 0 && remainingSamplesInFile > 0) {
-               int padLength = (remainingSamplesRequested > 
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
-               memset(d->outputPointer, 0, padLength * sizeof(audio_sample_t));
-               samplesWritten += padLength;
-               PERROR("padding: %d", padLength);
+       int remainingFramesRequested = frameCount - framesWritten;
+       int remainingFramesInFile = get_length() - (m_readPos + framesWritten);
+       if (remainingFramesRequested > 0 && remainingFramesInFile > 0) {
+               int padLength = (remainingFramesRequested > 
remainingFramesInFile) ? remainingFramesInFile : remainingFramesRequested;
+               for (int c = 0; c < get_num_channels(); c++) {
+                       //memset(d->outputBuffers[c] + framesWritten, 0, 
padLength * sizeof(audio_sample_t));
+               }
+               framesWritten += padLength;
+               printf("padding: %d\n", 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;
+       // Truncate so we don't return too many frames
+       if (framesWritten > remainingFramesInFile) {
+               printf("truncating by %d!\n", framesWritten - 
remainingFramesInFile);
+               framesWritten = remainingFramesInFile;
        }
        
-       //printf("at: %lu (total: %lu), request: %d (returned: %d)\n", 
m_readPos, m_frames, sampleCount/get_num_channels(), 
samplesWritten/get_num_channels());
+       //printf("at: %lu (total: %lu), request: %d (returned: %d)\n", 
m_readPos + framesWritten, m_frames, frameCount, framesWritten);
        
-       return samplesWritten;
+       return framesWritten;
 }
 
 
 bool MadAudioReader::createPcmSamples(mad_synth* synth)
 {
+       audio_sample_t  **writeBuffers = d->outputBuffers;
+       int             offset = d->outputPos;
        nframes_t nframes = synth->pcm.length;
        bool overflow = false;
        int i;
        
-       if ((nframes + ((d->outputPointer - d->outputBuffer)/get_num_channels() 
+ m_readPos)) > get_length()) {
-               nframes = get_length() - ((d->outputPointer - 
d->outputBuffer)/get_num_channels() + m_readPos);
-               //printf("!!!nframes: %lu, length: %lu, current: %lu\n", 
nframes, get_length(), (d->outputPointer - d->outputBuffer)/get_num_channels() 
+ m_readPos);
+       if ((m_readPos + d->outputPos + nframes) > get_length()) {
+               nframes = get_length() - (m_readPos + offset);
+               //printf("!!!nframes: %lu, length: %lu, current: %lu\n", 
nframes, get_length(), d->outputPos + m_readPos);
        }
        
        // now create the output
        for (i = 0; i < nframes; i++) {
-               if (overflow == false && d->outputPointer >= 
d->outputBufferEnd) {
-                       d->outputPointer = d->overflowBuffer;
+               if (overflow == false && d->outputPos + i >= d->outputSize) {
+                       writeBuffers = d->overflowBuffers.data();
+                       offset = 0 - i;
                        overflow = true;
                }
                
                /* Left channel */
-               *(d->outputPointer++) = 
mad_f_todouble(synth->pcm.samples[0][i]);
+               writeBuffers[0][offset + i] = 
mad_f_todouble(synth->pcm.samples[0][i]);
                
-               /* Right channel. If the decoded stream is monophonic then
-               * the right output channel is the same as the left one.
+               /* Right channel. If the decoded stream is monophonic then no 
right channel
                */
                if (synth->pcm.channels == 2) {
-                       *(d->outputPointer++) = 
mad_f_todouble(synth->pcm.samples[1][i]);
+                       writeBuffers[1][offset + i] = 
mad_f_todouble(synth->pcm.samples[1][i]);
                }
        } // pcm conversion
        
        if (overflow) {
-               d->overflowSize = d->outputPointer - d->overflowBuffer;
+               d->overflowSize = i + offset;
                d->overflowStart = 0;
-               d->outputPointer = d->outputBufferEnd;
-               //printf("written: %d (overflow: %u)\n",  nframes * 
synth->pcm.channels - d->overflowSize, d->overflowSize);
+               d->outputPos -= offset; // i was stored here when we switched 
to writing to overflow
+               //printf("written: %d (overflow: %u)\n",  nframes - 
d->overflowSize, d->overflowSize);
        }
        else {
-               //printf("written: %d\n",  i * synth->pcm.channels);
+               d->outputPos += i;
+               //printf("written: %d (os=%lu)\n",  i, d->overflowSize);
        }
        
        return true;

Index: MadAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4

Index: Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- Peak.cpp    18 Jul 2007 13:13:06 -0000      1.37
+++ Peak.cpp    19 Jul 2007 04:05:58 -0000      1.38
@@ -219,6 +219,10 @@
                }
        }
        
+       if (pixelcount <= 0) {
+               return 1;
+       }
+       
 // #define profile
 
 #if defined (profile)

Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- ResampleAudioReader.cpp     18 Jul 2007 20:07:34 -0000      1.10
+++ ResampleAudioReader.cpp     19 Jul 2007 04:05:58 -0000      1.11
@@ -140,11 +140,13 @@
        Q_ASSERT(m_reader);
        
        if (audiodevice().get_sample_rate() == (uint)m_reader->get_rate()) {
+               AbstractAudioReader::seek(start);
                return m_reader->seek(start);
        }
        
        reset();
        
+       AbstractAudioReader::seek(start);
        return m_reader->seek(song_to_file_frame(start));
 }
 

Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- ResampleAudioReader.h       18 Jul 2007 18:15:22 -0000      1.7
+++ ResampleAudioReader.h       19 Jul 2007 04:05:58 -0000      1.8
@@ -40,7 +40,6 @@
        bool seek(nframes_t start);
        nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
 
-
 protected:
        void init(int converter_type);
        void reset();

Index: SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- SFAudioReader.cpp   18 Jul 2007 18:15:22 -0000      1.5
+++ SFAudioReader.cpp   19 Jul 2007 04:05:58 -0000      1.6
@@ -127,6 +127,8 @@
                return false;
        }
        
+       AbstractAudioReader::seek(start);
+       
        return true;
 }
 

Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- VorbisAudioReader.cpp       18 Jul 2007 18:15:23 -0000      1.7
+++ VorbisAudioReader.cpp       19 Jul 2007 04:05:58 -0000      1.8
@@ -123,6 +123,8 @@
                return false;
        }
        
+       AbstractAudioReader::seek(start);
+       
        return true;
 }
 

Index: core.pro
===================================================================
RCS file: /sources/traverso/traverso/src/core/core.pro,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- core.pro    18 Jul 2007 18:15:23 -0000      1.34
+++ core.pro    19 Jul 2007 04:05:58 -0000      1.35
@@ -55,8 +55,7 @@
        FlacAudioReader.cpp \
        ResampleAudioReader.cpp \
        VorbisAudioReader.cpp \
-#      MadAudioReader.cpp
-
+       MadAudioReader.cpp
 HEADERS = precompile.h \
        AudioClip.h \
        AudioClipList.h \
@@ -105,8 +104,7 @@
        FlacAudioReader.h \
        ResampleAudioReader.h \
        VorbisAudioReader.h \
-#      MadAudioReader.h
-
+       MadAudioReader.h
 macx{
     QMAKE_LIBDIR += /usr/local/qt/lib
 }




reply via email to

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