traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src audiofileio/decode/AbstractAudioRe...


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src audiofileio/decode/AbstractAudioRe...
Date: Mon, 17 Sep 2007 18:14:30 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/09/17 18:14:30

Modified files:
        src/audiofileio/decode: AbstractAudioReader.cpp 
        src/core       : AudioClip.cpp AudioClip.h Peak.cpp Peak.h 
                         WriteSource.cpp WriteSource.h 
        src/traverso/songcanvas: AudioClipView.cpp AudioClipView.h 

Log message:
        * No longer a Peak object per audio channel, Peak class handles all 
channels by itself.
        This improves peak creation speed from scratch considerably, and also 
cleans up certain classes.
        Needs some more thought and testing though

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.cpp?cvsroot=traverso&r1=1.132&r2=1.133
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.h?cvsroot=traverso&r1=1.62&r2=1.63
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.50&r2=1.51
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/WriteSource.cpp?cvsroot=traverso&r1=1.33&r2=1.34
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/WriteSource.h?cvsroot=traverso&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/AudioClipView.cpp?cvsroot=traverso&r1=1.87&r2=1.88
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/AudioClipView.h?cvsroot=traverso&r1=1.29&r2=1.30

Patches:
Index: audiofileio/decode/AbstractAudioReader.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8

Index: core/AudioClip.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.cpp,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -b -r1.132 -r1.133
--- core/AudioClip.cpp  11 Sep 2007 18:37:30 -0000      1.132
+++ core/AudioClip.cpp  17 Sep 2007 18:14:29 -0000      1.133
@@ -107,8 +107,8 @@
                m_song->get_diskio()->unregister_read_source(m_readSource);
                delete m_readSource;
        }
-       foreach(Peak* peak, m_peaks) {
-               peak->close();
+       if (m_peak) {
+               m_peak->close();
        }
 }
 
@@ -117,6 +117,7 @@
        m_song = 0;
        m_track = 0;
        m_readSource = 0;
+       m_peak = 0;
        m_recordingStatus = NO_RECORDING;
        m_isSelected = m_isReadSourceValid = false;
        m_isLocked = config().get_property("AudioClip", "LockByDefault", 
false).toBool();
@@ -631,15 +632,6 @@
        return clip;
 }
 
