traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src/core Peak.cpp Peak.h


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src/core Peak.cpp Peak.h
Date: Mon, 15 Oct 2007 18:07:52 +0000

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

Modified files:
        src/core       : Peak.cpp Peak.h 

Log message:
        * Qt 4.4 has a new feature: QFile::map(), which is faster then plain 
file reads.
        Make use of this feature when compiled against Qt 4.4 or later.
        * Use QFile instead of FILE for reading :D

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.62&r2=1.63
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.22&r2=1.23

Patches:
Index: Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -b -r1.62 -r1.63
--- Peak.cpp    12 Oct 2007 19:38:51 -0000      1.62
+++ Peak.cpp    15 Oct 2007 18:07:51 -0000      1.63
@@ -72,8 +72,6 @@
                
                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);
@@ -101,15 +99,9 @@
        }
        
        foreach(ChannelData* data, m_channelData) {
-               if (data->file) {
-                       fclose(data->file);
-               }
-               
-               if (data->normFile) {
-                       fclose(data->normFile);
+               if (data->normFile.isOpen()) {
                        QFile::remove(data->normFileName);
                }
-               
                delete data;
        }
 }
@@ -126,13 +118,21 @@
        Q_ASSERT(m_source);
        
        foreach(ChannelData* data, m_channelData) {
-               data->file = fopen(data->fileName.toUtf8().data(),"rb");
                
-               if (! data->file) {
+               data->file.setFileName(data->fileName.toUtf8().data());
+               
+               if (! data->file.open(QIODevice::ReadOnly)) {
                        PERROR("Couldn't open peak file for reading! (%s)", 
data->fileName.toAscii().data());
                        return -1;
                }
                
+#if QT_VERSION >= 0x040400
+               data->memory = data->file.map(0, data->file.size());
+               if (data->memory) {
+                       PMESG3("Peak:: sucessfully mapped data into memory 
(%s)", QS_C(data->fileName));
+               }
+#endif
+               
                QFileInfo file(m_source->get_filename());
                QFileInfo peakFile(data->fileName);
                
@@ -147,10 +147,10 @@
                }
                
                
-               fseek(data->file, 0, SEEK_SET);
+               data->file.seek(0);
        
-               fread(data->headerdata.label, sizeof(data->headerdata.label), 
1, data->file);
-               fread(data->headerdata.version, 
sizeof(data->headerdata.version), 1, data->file);
+               data->file.read(data->headerdata.label, 
sizeof(data->headerdata.label));
+               data->file.read((char*)data->headerdata.version, 
sizeof(data->headerdata.version));
        
                if (    (data->headerdata.label[0]!='T') ||
                        (data->headerdata.label[1]!='R') ||
@@ -161,15 +161,14 @@
                        (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(data->file);
-                               data->file = 0;
+                               data->file.close();
                                return -1;
                }
                
-               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->file.read((char*)data->headerdata.peakDataLevelOffsets, 
sizeof(data->headerdata.peakDataLevelOffsets));
+               data->file.read((char*)data->headerdata.peakDataSizeForLevel, 
sizeof(data->headerdata.peakDataSizeForLevel));
+               data->file.read((char*)&data->headerdata.normValuesDataOffset, 
sizeof(data->headerdata.normValuesDataOffset));
+               data->file.read((char*)&data->headerdata.peakDataOffset, 
sizeof(data->headerdata.peakDataOffset));
                
                data->peakreader = new PeakDataReader(data);
                data->peakdataDecodeBuffer = new DecodeBuffer;
@@ -184,7 +183,7 @@
 {
        PENTER;
        
-       fseek (data->file, 0, SEEK_SET);
+       data->file.seek(0);
 
        data->headerdata.label[0] = 'T';
        data->headerdata.label[1] = 'R';
@@ -195,12 +194,12 @@
        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);
+       data->file.write((char*)data->headerdata.label, 
sizeof(data->headerdata.label));
+       data->file.write((char*)data->headerdata.version, 
sizeof(data->headerdata.version));
+       data->file.write((char*)data->headerdata.peakDataLevelOffsets, 
sizeof(data->headerdata.peakDataLevelOffsets));
+       data->file.write((char*)data->headerdata.peakDataSizeForLevel, 
sizeof(data->headerdata.peakDataSizeForLevel));
+       data->file.write((char*) &data->headerdata.normValuesDataOffset, 
sizeof(data->headerdata.normValuesDataOffset));
+       data->file.write((char*) &data->headerdata.peakDataOffset, 
sizeof(data->headerdata.peakDataOffset));
        
        return 1;
 }
@@ -371,18 +370,18 @@
                data->normFileName.append(".norm");
                
                // Create read/write enabled file
-               data->file = fopen(data->fileName.toUtf8().data(),"wb+");
+               data->file.setFileName(data->fileName);
                
-               if (! data->file) {
+               if (! data->file.open(QIODevice::ReadWrite)) {
                        PWARN("Couldn't open peak file for writing! (%s)", 
data->fileName.toAscii().data());
                        m_permanentFailure  = true;
                        return -1;
                }
                
                // Create the temporary normalization data file
-               data->normFile = fopen(data->normFileName.toUtf8().data(), 
"wb+");
+               data->normFile.setFileName(data->normFileName);
                
-               if (! data->normFile) {
+               if (! data->normFile.open(QIODevice::ReadWrite)) {
                        PWARN("Couldn't open normalization data file for 
writing! (%s)", data->normFileName.toAscii().data());
                        m_permanentFailure  = true;
                        return -1;
@@ -398,7 +397,7 @@
                                        sizeof(data->headerdata.peakDataOffset);
                                        
                // Now seek to the start position, so we can write the peakdata 
to it in the process function
-               fseek(data->file, data->headerdata.peakDataOffset, SEEK_SET);
+               data->file.seek(data->headerdata.peakDataOffset);
                
                data->pd = new Peak::ProcessData;
                data->pd->stepSize = TimeRef(1, rate);
@@ -417,9 +416,9 @@
                
                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);
+                       data->file.write((char*)&peakvalue, 
sizeof(peak_data_t));
                        peakvalue = (peak_data_t)(-1 * data->pd->peakLowerValue 
* MAX_DB_VALUE);
-                       fwrite(&peakvalue, sizeof(peak_data_t), 1, data->file);
+                       data->file.write((char*)&peakvalue, 
sizeof(peak_data_t));
                        data->pd->processBufferSize += 2;
                }
                
@@ -434,14 +433,14 @@
                }
                
                
-               fseek(data->file, data->headerdata.peakDataOffset, SEEK_SET);
+               data->file.seek(data->headerdata.peakDataOffset);
                
                // 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), 
data->pd->processBufferSize, data->file);
+               int read = data->file.read((char*)saveBuffer, 
sizeof(peak_data_t) * data->pd->processBufferSize) / sizeof(peak_data_t);
                
                if (read != data->pd->processBufferSize) {
                        PERROR("couldn't read in all saved data?? (%d read)", 
read);
@@ -474,18 +473,18 @@
                        while (count < prevLevelSize);
                }
                
-               fseek(data->file, data->headerdata.peakDataOffset, SEEK_SET);
+               data->file.seek(data->headerdata.peakDataOffset);
                
-               int written = fwrite(saveBuffer, sizeof(peak_data_t), 
totalBufferSize, data->file);
+               int written = data->file.write((char*)saveBuffer, 
sizeof(peak_data_t) * totalBufferSize) / sizeof(peak_data_t);
                
                if (written != totalBufferSize) {
                        PERROR("could not write complete buffer! (only %d)", 
written);
        //              return -1;
                }
                
-               fseek(data->normFile, 0, SEEK_SET);
+               data->normFile.seek(0);
                
-               read = fread(saveBuffer, sizeof(audio_sample_t), 
data->pd->normDataCount, data->normFile);
+               read = data->normFile.read((char*)saveBuffer, 
sizeof(audio_sample_t) * data->pd->normDataCount) / sizeof(audio_sample_t);
                
                if (read != data->pd->normDataCount) {
                        PERROR("Could not read in all (%d) norm. data, only 
%d", data->pd->normDataCount, read);
@@ -493,19 +492,17 @@
                
                data->headerdata.normValuesDataOffset = 
data->headerdata.peakDataOffset + totalBufferSize;
                
-               fclose(data->normFile);
-               data->normFile = NULL;
+               data->normFile.close();
                
                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, 
data->file);
+               written = data->file.write((char*)saveBuffer, 
sizeof(audio_sample_t) * read) / sizeof(audio_sample_t);
                
                write_header(data);
                
-               fclose(data->file);
-               data->file = 0;
+               data->file.close();
                
                delete [] saveBuffer;
                delete data->pd;
@@ -548,10 +545,10 @@
                        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, data->file);
+                       int written = data->file.write((char*)peakbuffer, 
sizeof(peak_data_t) * 2) / sizeof(peak_data_t);
                        
                        if (written != 2) {
-                               PWARN("couldnt write data, only (%d)", written);
+                               PWARN("couldnt write peak data, only (%d)", 
written);
                        }
 
                        pd->peakUpperValue = 0.0;
@@ -562,10 +559,10 @@
                }
                
                if (pd->normProcessedFrames == NORMALIZE_CHUNK_SIZE) {
-                       int written = fwrite(&pd->normValue, 
sizeof(audio_sample_t), 1, data->normFile);
+                       int written = 
data->normFile.write((char*)&pd->normValue, sizeof(audio_sample_t)) / 
sizeof(audio_sample_t);
                        
                        if (written != 1) {
-                               PWARN("couldnt write data, only (%d)", written);
+                               PWARN("couldnt write norm data, only (%d)", 
written);
                        }
  
                        pd->normValue = 0.0;
@@ -670,7 +667,7 @@
 audio_sample_t Peak::get_max_amplitude(TimeRef startlocation, TimeRef 
endlocation)
 {
        foreach(ChannelData* data, m_channelData) {
-               if (!data->file || !m_peaksAvailable) {
+               if (!data->file.isOpen() || !m_peaksAvailable) {
                        return 0.0f;
                }
        }
@@ -718,9 +715,9 @@
        count = endpos - startpos;
        
        foreach(ChannelData* data, m_channelData) {
-               fseek(data->file, data->headerdata.normValuesDataOffset + 
(startpos * sizeof(audio_sample_t)), SEEK_SET);
+               data->file.seek(data->headerdata.normValuesDataOffset + 
(startpos * sizeof(audio_sample_t)));
        
-               int read = fread(readbuffer, sizeof(audio_sample_t), count, 
data->file);
+               int read = data->file.read((char*)readbuffer, 
sizeof(audio_sample_t) * count) / sizeof(audio_sample_t);
        
                if (read != (int)count) {
                        printf("could only read %d, %d requested\n", read, 
count);
@@ -865,8 +862,7 @@
 PeakDataReader::PeakDataReader(Peak::ChannelData* data)
 {
        m_d = data;
-       fseek (m_d->file, 0, SEEK_END);
-       m_nframes = ftell (m_d->file);
+       m_nframes = m_d->file.size();
 }
 
 
@@ -885,17 +881,20 @@
 bool PeakDataReader::seek(nframes_t start)
 {
        if (m_readPos != start) {
-               Q_ASSERT(m_d->file);
+               Q_ASSERT(m_d->file.isOpen());
        
        
                if (start >= m_nframes) {
                        return false;
                }
        
-               if (fseek (m_d->file, start, SEEK_SET) < 0) {
+               // only seek if we didn't mmap 
+               if (!m_d->memory) {
+                       if (!m_d->file.seek(start)) {
                        PERROR("PeakDataReader: could not seek to data point %d 
within %s", start, m_d->fileName.toUtf8().data());
                        return false;
                }
+               }
        
                m_readPos = start;
        }
@@ -913,11 +912,18 @@
        // Make sure the read buffer is big enough for this read
        buffer->check_buffers_capacity(count*2, 1);
        
-       Q_ASSERT(m_d->file);
+       Q_ASSERT(m_d->file.isOpen());
 
-       int framesRead = fread((void*)buffer->readBuffer, sizeof(peak_data_t), 
count, m_d->file);
+       int framesRead = 0;
+       peak_data_t* readbuffer;
 
-       peak_data_t* readbuffer = (peak_data_t*)(buffer->readBuffer);
+       if (m_d->memory) {
+               readbuffer = (peak_data_t*)(m_d->memory + 
m_readPos*sizeof(peak_data_t));
+               framesRead = count;
+       } else {
+               framesRead = m_d->file.read((char*)buffer->readBuffer, 
sizeof(peak_data_t) * count) / sizeof(peak_data_t);
+               readbuffer = (peak_data_t*)(buffer->readBuffer);
+       }
 
        for (int f = 0; f < framesRead; f++) {
                buffer->destination[0][f] = float(readbuffer[f]);

Index: Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- Peak.h      28 Sep 2007 19:12:05 -0000      1.22
+++ Peak.h      15 Oct 2007 18:07:52 -0000      1.23
@@ -27,6 +27,7 @@
 #include <QMutex>
 #include <QQueue>
 #include <QWaitCondition>
+#include <QFile>
 
 #include "defines.h"
 
@@ -157,14 +158,18 @@
        };
 
        struct ChannelData {
+               ChannelData() {
+                       memory = 0;
+               }
                QString         fileName;
                QString         normFileName;
-               FILE*           file;
-               FILE*           normFile;
+               QFile           file;
+               QFile           normFile;
                PeakHeaderData  headerdata;
                PeakDataReader* peakreader;
                ProcessData*    pd;
                DecodeBuffer*   peakdataDecodeBuffer;
+               uchar*          memory;
        };
        
        QList<ChannelData* >    m_channelData;




reply via email to

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