[Top][All Lists]
[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
- [Traverso-commit] traverso/src audiofileio/audiofileio.pro audiof...,
Remon Sijrier <=