-Peak* AudioClip::get_peak_for_channel( int chan ) const
-{
-       PENTER2;
-       if (chan >= m_peaks.size()) {
-               return 0;
-       }
-       return m_peaks.at(chan);
-}
-
 void AudioClip::set_audio_source(ReadSource* rs)
 {
        PENTER;
@@ -676,16 +668,10 @@
        
        
        if (m_recordingStatus == NO_RECORDING) {
-               
-               foreach(Peak* peak, m_peaks) {
-                       peak->close();
-               }
-       
-               m_peaks.clear();
-               
-               for (uint chan=0; chan<m_readSource->get_channel_count(); 
++chan) {
-                       m_peaks.append(new Peak(rs, chan));
+               if (m_peak) {
+                       m_peak->close();
                }
+               m_peak = new Peak(rs);
        }
 
        emit stateChanged();
@@ -892,8 +878,7 @@
                target -= FLT_EPSILON;
        }
 
-       for (uint i=0; i<m_readSource->get_channel_count(); ++i) {
-               double amp = 
get_peak_for_channel(i)->get_max_amplitude(m_sourceStartLocation.to_frame(get_rate()),
 m_sourceEndLocation.to_frame(get_rate()));
+       double amp = 
m_peak->get_max_amplitude(m_sourceStartLocation.to_frame(get_rate()), 
m_sourceEndLocation.to_frame(get_rate()));
                
                if (amp == 0.0f) {
                        printf("AudioClip::normalization: max amplitude == 
0\n");
@@ -902,7 +887,6 @@
                }
                
                maxamp = f_max(amp, maxamp);
-       }
 
        if (maxamp == target) {
                printf("AudioClip::normalization: max amplitude == target 
amplitude\n");

Index: core/AudioClip.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.h,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -b -r1.62 -r1.63
--- core/AudioClip.h    10 Sep 2007 18:42:48 -0000      1.62
+++ core/AudioClip.h    17 Sep 2007 18:14:29 -0000      1.63
@@ -84,7 +84,7 @@
        AudioClip* create_copy();
        Track* get_track() const;
        Song* get_song() const;
-       Peak* get_peak_for_channel(int chan) const;
+       Peak* get_peak() const {return m_peak;}
        QDomNode get_state(QDomDocument doc);
        FadeCurve* get_fade_in() const;
        FadeCurve* get_fade_out() const;
@@ -130,7 +130,7 @@
        ReadSource*             m_readSource;
        WriteSource*            m_recorder;
        QList<FadeCurve* >      m_fades;
-       QList<Peak* >           m_peaks;
+       Peak*                   m_peak;
        AudioBus*               m_captureBus;
        FadeCurve*              fadeIn;
        FadeCurve*              fadeOut;

Index: core/Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -b -r1.50 -r1.51
--- core/Peak.cpp       17 Sep 2007 13:40:34 -0000      1.50
+++ core/Peak.cpp       17 Sep 2007 18:14:30 -0000      1.51
@@ -52,26 +52,38 @@
 int Peak::zoomStep[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 
4096,
                                8192, 16384, 32768, 65536, 131072, 262144, 
524288, 1048576};
 
-Peak::Peak(AudioSource* source, int channel)
-       : m_channel(channel)
+Peak::Peak(AudioSource* source)
 {
        PENTERCONS;
        
+       peaksAvailable = permanentFailure = interuptPeakBuild = false;
+       
+       QString sourcename = source->get_name();
+       QString path = pm().get_project()->get_root_dir() + "/peakfiles/";
+       
+       for (uint chan = 0; chan < source->get_channel_count(); ++ chan) {
+               ChannelData* data = new Peak::ChannelData;
+               
+               data->fileName = sourcename + "-ch" + QByteArray::number(chan) 
+ ".peak";
+               data->fileName.prepend(path);
+               data->file = 0;
+               data->normFile = 0;
+               data->pd = 0;
+               
+               m_channelData.append(data);
+       }
+       
        ReadSource* rs = qobject_cast<ReadSource*>(source);
        
        if (rs) {
+               // This Peak object was created by AudioClip, meant for reading 
peak data
                m_source = resources_manager()->get_readsource(rs->get_id());
                m_source->set_output_rate(44100);
        } else {
+               // No ReadSource object? Then it's created by WriteSource for 
on the fly
+               // peak data creation, no m_source needed!
                m_source = 0;
        }
-       
-       m_fileName = source->get_name() + "-ch" + QByteArray::number(m_channel) 
+ ".peak";
-       m_fileName.prepend(pm().get_project()->get_root_dir() + "/peakfiles/");
-       
-       peaksAvailable = permanentFailure = interuptPeakBuild = false;
-       m_file = m_normFile = 0;
-       m_pd = 0;
 }
 
 Peak::~Peak()
@@ -82,13 +94,17 @@
                delete m_source;
        }
        
-       if (m_file) {
-               fclose(m_file);
+       foreach(ChannelData* data, m_channelData) {
+               if (data->file) {
+                       fclose(data->file);
+               }
+               
+               if (data->normFile) {
+                       fclose(data->normFile);
+                       QFile::remove(data->normFileName);
        }
        
-       if (m_normFile) {
-               fclose(m_normFile);
-               QFile::remove(m_normFileName);
+               delete data;
        }
 }
 
@@ -103,15 +119,16 @@
        
        Q_ASSERT(m_source);
        
-       m_file = fopen(m_fileName.toUtf8().data(),"rb");
+       foreach(ChannelData* data, m_channelData) {
+               data->file = fopen(data->fileName.toUtf8().data(),"rb");
        
-       if (! m_file) {
-               PERROR("Couldn't open peak file for reading! (%s)", 
m_fileName.toAscii().data());
+               if (! data->file) {
+                       PERROR("Couldn't open peak file for reading! (%s)", 
data->fileName.toAscii().data());
                return -1;
        }
        
        QFileInfo file(m_source->get_filename());
-       QFileInfo peakFile(m_fileName);
+               QFileInfo peakFile(data->fileName);
        
        QDateTime fileModTime = file.lastModified();
        QDateTime peakModTime = peakFile.lastModified();
@@ -124,31 +141,34 @@
        }
        
        
-       fseek(m_file, 0, SEEK_SET);
+               fseek(data->file, 0, SEEK_SET);
 
-       fread(m_data.label, sizeof(m_data.label), 1, m_file);
-       fread(m_data.version, sizeof(m_data.version), 1, m_file);
+               fread(data->headerdata.label, sizeof(data->headerdata.label), 
1, data->file);
+               fread(data->headerdata.version, 
sizeof(data->headerdata.version), 1, data->file);
 
-       if ((m_data.label[0]!='T') ||
-               (m_data.label[1]!='R') ||
-               (m_data.label[2]!='A') ||
-               (m_data.label[3]!='V') ||
-               (m_data.label[4]!='P') ||
-               (m_data.label[5]!='F') ||
-               (m_data.version[0] != PEAKFILE_MAJOR_VERSION) ||
-               (m_data.version[1] != PEAKFILE_MINOR_VERSION)) {
+               if (    (data->headerdata.label[0]!='T') ||
+                       (data->headerdata.label[1]!='R') ||
+                       (data->headerdata.label[2]!='A') ||
+                       (data->headerdata.label[3]!='V') ||
+                       (data->headerdata.label[4]!='P') ||
+                       (data->headerdata.label[5]!='F') ||
+                       (data->headerdata.version[0] != PEAKFILE_MAJOR_VERSION) 
||
+                       (data->headerdata.version[1] != 
PEAKFILE_MINOR_VERSION)) {
                        printf("This file either isn't a Traverso Peak file, or 
the version doesn't match!\n");
-                       fclose(m_file);
-                       m_file = 0;
+                               fclose(data->file);
+                               data->file = 0;
                        return -1;
        }
        
-       fread(m_data.peakDataLevelOffsets, sizeof(m_data.peakDataLevelOffsets), 
1, m_file);
-       fread(m_data.peakDataSizeForLevel, sizeof(m_data.peakDataSizeForLevel), 
1, m_file);
-       fread(&m_data.normValuesDataOffset, 
sizeof(m_data.normValuesDataOffset), 1, m_file);
-       fread(&m_data.peakDataOffset, sizeof(m_data.peakDataOffset), 1, m_file);
+               fread(data->headerdata.peakDataLevelOffsets, 
sizeof(data->headerdata.peakDataLevelOffsets), 1, data->file);
+               fread(data->headerdata.peakDataSizeForLevel, 
sizeof(data->headerdata.peakDataSizeForLevel), 1, data->file);
+               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->peakdataDecodeBuffer = new DecodeBuffer;
+       }
        
-       m_peakreader = new PeakDataReader(m_fileName);
        m_peakdataDecodeBuffer = new DecodeBuffer;
 
        peaksAvailable = true;
@@ -156,27 +176,27 @@
        return 1;
 }
 
-int Peak::write_header()
+int Peak::write_header(ChannelData* data)
 {
        PENTER;
        
-       fseek (m_file, 0, SEEK_SET);
+       fseek (data->file, 0, SEEK_SET);
        
-       m_data.label[0] = 'T';
-       m_data.label[1] = 'R';
-       m_data.label[2] = 'A';
-       m_data.label[3] = 'V';
-       m_data.label[4] = 'P';
-       m_data.label[5] = 'F';
-       m_data.version[0] = PEAKFILE_MAJOR_VERSION;
-       m_data.version[1] = PEAKFILE_MINOR_VERSION;
-       
-       fwrite(m_data.label, sizeof(m_data.label), 1, m_file);
-       fwrite(m_data.version, sizeof(m_data.version), 1, m_file);
-       fwrite(m_data.peakDataLevelOffsets, 
sizeof(m_data.peakDataLevelOffsets), 1, m_file);
-       fwrite(m_data.peakDataSizeForLevel, 
sizeof(m_data.peakDataSizeForLevel), 1, m_file);
-       fwrite((void*) &m_data.normValuesDataOffset, 
sizeof(m_data.normValuesDataOffset), 1, m_file);
-       fwrite((void*) &m_data.peakDataOffset, sizeof(m_data.peakDataOffset), 
1, m_file);
+       data->headerdata.label[0] = 'T';
+       data->headerdata.label[1] = 'R';
+       data->headerdata.label[2] = 'A';
+       data->headerdata.label[3] = 'V';
+       data->headerdata.label[4] = 'P';
+       data->headerdata.label[5] = 'F';
+       data->headerdata.version[0] = PEAKFILE_MAJOR_VERSION;
+       data->headerdata.version[1] = PEAKFILE_MINOR_VERSION;
+       
+       fwrite(data->headerdata.label, sizeof(data->headerdata.label), 1, 
data->file);
+       fwrite(data->headerdata.version, sizeof(data->headerdata.version), 1, 
data->file);
+       fwrite(data->headerdata.peakDataLevelOffsets, 
sizeof(data->headerdata.peakDataLevelOffsets), 1, data->file);
+       fwrite(data->headerdata.peakDataSizeForLevel, 
sizeof(data->headerdata.peakDataSizeForLevel), 1, data->file);
+       fwrite((void*) &data->headerdata.normValuesDataOffset, 
sizeof(data->headerdata.normValuesDataOffset), 1, data->file);
+       fwrite((void*) &data->headerdata.peakDataOffset, 
sizeof(data->headerdata.peakDataOffset), 1, data->file);
        
        return 1;
 }
@@ -213,7 +233,7 @@
 }
 
 
-int Peak::calculate_peaks(float** buffer, int zoomLevel, nframes_t startPos, 
int pixelcount)
+int Peak::calculate_peaks(int chan, float** buffer, int zoomLevel, nframes_t 
startPos, int pixelcount)
 {
        PENTER3;
        
@@ -231,6 +251,8 @@
                return 1;
        }
        
+       ChannelData* data = m_channelData.at(chan);
+       
 // #define profile
 
 #if defined (profile)
@@ -243,14 +265,14 @@
                int offset = (startPos / zoomStep[zoomLevel]) * 2;
                
                // Check if this zoom level has as many data as requested.
-               if ( (pixelcount + offset) > 
m_data.peakDataSizeForLevel[zoomLevel - SAVING_ZOOM_FACTOR]) {
+               if ( (pixelcount + offset) > 
data->headerdata.peakDataSizeForLevel[zoomLevel - SAVING_ZOOM_FACTOR]) {
                        // YES we know that sometimes we ommit the very last 
'pixel' to avoid painting artifacts...
-//                     PERROR("pixelcount exceeds available data size! 
(pixelcount is: %d, available is %d", pixelcount, 
m_data.peakDataSizeForLevel[zoomLevel - SAVING_ZOOM_FACTOR] - offset); 
-                       pixelcount = m_data.peakDataSizeForLevel[zoomLevel - 
SAVING_ZOOM_FACTOR] - offset;
+//                     PERROR("pixelcount exceeds available data size! 
(pixelcount is: %d, available is %d", pixelcount, 
data->headerdata.peakDataSizeForLevel[zoomLevel - SAVING_ZOOM_FACTOR] - 
offset); 
+                       pixelcount = 
data->headerdata.peakDataSizeForLevel[zoomLevel - SAVING_ZOOM_FACTOR] - offset;
                }
                
-               nframes_t readposition = m_data.peakDataLevelOffsets[zoomLevel 
- SAVING_ZOOM_FACTOR] + offset;
-               int read = m_peakreader->read_from(m_peakdataDecodeBuffer, 
readposition, pixelcount);
+               nframes_t readposition = 
data->headerdata.peakDataLevelOffsets[zoomLevel - SAVING_ZOOM_FACTOR] + offset;
+               int read = 
data->peakreader->read_from(data->peakdataDecodeBuffer, readposition, 
pixelcount);
                
                if (read != pixelcount) {
                        PERROR("Could not read in all peak data, pixelcount is 
%d, read count is %d", pixelcount, read);
@@ -265,7 +287,7 @@
                        return NO_PEAKDATA_FOUND;
                }
                
-               *buffer = m_peakdataDecodeBuffer->destination[0];
+               *buffer = data->peakdataDecodeBuffer->destination[0];
 
                return read;
                
@@ -300,7 +322,7 @@
 
                        for(int i=0; i < zoomStep[zoomLevel]; i++) {
                                Q_ASSERT(pos <= readFrames);
-                               sample = 
m_peakdataDecodeBuffer->destination[m_channel][pos];
+                               sample = 
m_peakdataDecodeBuffer->destination[chan][pos];
                                if (sample > valueMax)
                                        valueMax = sample;
                                if (sample < valueMin)
@@ -339,40 +361,45 @@
 {
        PENTER;
        
-       m_normFileName = m_fileName;
-       m_normFileName.append(".norm");
+       foreach(ChannelData* data, m_channelData) {
+               
+               data->normFileName = data->fileName;
+               data->normFileName.append(".norm");
        
        // Create read/write enabled file
-       m_file = fopen(m_fileName.toUtf8().data(),"wb+");
+               data->file = fopen(data->fileName.toUtf8().data(),"wb+");
        
-       if (! m_file) {
-               PWARN("Couldn't open peak file for writing! (%s)", 
m_fileName.toAscii().data());
+               if (! data->file) {
+                       PWARN("Couldn't open peak file for writing! (%s)", 
data->fileName.toAscii().data());
                permanentFailure  = true;
                return -1;
        }
        
        // Create the temporary normalization data file
-       m_normFile = fopen(m_normFileName.toUtf8().data(), "wb+");
+               data->normFile = fopen(data->normFileName.toUtf8().data(), 
"wb+");
        
-       if (! m_normFile) {
-               PWARN("Couldn't open normalization data file for writing! 
(%s)", m_normFileName.toAscii().data());
+               if (! data->normFile) {
+                       PWARN("Couldn't open normalization data file for 
writing! (%s)", data->normFileName.toAscii().data());
                permanentFailure  = true;
                return -1;
        }
        
        // We need to know the peakDataOffset.
-       m_data.peakDataOffset = sizeof(m_data.label) + 
-                               sizeof(m_data.version) + 
-                               sizeof(m_data.peakDataLevelOffsets) + 
-                               sizeof(m_data.peakDataSizeForLevel) +
-                               sizeof(m_data.normValuesDataOffset) + 
-                               sizeof(m_data.peakDataOffset);
+               data->headerdata.peakDataOffset = 
+                                       sizeof(data->headerdata.label) + 
+                                       sizeof(data->headerdata.version) + 
+                                       
sizeof(data->headerdata.peakDataLevelOffsets) + 
+                                       
sizeof(data->headerdata.peakDataSizeForLevel) +
+                                       
sizeof(data->headerdata.normValuesDataOffset) + 
+                                       sizeof(data->headerdata.peakDataOffset);
                                
        // Now seek to the start position, so we can write the peakdata to it 
in the process function
-       fseek(m_file, m_data.peakDataOffset, SEEK_SET);
+               fseek(data->file, data->headerdata.peakDataOffset, SEEK_SET);
+               
+               data->pd = new Peak::ProcessData;
+               data->pd->stepSize = TimeRef(1, m_source->get_file_rate());
+       }
        
-       m_pd = new Peak::ProcessData;
-       m_pd->stepSize = TimeRef(1, m_source->get_file_rate());
        
        return 1;
 }
@@ -382,50 +409,52 @@
 {
        PENTER;
        
-       if (m_pd->processLocation < m_pd->nextDataPointLocation) {
-               peak_data_t data = (peak_data_t)(m_pd->peakUpperValue * 
MAX_DB_VALUE);
-               fwrite(&data, sizeof(peak_data_t), 1, m_file);
-               data = (peak_data_t)(-1 * m_pd->peakLowerValue * MAX_DB_VALUE);
-               fwrite(&data, sizeof(peak_data_t), 1, m_file);
-               m_pd->processBufferSize += 2;
+       foreach(ChannelData* data, m_channelData) {
+               
+               if (data->pd->processLocation < 
data->pd->nextDataPointLocation) {
+                       peak_data_t peakvalue = 
(peak_data_t)(data->pd->peakUpperValue * MAX_DB_VALUE);
+                       fwrite(&peakvalue, sizeof(peak_data_t), 1, data->file);
+                       peakvalue = (peak_data_t)(-1 * data->pd->peakLowerValue 
* MAX_DB_VALUE);
+                       fwrite(&peakvalue, sizeof(peak_data_t), 1, data->file);
+                       data->pd->processBufferSize += 2;
        }
        
        int totalBufferSize = 0;
        
-       m_data.peakDataSizeForLevel[0] = m_pd->processBufferSize;
-       totalBufferSize += m_pd->processBufferSize;
+               data->headerdata.peakDataSizeForLevel[0] = 
data->pd->processBufferSize;
+               totalBufferSize += data->pd->processBufferSize;
        
        for( int i = SAVING_ZOOM_FACTOR + 1; i < ZOOM_LEVELS+1; ++i) {
-               m_data.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR] = 
m_data.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR - 1] / 2;
-               totalBufferSize += m_data.peakDataSizeForLevel[i - 
SAVING_ZOOM_FACTOR];
+                       data->headerdata.peakDataSizeForLevel[i - 
SAVING_ZOOM_FACTOR] = data->headerdata.peakDataSizeForLevel[i - 
SAVING_ZOOM_FACTOR - 1] / 2;
+                       totalBufferSize += 
data->headerdata.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR];
        }
        
        
-       fseek(m_file, m_data.peakDataOffset, SEEK_SET);
+               fseek(data->file, data->headerdata.peakDataOffset, SEEK_SET);
        
        // The routine below uses a different total buffer size calculation
        // which might end up with a size >= totalbufferSize !!!
        // Need to look into that, for now + 2 seems to work...
        peak_data_t* saveBuffer = new peak_data_t[totalBufferSize + 
1*sizeof(peak_data_t)];
        
-       int read = fread(saveBuffer, sizeof(peak_data_t), 
m_pd->processBufferSize, m_file);
+               int read = fread(saveBuffer, sizeof(peak_data_t), 
data->pd->processBufferSize, data->file);
        
-       if (read != m_pd->processBufferSize) {
+               if (read != data->pd->processBufferSize) {
                PERROR("couldn't read in all saved data?? (%d read)", read);
        }
        
        
        int prevLevelBufferPos = 0;
        int nextLevelBufferPos;
-       m_data.peakDataSizeForLevel[0] = m_pd->processBufferSize;
-       m_data.peakDataLevelOffsets[0] = m_data.peakDataOffset;
+               data->headerdata.peakDataSizeForLevel[0] = 
data->pd->processBufferSize;
+               data->headerdata.peakDataLevelOffsets[0] = 
data->headerdata.peakDataOffset;
        
        for (int i = SAVING_ZOOM_FACTOR+1; i < ZOOM_LEVELS+1; ++i) {
        
-               int prevLevelSize = m_data.peakDataSizeForLevel[i - 
SAVING_ZOOM_FACTOR - 1];
-               m_data.peakDataLevelOffsets[i - SAVING_ZOOM_FACTOR] = 
m_data.peakDataLevelOffsets[i - SAVING_ZOOM_FACTOR - 1] + prevLevelSize;
-               prevLevelBufferPos = m_data.peakDataLevelOffsets[i - 
SAVING_ZOOM_FACTOR - 1] - m_data.peakDataOffset;
-               nextLevelBufferPos = m_data.peakDataLevelOffsets[i - 
SAVING_ZOOM_FACTOR] - m_data.peakDataOffset;
+                       int prevLevelSize = 
data->headerdata.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR - 1];
+                       data->headerdata.peakDataLevelOffsets[i - 
SAVING_ZOOM_FACTOR] = data->headerdata.peakDataLevelOffsets[i - 
SAVING_ZOOM_FACTOR - 1] + prevLevelSize;
+                       prevLevelBufferPos = 
data->headerdata.peakDataLevelOffsets[i - SAVING_ZOOM_FACTOR - 1] - 
data->headerdata.peakDataOffset;
+                       nextLevelBufferPos = 
data->headerdata.peakDataLevelOffsets[i - SAVING_ZOOM_FACTOR] - 
data->headerdata.peakDataOffset;
                
                
                int count = 0;
@@ -441,101 +470,106 @@
                while (count < prevLevelSize);
        }
        
-       fseek(m_file, m_data.peakDataOffset, SEEK_SET);
+               fseek(data->file, data->headerdata.peakDataOffset, SEEK_SET);
        
-       int written = fwrite(saveBuffer, sizeof(peak_data_t), totalBufferSize, 
m_file);
+               int written = fwrite(saveBuffer, sizeof(peak_data_t), 
totalBufferSize, data->file);
        
        if (written != totalBufferSize) {
                PERROR("could not write complete buffer! (only %d)", written);
-//             return -1;
+       //              return -1;
        }
        
-       fseek(m_normFile, 0, SEEK_SET);
+               fseek(data->normFile, 0, SEEK_SET);
        
-       read = fread(saveBuffer, sizeof(audio_sample_t), m_pd->normDataCount, 
m_normFile);
+               read = fread(saveBuffer, sizeof(audio_sample_t), 
data->pd->normDataCount, data->normFile);
        
-       if (read != m_pd->normDataCount) {
-               PERROR("Could not read in all (%d) norm. data, only %d", 
m_pd->normDataCount, read);
+               if (read != data->pd->normDataCount) {
+                       PERROR("Could not read in all (%d) norm. data, only 
%d", data->pd->normDataCount, read);
        }
        
-       m_data.normValuesDataOffset = m_data.peakDataOffset + totalBufferSize;
+               data->headerdata.normValuesDataOffset = 
data->headerdata.peakDataOffset + totalBufferSize;
        
-       fclose(m_normFile);
-       m_normFile = NULL;
+               fclose(data->normFile);
+               data->normFile = NULL;
        
-       if (!QFile::remove(m_normFileName)) {
-               PERROR("Failed to remove temp. norm. data file! (%s)", 
m_normFileName.toAscii().data()); 
+               if (!QFile::remove(data->normFileName)) {
+                       PERROR("Failed to remove temp. norm. data file! (%s)", 
data->normFileName.toAscii().data()); 
        }
        
-       written = fwrite(saveBuffer, sizeof(audio_sample_t), read, m_file);
+               written = fwrite(saveBuffer, sizeof(audio_sample_t), read, 
data->file);
        
-       write_header();
+               write_header(data);
        
-       fclose(m_file);
-       m_file = 0;
+               fclose(data->file);
+               data->file = 0;
        
        delete [] saveBuffer;
-       delete m_pd;
-       m_pd = 0;
+               delete data->pd;
+               data->pd = 0;
        
-       emit finished(this);
+       }
+       
+       emit finished();
        
        return 1;
        
 }
 
 
-void Peak::process(audio_sample_t* buffer, nframes_t nframes)
+void Peak::process(uint channel, audio_sample_t* buffer, nframes_t nframes)
 {
+       ChannelData* data = m_channelData.at(channel);
+       ProcessData* pd = data->pd;
+
        for (uint i=0; i < nframes; i++) {
                
-               m_pd->processLocation += m_pd->stepSize;
+               pd->processLocation += pd->stepSize;
                
                audio_sample_t sample = buffer[i];
                
-               m_pd->normValue = f_max(m_pd->normValue, fabsf(sample));
+               pd->normValue = f_max(pd->normValue, fabsf(sample));
                
-               if (sample > m_pd->peakUpperValue) {
-                       m_pd->peakUpperValue = sample;
+               if (sample > pd->peakUpperValue) {
+                       pd->peakUpperValue = sample;
                }
                
-               if (sample < m_pd->peakLowerValue) {
-                       m_pd->peakLowerValue = sample;
+               if (sample < pd->peakLowerValue) {
+                       pd->peakLowerValue = sample;
                }
                
-               if (m_pd->processLocation >= m_pd->nextDataPointLocation) {
+               if (pd->processLocation >= pd->nextDataPointLocation) {
                
                        peak_data_t peakbuffer[2];
 
-                       peakbuffer[0] = (peak_data_t) (m_pd->peakUpperValue * 
MAX_DB_VALUE );
-                       peakbuffer[1] = (peak_data_t) ((-1) * 
(m_pd->peakLowerValue * MAX_DB_VALUE ));
+                       peakbuffer[0] = (peak_data_t) (pd->peakUpperValue * 
MAX_DB_VALUE );
+                       peakbuffer[1] = (peak_data_t) ((-1) * 
(pd->peakLowerValue * MAX_DB_VALUE ));
                        
-                       int written = fwrite(peakbuffer, sizeof(peak_data_t), 
2, m_file);
+                       int written = fwrite(peakbuffer, sizeof(peak_data_t), 
2, data->file);
                        
                        if (written != 2) {
                                PWARN("couldnt write data, only (%d)", written);
                        }
 
-                       m_pd->peakUpperValue = 0.0;
-                       m_pd->peakLowerValue = 0.0;
+                       pd->peakUpperValue = 0.0;
+                       pd->peakLowerValue = 0.0;
                        
-                       m_pd->processBufferSize+=2;
-                       m_pd->nextDataPointLocation += m_pd->processRange;
+                       pd->processBufferSize+=2;
+                       pd->nextDataPointLocation += pd->processRange;
                }
                
-               if (m_pd->normProcessedFrames == NORMALIZE_CHUNK_SIZE) {
-                       int written = fwrite(&m_pd->normValue, 
sizeof(audio_sample_t), 1, m_normFile);
+               if (pd->normProcessedFrames == NORMALIZE_CHUNK_SIZE) {
+                       int written = fwrite(&pd->normValue, 
sizeof(audio_sample_t), 1, data->normFile);
                        
                        if (written != 1) {
                                PWARN("couldnt write data, only (%d)", written);
                        }
  
-                       m_pd->normValue = 0.0;
-                       m_pd->normProcessedFrames = 0;
-                       m_pd->normDataCount++;
+                       pd->normValue = 0.0;
+                       pd->normProcessedFrames = 0;
+                       pd->normDataCount++;
                }
                
-               m_pd->normProcessedFrames++;
+               pd->normProcessedFrames++;
        }
 }
 
@@ -562,7 +596,7 @@
 
        nframes_t bufferSize = 65536;
 
-       int p = 0;
+       int progression = 0;
 
        if (m_source->get_length() == 0) {
                qWarning("Peak::create_from_scratch() : m_source (%s) has 
length 0", m_source->get_name().toAscii().data());
@@ -591,13 +625,19 @@
                        PERROR("readFrames < 0 during peak building");
                        break;
                }
-               process(decodebuffer.destination[m_channel], readFrames);
+               
+               for (uint chan = 0; chan < m_source->get_channel_count(); ++ 
chan) {
+                       process(chan, decodebuffer.destination[chan], 
readFrames);
+               }
+               
                totalReadFrames += readFrames;
-               p = (int) ((float)totalReadFrames / 
((float)m_source->get_nframes() / 100.0));
+               progression = (int) ((float)totalReadFrames / 
((float)m_source->get_nframes() / 100.0));
                
-               if ( p > m_pd->progress) {
-                       emit progress(p - m_pd->progress);
-                       m_pd->progress = p;
+               ChannelData* data = m_channelData.at(0);
+               
+               if ( progression > data->pd->progress) {
+                       emit progress(progression);
+                       data->pd->progress = progression;
                }
                
        } while (totalReadFrames < m_source->get_nframes());
@@ -625,7 +665,10 @@
 
 audio_sample_t Peak::get_max_amplitude(nframes_t startframe, nframes_t 
endframe)
 {
-       if (!m_file || !peaksAvailable) {
+       
+       ChannelData* data = m_channelData.at(0);
+       
+       if (!data->file || !peaksAvailable) {
                return 0.0f;
        }
        
@@ -645,7 +688,9 @@
                
                int read = m_source->file_read(m_peakdataDecodeBuffer, 
startframe, toRead);
                
-               maxamp = 
Mixer::compute_peak(m_peakdataDecodeBuffer->destination[m_channel], read, 
maxamp);
+               for (uint chan = 0; chan < m_source->get_channel_count(); ++ 
chan) {
+                       maxamp = 
Mixer::compute_peak(m_peakdataDecodeBuffer->destination[chan], read, maxamp);
+               }
        }
        
        
@@ -657,15 +702,17 @@
        
        int read = m_source->file_read(m_peakdataDecodeBuffer, endframe - 
toRead, toRead);
        
-       maxamp = 
Mixer::compute_peak(m_peakdataDecodeBuffer->destination[m_channel], read, 
maxamp);
+       for (uint chan = 0; chan < m_source->get_channel_count(); ++ chan) {
+               maxamp = 
Mixer::compute_peak(m_peakdataDecodeBuffer->destination[chan], read, maxamp);
+       }
        
        // Now that we have covered both boundary situations,
        // read in the cached normvalues, and calculate the highest value!
        count = endpos - startpos;
        
-       fseek(m_file, m_data.normValuesDataOffset + (startpos * 
sizeof(audio_sample_t)), SEEK_SET);
+       fseek(data->file, data->headerdata.normValuesDataOffset + (startpos * 
sizeof(audio_sample_t)), SEEK_SET);
        
-       read = fread(readbuffer, sizeof(audio_sample_t), count, m_file);
+       read = fread(readbuffer, sizeof(audio_sample_t), count, data->file);
        
        if (read != (int)count) {
                printf("could only read %d, %d requested\n", read, count);
@@ -734,9 +781,9 @@
        }
        
        foreach(Peak* peak, m_queue) {
-               if (m_runningPeak->m_fileName == peak->m_fileName) {
+               if (m_runningPeak->m_source->get_filename() == 
peak->m_source->get_filename()) {
                        m_queue.removeAll(peak);
-                       emit peak->finished(peak);
+                       emit peak->finished();
                }
        }
        

Index: core/Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- core/Peak.h 17 Sep 2007 13:40:34 -0000      1.17
+++ core/Peak.h 17 Sep 2007 18:14:30 -0000      1.18
@@ -87,7 +87,7 @@
 PeakProcessor& pp();
 
 
-struct PeakData {
+struct PeakHeaderData {
        int peakDataOffset;
        int normValuesDataOffset;
        int peakDataLevelOffsets[20 - 6];  // FIXME: Magic Numbers!
@@ -107,7 +107,7 @@
        static const int MAX_DB_VALUE;
        static int zoomStep[ZOOM_LEVELS + 1];
 
-       Peak(AudioSource* source, int channel = -1);
+       Peak(AudioSource* source);
        ~Peak();
 
        enum {  NO_PEAKDATA_FOUND = -1,
@@ -115,10 +115,10 @@
                PERMANENT_FAILURE = -3
        };
                
-       void process(audio_sample_t* buffer, nframes_t frames);
+       void process(uint channel, audio_sample_t* buffer, nframes_t frames);
        int prepare_processing();
        int finish_processing();
-       int calculate_peaks(float** buffer, int zoomLevel, nframes_t startPos, 
int count);
+       int calculate_peaks(int chan, float** buffer, int zoomLevel, nframes_t 
startPos, int count);
 
        void close();
        
@@ -131,7 +131,6 @@
        bool                    peaksAvailable;
        bool                    permanentFailure;
        bool                    interuptPeakBuild;
-       int                     m_channel;
        
        struct ProcessData {
                ProcessData() {
@@ -140,6 +139,7 @@
                        processRange = TimeRef(64, 44100);
                        nextDataPointLocation = processRange;
                }
+               
                audio_sample_t          peakUpperValue;
                audio_sample_t          peakLowerValue;
                audio_sample_t          normValue;
@@ -156,25 +156,29 @@
                int                     normDataCount;
        };
        
-       ProcessData*            m_pd;
+       struct ChannelData {
+               QString         fileName;
+               QString         normFileName;
+               FILE*           file;
+               FILE*           normFile;
+               PeakHeaderData  headerdata;
+               AbstractAudioReader*    peakreader;
+               ProcessData*    pd;
+               DecodeBuffer*   peakdataDecodeBuffer;
+       };
 
-       PeakData                m_data;
-       FILE*                   m_file;
-       FILE*                   m_normFile;
-       QString                 m_fileName;
-       QString                 m_normFileName;
-       AbstractAudioReader*    m_peakreader;
+       QList<ChannelData* >    m_channelData;
        DecodeBuffer*           m_peakdataDecodeBuffer;
        
        int create_from_scratch();
 
        int read_header();
-       int write_header();
+       int write_header(ChannelData* data);
 
        friend class PeakProcessor;
 
 signals:
-       void finished(Peak*);
+       void finished();
        void progress(int m_progress);
 };
 

Index: core/WriteSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/WriteSource.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- core/WriteSource.cpp        15 Aug 2007 20:07:42 -0000      1.33
+++ core/WriteSource.cpp        17 Sep 2007 18:14:30 -0000      1.34
@@ -42,14 +42,15 @@
 {
        m_diskio = 0;
        m_writer = 0;
+       m_peak = 0;
        prepare_export();
 }
 
 WriteSource::~WriteSource()
 {
        PENTERDES;
-       foreach(Peak* peak, m_peaks) {
-               delete peak;
+       if (m_peak) {
+               delete m_peak;
        }
        
        for(int i=0; i<m_buffers.size(); ++i) {
@@ -348,11 +349,9 @@
                m_src_state = 0;
        }
 
-       foreach(Peak* peak, m_peaks) {
-               if (peak->finish_processing() < 0) {
+       if (m_peak->finish_processing() < 0) {
                        PERROR("WriteSource::finish_export : 
peak->finish_processing() failed!");
                }
-       }
                
        if (m_diskio) {
                m_diskio->unregister_write_source(this);
@@ -385,21 +384,18 @@
                return;
        }
        
-       Q_ASSERT(m_peaks.isEmpty());
+       Q_ASSERT(!m_peak);
        
-       for (int chan=0; chan < m_channelCount; ++chan) {
-               Peak* peak = new Peak(this, chan);
+       m_peak = new Peak(this);
        
-               if (peak->prepare_processing() < 0) {
+       if (m_peak->prepare_processing() < 0) {
                        PERROR("Cannot process peaks realtime");
                        m_processPeaks = false;
-                       delete peak;
+               delete m_peak;
+               m_peak = 0;
                        
                        return;
                }
-               
-               m_peaks.append(peak);
-       }
 }
 
 int WriteSource::rb_file_write(nframes_t cnt)
@@ -419,7 +415,7 @@
                        printf("WriteSource::rb_file_write() : could only 
process %d frames, %d were requested!\n", read, cnt);
                }
                
-               m_peaks.at(chan)->process(readbuffer[chan], read);
+               m_peak->process(chan, readbuffer[chan], read);
        }
 
        if (read > 0) {

Index: core/WriteSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/WriteSource.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- core/WriteSource.h  15 Aug 2007 20:07:42 -0000      1.18
+++ core/WriteSource.h  17 Sep 2007 18:14:30 -0000      1.19
@@ -62,7 +62,7 @@
 private:
        AbstractAudioWriter*    m_writer;
        ExportSpecification*    m_spec;
-       QList<Peak*>            m_peaks;
+       Peak*                   m_peak;
        
        DiskIO*         m_diskio;
        GDither         m_dither;

Index: traverso/songcanvas/AudioClipView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/AudioClipView.cpp,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -b -r1.87 -r1.88
--- traverso/songcanvas/AudioClipView.cpp       17 Sep 2007 13:40:35 -0000      
1.87
+++ traverso/songcanvas/AudioClipView.cpp       17 Sep 2007 18:14:30 -0000      
1.88
@@ -69,7 +69,7 @@
        create_clipinfo_string();
 
        m_waitingForPeaks = false;
-       m_progress = m_peakloadingcount = 0;
+       m_progress = 0;
        m_posIndicator = 0;
        m_song = m_clip->get_song();
        
@@ -258,19 +258,21 @@
        float pixeldata[channels][buffersize];
        float curvemixdown[buffersize];
        
+       Peak* peak = m_clip->get_peak();
+       if (!peak) {
+               PERROR("No Peak object available for clip %s", 
QS_C(m_clip->get_name()));
+               return;
+       }
+       
        // Load peak data for all channels, if no peakdata is returned
        // for a certain Peak object, schedule it for loading.
-       for (int chan=0; chan < channels; chan++) {
+       for (int chan=0; chan < channels; ++chan) {
 //             memset(buffers[chan], 0, buffersize * sizeof(peak_data_t));
                
                TimeRef clipstartoffset = m_clip->get_source_start_location();
                
-               Peak* peak = m_clip->get_peak_for_channel(chan);
-               if (!peak) {
-                       PERROR("No Peak object available for clip %s channel 
%d", QS_C(m_clip->get_name()), chan);
-                       return;
-               }
-               int availpeaks = peak->calculate_peaks( &buffers[chan],
+               int availpeaks = peak->calculate_peaks( chan,
+                                                       &buffers[chan],
                                                        microView ? 
m_song->get_hzoom() : m_song->get_hzoom() + 1,
                                                        (xstart * 
m_sv->scalefactor) + clipstartoffset.to_frame(audiodevice().get_sample_rate()),
                                                        microView ? 
peakdatacount : peakdatacount / 2);
@@ -280,9 +282,11 @@
                }
 
                if (availpeaks == Peak::NO_PEAK_FILE) {
-                       m_peakloadinglist.append(peak);
+                       connect(peak, SIGNAL(progress(int)), this, 
SLOT(update_progress_info(int)));
+                       connect(peak, SIGNAL(finished()), this, SLOT 
(peak_creation_finished()));
                        m_waitingForPeaks = true;
-                       m_peakloadingcount++;
+                       peak->start_peak_loading();
+                       return;
                }
                
                if (availpeaks == Peak::PERMANENT_FAILURE || availpeaks == 
Peak::NO_PEAKDATA_FOUND) {
@@ -291,11 +295,6 @@
        }
        
        
-       if (m_waitingForPeaks) {
-               start_peak_data_loading();
-               return;
-       }
-       
        int mixcurvedata = 0;
        int offset = (int)(m_clip->get_source_start_location() / 
m_sv->timeref_scalefactor);
        mixcurvedata |= curveView->get_vector(xstart + offset, pixelcount, 
curvemixdown);
@@ -695,24 +694,16 @@
 
 void AudioClipView::update_progress_info( int progress )
 {
-       PENTER4;
-       float prev = m_progress;
-       m_progress +=  ((float)progress / m_peakloadingcount);
-       
-       if ((int)m_progress > (int)prev) {
+//     if (progress > m_progress) {
+//     }
+       m_progress = progress;
                update(10, 0, 150, m_height);
-       }
 }
 
-void AudioClipView::peaks_creation_finished(Peak* peak)
+void AudioClipView::peak_creation_finished()
 {
-       m_peakloadinglist.removeAll(peak);
-       if (m_peakloadinglist.size() > 0) {
-               start_peak_data_loading();
-       } else {
                m_waitingForPeaks = false;
                update();
-       }
 }
 
 AudioClip * AudioClipView::get_clip( )
@@ -830,16 +821,6 @@
 }
 
 
-void AudioClipView::start_peak_data_loading()
-{
-       Peak* peak = m_peakloadinglist.first();
-       
-       connect(peak, SIGNAL(progress(int)), this, 
SLOT(update_progress_info(int)));
-       connect(peak, SIGNAL(finished(Peak*)), this, SLOT 
(peaks_creation_finished(Peak*)));
-       
-       peak->start_peak_loading();
-}
-
 void AudioClipView::hoverEnterEvent(QGraphicsSceneHoverEvent* event)
 {
        Q_UNUSED(event)

Index: traverso/songcanvas/AudioClipView.h
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/AudioClipView.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- traverso/songcanvas/AudioClipView.h 8 Jul 2007 19:45:07 -0000       1.29
+++ traverso/songcanvas/AudioClipView.h 17 Sep 2007 18:14:30 -0000      1.30
@@ -76,7 +76,6 @@
        AudioClip*      m_clip;
        Song*           m_song;
        CurveView*      curveView;
-       QList<Peak*>    m_peakloadinglist;
        PositionIndicator* m_posIndicator;
 
        QTimer m_recordingTimer;
@@ -121,7 +120,6 @@
 
        void draw_clipinfo_area(QPainter* painter, int xstart, int pixelcount);
        void draw_peaks(QPainter* painter, int xstart, int pixelcount);
-       void start_peak_data_loading();
        void create_brushes();
 
        friend class FadeView;
@@ -142,7 +140,7 @@
        
 private slots:
        void update_progress_info(int progress);
-       void peaks_creation_finished(Peak* peak);
+       void peak_creation_finished();
        void start_recording();
        void finish_recording();
        void update_recording();




reply via email to

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