traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src audiofileio/audiofileio.pro audiof...


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src audiofileio/audiofileio.pro audiof...
Date: Tue, 18 Sep 2007 15:52:19 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/09/18 15:52:19

Modified files:
        src/audiofileio: audiofileio.pro 
        src/audiofileio/decode: AbstractAudioReader.cpp 
                                ResampleAudioReader.cpp 
        src/core       : Peak.cpp Peak.h 

Log message:
        * moved PeakDataReader as a helper class into Peak

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/audiofileio.pro?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.53&r2=1.54
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.18&r2=1.19

Patches:
Index: audiofileio/audiofileio.pro
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/audiofileio.pro,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- audiofileio/audiofileio.pro 28 Aug 2007 19:53:03 -0000      1.8
+++ audiofileio/audiofileio.pro 18 Sep 2007 15:52:18 -0000      1.9
@@ -19,8 +19,7 @@
        decode/MadAudioReader.cpp \
        encode/AbstractAudioWriter.cpp \
        encode/SFAudioWriter.cpp \
-       encode/WPAudioWriter.cpp \
-       decode/PeakDataReader.cpp
+       encode/WPAudioWriter.cpp
 HEADERS = decode/AbstractAudioReader.h \
        decode/SFAudioReader.h \
        decode/FlacAudioReader.h \
@@ -63,5 +62,7 @@
 
     DEFINES += RELAYTOOL_VORBISFILE="\"static const int 
libvorbisfile_is_present=1; static int __attribute__((unused)) 
libvorbisfile_symbol_is_present(char *) { return 1; }\""
 }
-HEADERS -= PeakDataReader.h
+HEADERS -= PeakDataReader.h \
+decode/PeakDataReader.h
+SOURCES -= decode/PeakDataReader.cpp
 

Index: audiofileio/decode/AbstractAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- audiofileio/decode/AbstractAudioReader.cpp  17 Sep 2007 18:14:29 -0000      
1.8
+++ audiofileio/decode/AbstractAudioReader.cpp  18 Sep 2007 15:52:18 -0000      
1.9
@@ -26,7 +26,6 @@
 #include "WPAudioReader.h"
 #include "VorbisAudioReader.h"
 #include "ResampleAudioReader.h"
-#include "PeakDataReader.h"
 
 #include <QString>
 
@@ -128,8 +127,6 @@
                        newReader = new SFAudioReader(filename);
                } else if (decoder == "wavpack") {
                        newReader = new WPAudioReader(filename);
-               } else if (decoder == "peak") {
-                       newReader = new PeakDataReader(filename); 
                } else if (decoder == "flac") {
                        newReader = new FlacAudioReader(filename);
                } else if (decoder == "vorbis") {
@@ -161,9 +158,6 @@
                else if (MadAudioReader::can_decode(filename)) {
                        newReader = new MadAudioReader(filename);
                }
-               else if (PeakDataReader::can_decode(filename)) {
-                       newReader = new PeakDataReader(filename);
-               }
        }
        
        if (newReader && !newReader->is_valid()) {

Index: audiofileio/decode/ResampleAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- audiofileio/decode/ResampleAudioReader.cpp  11 Sep 2007 14:30:43 -0000      
1.10
+++ audiofileio/decode/ResampleAudioReader.cpp  18 Sep 2007 15:52:18 -0000      
1.11
@@ -21,7 +21,6 @@
 
 #include "ResampleAudioReader.h"
 #include <QString>
-#include "PeakDataReader.h"
 
 #define OVERFLOW_SIZE 512
 
@@ -275,12 +274,6 @@
 {
        Q_ASSERT(m_reader);
        
-       PeakDataReader* reader = dynamic_cast<PeakDataReader*>(m_reader);
-       if (reader) {
-//             int diff = frame - (nframes_t)(frame * ((double) m_rate / 
m_outputRate));
-               return frame;
-       }
-       
        return (nframes_t)(frame * ((double) m_rate / m_outputRate));
 }
 

Index: core/Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- core/Peak.cpp       17 Sep 2007 18:42:13 -0000      1.53
+++ core/Peak.cpp       18 Sep 2007 15:52:18 -0000      1.54
@@ -23,8 +23,7 @@
 
 #include "Peak.h"
 
-#include "PeakDataReader.h"
-#include "ResampleAudioReader.h"
+#include "AbstractAudioReader.h" // Needed for DecodeBuffer declaration
 #include "ReadSource.h"
 #include "ResourcesManager.h"
 #include "defines.h"
@@ -41,22 +40,22 @@
 * lower value to the upper value.
 */
 
-const int Peak::MAX_DB_VALUE                   = 120;
-const int SAVING_ZOOM_FACTOR                   = 6;
-const int Peak::MAX_ZOOM_USING_SOURCEFILE      = SAVING_ZOOM_FACTOR - 1;
-
 #define NORMALIZE_CHUNK_SIZE   10000
 #define PEAKFILE_MAJOR_VERSION 1
 #define PEAKFILE_MINOR_VERSION 0
 
-int Peak::zoomStep[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 
4096,
-                               8192, 16384, 32768, 65536, 131072, 262144, 
524288, 1048576};
+int Peak::zoomStep[] = {
+       // non-cached zoomlevels.
+       1, 2, 4, 8, 16, 32,
+       // Cached zoomlevels
+       64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 
262144, 524288, 1048576 
+};
 
 Peak::Peak(AudioSource* source)
 {
        PENTERCONS;
        
-       peaksAvailable = permanentFailure = interuptPeakBuild = false;
+       m_peaksAvailable = m_permanentFailure = m_interuptPeakBuild = false;
        
        QString sourcename = source->get_name();
        QString path = pm().get_project()->get_root_dir() + "/peakfiles/";
@@ -165,13 +164,11 @@
                fread(&data->headerdata.normValuesDataOffset, 
sizeof(data->headerdata.normValuesDataOffset), 1, data->file);
                fread(&data->headerdata.peakDataOffset, 
sizeof(data->headerdata.peakDataOffset), 1, data->file);
                
-               data->peakreader = new PeakDataReader(data->fileName);
+               data->peakreader = new PeakDataReader(data);
                data->peakdataDecodeBuffer = new DecodeBuffer;
        }
        
-       m_peakdataDecodeBuffer = new DecodeBuffer;
-
-       peaksAvailable = true;
+       m_peaksAvailable = true;
                
        return 1;
 }
@@ -237,11 +234,11 @@
 {
        PENTER3;
        
-       if (permanentFailure) {
+       if (m_permanentFailure) {
                return PERMANENT_FAILURE;
        }
        
-       if(!peaksAvailable) {
+       if(!m_peaksAvailable) {
                if (read_header() < 0) {
                        return NO_PEAK_FILE;
                }
@@ -371,7 +368,7 @@
                
                if (! data->file) {
                        PWARN("Couldn't open peak file for writing! (%s)", 
data->fileName.toAscii().data());
-                       permanentFailure  = true;
+                       m_permanentFailure  = true;
                        return -1;
                }
                
@@ -380,7 +377,7 @@
                
                if (! data->normFile) {
                        PWARN("Couldn't open normalization data file for 
writing! (%s)", data->normFileName.toAscii().data());
-                       permanentFailure  = true;
+                       m_permanentFailure  = true;
                        return -1;
                }
                
@@ -589,8 +586,6 @@
                return ret;
        }
        
-       m_source->set_output_rate(m_source->get_file_rate());
-       
        nframes_t readFrames = 0;
        nframes_t totalReadFrames = 0;
 
@@ -611,10 +606,12 @@
                }
        }
 
+       m_source->set_output_rate(m_source->get_file_rate());
+       
        DecodeBuffer decodebuffer;
        
        do {
-               if (interuptPeakBuild) {
+               if (m_interuptPeakBuild) {
                        ret = -1;
                        goto out;
                }
@@ -666,7 +663,7 @@
 audio_sample_t Peak::get_max_amplitude(nframes_t startframe, nframes_t 
endframe)
 {
        foreach(ChannelData* data, m_channelData) {
-               if (!data->file || !peaksAvailable) {
+               if (!data->file || !m_peaksAvailable) {
                        return 0.0f;
                }
        }
@@ -678,17 +675,17 @@
        audio_sample_t* readbuffer =  new audio_sample_t[buffersize];
        
        audio_sample_t maxamp = 0;
-       
+       DecodeBuffer decodebuffer;
        // Read in the part not fully occupied by a cached normalize value
        // at the left hand part and run compute_peak on it.
        if (startframe != 0) {
                startpos += 1;
                int toRead = (int) ((startpos * NORMALIZE_CHUNK_SIZE) - 
startframe);
                
-               int read = m_source->file_read(m_peakdataDecodeBuffer, 
startframe, toRead);
+               int read = m_source->file_read(&decodebuffer, startframe, 
toRead);
                
                for (uint chan = 0; chan < m_source->get_channel_count(); ++ 
chan) {
-                       maxamp = 
Mixer::compute_peak(m_peakdataDecodeBuffer->destination[chan], read, maxamp);
+                       maxamp = 
Mixer::compute_peak(decodebuffer.destination[chan], read, maxamp);
                }
        }
        
@@ -699,10 +696,10 @@
        int endpos = (int) f;
        int toRead = (int) ((f - (endframe / NORMALIZE_CHUNK_SIZE)) * 
NORMALIZE_CHUNK_SIZE);
        
-       int read = m_source->file_read(m_peakdataDecodeBuffer, endframe - 
toRead, toRead);
+       int read = m_source->file_read(&decodebuffer, endframe - toRead, 
toRead);
        
        for (uint chan = 0; chan < m_source->get_channel_count(); ++ chan) {
-               maxamp = 
Mixer::compute_peak(m_peakdataDecodeBuffer->destination[chan], read, maxamp);
+               maxamp = Mixer::compute_peak(decodebuffer.destination[chan], 
read, maxamp);
        }
        
        // Now that we have covered both boundary situations,
@@ -773,7 +770,7 @@
        
        m_taskRunning = false;
        
-       if (m_runningPeak->interuptPeakBuild) {
+       if (m_runningPeak->m_interuptPeakBuild) {
                PMESG("PeakProcessor:: Deleting interrupted Peak!");
                delete m_runningPeak;
                m_runningPeak = 0;
@@ -821,7 +818,7 @@
        
        if (peak == m_runningPeak) {
                PMESG("PeakProcessor:: Interrupting running build process!");
-               peak->interuptPeakBuild =  true;
+               peak->m_interuptPeakBuild =  true;
                
                PMESG("PeakProcessor:: Waiting GUI thread until interrupt 
finished");
                m_wait.wait(&m_mutex);
@@ -850,3 +847,71 @@
        exec();
 }
 
+
+
+PeakDataReader::PeakDataReader(Peak::ChannelData* data)
+{
+       m_d = data;
+       fseek (m_d->file, 0, SEEK_END);
+       m_nframes = ftell (m_d->file);
+}
+
+
+nframes_t PeakDataReader::read_from(DecodeBuffer* buffer, nframes_t start, 
nframes_t count)
+{
+//     printf("read_from:: before_seek from %d, framepos is %d\n", start, 
m_readPos);
+       
+       if (!seek(start)) {
+               return 0;
+       }
+       
+       return read(buffer, count);
+}
+
+
+bool PeakDataReader::seek(nframes_t start)
+{
+       if (m_readPos != start) {
+               Q_ASSERT(m_d->file);
+       
+       
+               if (start >= m_nframes) {
+                       return false;
+               }
+       
+               if (fseek (m_d->file, start, SEEK_SET) < 0) {
+                       PERROR("PeakDataReader: could not seek to data point %d 
within %s", start, m_d->fileName.toUtf8().data());
+                       return false;
+               }
+       
+               m_readPos = start;
+       }
+       
+       return true;
+}
+
+
+nframes_t PeakDataReader::read(DecodeBuffer* buffer, nframes_t count)
+{
+       if ( ! (count && (m_readPos < m_nframes)) ) {
+               return 0;
+       }
+               
+       // Make sure the read buffer is big enough for this read
+       buffer->check_buffers_capacity(count, 1);
+       
+       // printf("read_from:: after_seek from %d, framepos is %d\n", start, 
m_readPos);
+       Q_ASSERT(m_d->file);
+
+       int framesRead = fread((void*)buffer->readBuffer, sizeof(peak_data_t), 
count, m_d->file);
+
+       peak_data_t* readbuffer = (peak_data_t*)(buffer->readBuffer);
+
+       for (int f = 0; f < framesRead; f++) {
+               buffer->destination[0][f] = readbuffer[f];
+       }
+
+       m_readPos += framesRead;
+       
+       return framesRead;
+}

Index: core/Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- core/Peak.h 17 Sep 2007 18:14:30 -0000      1.18
+++ core/Peak.h 18 Sep 2007 15:52:18 -0000      1.19
@@ -34,8 +34,8 @@
 class AudioSource;
 class Peak;
 class PPThread;
-class AbstractAudioReader;
 class DecodeBuffer;
+class PeakDataReader;
 
 class PeakProcessor : public QObject
 {
@@ -87,24 +87,15 @@
 PeakProcessor& pp();
 
 
-struct PeakHeaderData {
-       int peakDataOffset;
-       int normValuesDataOffset;
-       int peakDataLevelOffsets[20 - 6];  // FIXME: Magic Numbers!
-       int peakDataSizeForLevel[20 - 6];
-       char label[6];  //TPFxxx -> Traverso Peak File version x.x.x
-       int version[2];
-
-};
-
 class Peak : public QObject
 {
        Q_OBJECT
 
 public:
        static const int ZOOM_LEVELS = 20;
-       static const int MAX_ZOOM_USING_SOURCEFILE;
-       static const int MAX_DB_VALUE;
+       static const int SAVING_ZOOM_FACTOR = 6;
+       static const int MAX_ZOOM_USING_SOURCEFILE = SAVING_ZOOM_FACTOR - 1;
+       static const int MAX_DB_VALUE = 120;
        static int zoomStep[ZOOM_LEVELS + 1];
 
        Peak(AudioSource* source);
@@ -128,9 +119,9 @@
 
 private:
        ReadSource*             m_source;
-       bool                    peaksAvailable;
-       bool                    permanentFailure;
-       bool                    interuptPeakBuild;
+       bool            m_peaksAvailable;
+       bool            m_permanentFailure;
+       bool            m_interuptPeakBuild;
        
        struct ProcessData {
                ProcessData() {
@@ -156,32 +147,57 @@
                int                     normDataCount;
        };
        
+       struct PeakHeaderData {
+               int peakDataOffset;
+               int normValuesDataOffset;
+               int peakDataLevelOffsets[ZOOM_LEVELS - SAVING_ZOOM_FACTOR];
+               int peakDataSizeForLevel[ZOOM_LEVELS - SAVING_ZOOM_FACTOR];
+               char label[6];  //TPFxxx -> Traverso Peak File version x.x.x
+               int version[2];
+       };
+
        struct ChannelData {
                QString         fileName;
                QString         normFileName;
                FILE*           file;
                FILE*           normFile;
                PeakHeaderData  headerdata;
-               AbstractAudioReader*    peakreader;
+               PeakDataReader* peakreader;
                ProcessData*    pd;
                DecodeBuffer*   peakdataDecodeBuffer;
        };
        
        QList<ChannelData* >    m_channelData;
-       DecodeBuffer*           m_peakdataDecodeBuffer;
        
        int create_from_scratch();
-
        int read_header();
        int write_header(ChannelData* data);
 
        friend class PeakProcessor;
+       friend class PeakDataReader;
 
 signals:
        void finished();
        void progress(int m_progress);
 };
 
+class PeakDataReader
+{
+public:
+       PeakDataReader(Peak::ChannelData* data);
+       ~PeakDataReader(){};
+
+       nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t 
count);
+
+private:
+       Peak::ChannelData* m_d;
+       nframes_t       m_readPos;
+       nframes_t       m_nframes;
+
+       bool seek(nframes_t start);
+       nframes_t read(DecodeBuffer* buffer, nframes_t frameCount);
+};
+
 
 #endif
 




reply via email to

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