[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...
From: |
Ben Levitt |
Subject: |
[Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr... |
Date: |
Thu, 19 Jul 2007 04:05:58 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Ben Levitt <benjie> 07/07/19 04:05:58
Modified files:
src/core : AbstractAudioReader.cpp AbstractAudioReader.h
FlacAudioReader.cpp FlacAudioReader.h
MadAudioReader.cpp MadAudioReader.h Peak.cpp
ResampleAudioReader.cpp ResampleAudioReader.h
SFAudioReader.cpp VorbisAudioReader.cpp
core.pro
Log message:
- fix mp3 playing
- move m_readPos updating on seek() into AbstractAudioReader::seek()
(was only in
read_from() which meant that it never got updated on a direct seek()
call.)
- stop Peak::calculate_peaks() from crashing on a negative pixelcount
(but why is it getting
negative pixelcounts? hmmm...)
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.cpp?cvsroot=traverso&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FlacAudioReader.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MadAudioReader.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/core.pro?cvsroot=traverso&r1=1.34&r2=1.35
Patches:
Index: AbstractAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- AbstractAudioReader.cpp 18 Jul 2007 18:15:20 -0000 1.9
+++ AbstractAudioReader.cpp 19 Jul 2007 04:05:57 -0000 1.10
@@ -22,7 +22,7 @@
#include "AbstractAudioReader.h"
#include "SFAudioReader.h"
#include "FlacAudioReader.h"
-//#include "MadAudioReader.h"
+#include "MadAudioReader.h"
#include "VorbisAudioReader.h"
#include "ResampleAudioReader.h"
@@ -47,6 +47,13 @@
}
+bool AbstractAudioReader::seek(nframes_t start)
+{
+ m_readPos = start;
+ return true;
+}
+
+
// Read cnt frames starting at start from the AudioReader, into dst
// uses seek() and read() from AudioReader subclass
nframes_t AbstractAudioReader::read_from(audio_sample_t** buffer, nframes_t
start, nframes_t count)
@@ -59,17 +66,19 @@
// printf("starting seek\n");
if (!seek(start)) {
return 0;
- } else {
- m_readPos = start;
}
}
-// printf("read_from:: after_seek from %d, framepos is %d\n", start,
m_readPos);
+ if (count) {
+ // printf("read_from:: after_seek from %d, framepos is %d\n",
start, m_readPos);
nframes_t framesRead = read(buffer, count);
m_readPos += framesRead;
return framesRead;
+ }
+
+ return 0;
}
@@ -87,9 +96,9 @@
else if (SFAudioReader::can_decode(filename)) {
newReader = new SFAudioReader(filename);
}
-// else if (MadAudioReader::can_decode(filename)) {
-// newReader = new MadAudioReader(filename);
-// }
+ else if (MadAudioReader::can_decode(filename)) {
+ newReader = new MadAudioReader(filename);
+ }
else {
return 0;
}
Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- AbstractAudioReader.h 18 Jul 2007 18:15:20 -0000 1.8
+++ AbstractAudioReader.h 19 Jul 2007 04:05:57 -0000 1.9
@@ -41,7 +41,7 @@
virtual nframes_t get_length() = 0;
virtual int get_rate() = 0;
nframes_t read_from(audio_sample_t** buffer, nframes_t start, nframes_t
count);
- virtual bool seek(nframes_t start) = 0;
+ virtual bool seek(nframes_t start);
virtual nframes_t read(audio_sample_t** buffer, nframes_t frameCount) =
0;
static AbstractAudioReader* create_audio_reader(const QString&
filename);
Index: FlacAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- FlacAudioReader.cpp 18 Jul 2007 18:15:21 -0000 1.6
+++ FlacAudioReader.cpp 19 Jul 2007 04:05:57 -0000 1.7
@@ -384,6 +384,8 @@
return false;
}
+ AbstractAudioReader::seek(start);
+
return true;
}
Index: FlacAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/FlacAudioReader.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
Index: MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- MadAudioReader.cpp 18 Jul 2007 18:15:21 -0000 1.7
+++ MadAudioReader.cpp 19 Jul 2007 04:05:58 -0000 1.8
@@ -447,10 +447,13 @@
{
public:
MadDecoderPrivate()
- : outputBuffer(0),
- outputPointer(0),
- outputBufferEnd(0)
{
+ outputBuffers = 0;
+ outputPos = 0;
+ outputSize = 0;
+ overflowSize = 0;
+ overflowStart = 0;
+
mad_header_init( &firstHeader );
}
@@ -460,13 +463,13 @@
bool bOutputFinished;
- audio_sample_t* outputBuffer;
- audio_sample_t* outputPointer;
- audio_sample_t* outputBufferEnd;
-
- audio_sample_t* overflowBuffer;
- int overflowSize;
- int overflowStart;
+ audio_sample_t** outputBuffers;
+ nframes_t outputPos;
+ nframes_t outputSize;
+
+ QVector<audio_sample_t*> overflowBuffers;
+ nframes_t overflowSize;
+ nframes_t overflowStart;
// the first frame header for technical info
mad_header firstHeader;
@@ -502,9 +505,9 @@
m_channels = 2;
}
- d->overflowBuffer = new audio_sample_t[1152 * get_num_channels()];
- d->overflowSize = 0;
- d->overflowStart = 0;
+ for (int c = 0; c < m_channels; c++) {
+ d->overflowBuffers.append(new audio_sample_t[1152]);
+ }
seek(0);
}
@@ -515,7 +518,10 @@
if (d) {
d->handle->cleanup();
delete d->handle;
- delete d->overflowBuffer;
+ while (d->overflowBuffers.size()) {
+ delete d->overflowBuffers.back();
+ d->overflowBuffers.pop_back();
+ }
delete d;
}
}
@@ -578,10 +584,11 @@
return (layer == MAD_LAYER_III);
}
}
- else
+ else {
break;
}
}
+ }
//PERROR("unsupported format: %s",QS_C(filename));
@@ -641,7 +648,7 @@
// seekPosition to seek after frame i
unsigned int frame = static_cast<unsigned int>(posSecs / mp3FrameSecs);
- nframes_t frameOffset = (nframes_t)(start - (frame * mp3FrameSecs *
get_rate() + 0.5)) * get_num_channels();
+ nframes_t frameOffset = (nframes_t)(start - (frame * mp3FrameSecs *
get_rate() + 0.5));
// Rob said: 29 frames is the theoretically max frame reservoir limit
(whatever that means...)
// it seems that mad needs at most 29 frames to get ready
@@ -686,12 +693,14 @@
d->overflowStart = 0;
d->overflowSize = 0;
+ AbstractAudioReader::seek(start);
+
// Seek to exact traverso frame, within this mp3 frame
if (frameOffset > 0) {
//printf("seekOffset: %lu (start: %lu)\n", frameOffset, start);
- d->outputBuffer = 0; // Zeros so that we write to overflow
- d->outputBufferEnd = 0;
- d->outputPointer = 0;
+ d->outputBuffers = 0; // Zeros so that we write to overflow
+ d->outputSize = 0;
+ d->outputPos = 0;
createPcmSamples(d->handle->madSynth);
d->overflowStart = frameOffset;
d->overflowSize -= frameOffset;
@@ -770,26 +779,30 @@
nframes_t MadAudioReader::read(audio_sample_t** buffer, nframes_t frameCount)
{
d->outputBuffers = buffer;
- d->bufferSize = frameCount
- d->bufferPos = 0;
+ d->outputSize = frameCount;
+ d->outputPos = 0;
bool bOutputBufferFull = false;
// Deal with existing overflow
if (d->overflowSize > 0) {
- if (d->overflowSize < sampleCount) {
+ if (d->overflowSize < frameCount) {
//printf("output all %d overflow samples\n",
d->overflowSize);
- memcpy(d->outputBuffer, d->overflowBuffer +
d->overflowStart, d->overflowSize * sizeof(audio_sample_t));
- d->outputPointer += d->overflowSize;
+ for (int c = 0; c < get_num_channels(); c++) {
+ memcpy(d->outputBuffers[c],
d->overflowBuffers[c] + d->overflowStart, d->overflowSize *
sizeof(audio_sample_t));
+ }
+ d->outputPos += d->overflowSize;
d->overflowSize = 0;
d->overflowStart = 0;
}
else {
- //printf("output %d overflow samples, returned from
overflow\n", sampleCount);
- memcpy(d->outputBuffer, d->overflowBuffer +
d->overflowStart, sampleCount * sizeof(audio_sample_t));
- d->overflowSize -= sampleCount;
- d->overflowStart += sampleCount;
- return sampleCount;
+ //printf("output %d overflow frames, returned from
overflow\n", frameCount);
+ for (int c = 0; c < get_num_channels(); c++) {
+ memcpy(d->outputBuffers[c],
d->overflowBuffers[c] + d->overflowStart, frameCount * sizeof(audio_sample_t));
+ }
+ d->overflowSize -= frameCount;
+ d->overflowStart += frameCount;
+ return frameCount;
}
}
@@ -798,7 +811,7 @@
// one mad_frame represents a mp3-frame which is always 1152
samples
// for us that means we need 1152 samples per channel of output
buffer
// for every frame
- if (d->outputPointer >= d->outputBufferEnd) {
+ if (d->outputPos >= d->outputSize) {
bOutputBufferFull = true;
}
else if (d->handle->decodeNextFrame()) {
@@ -818,70 +831,75 @@
}
}
- int samplesWritten = d->outputPointer - d->outputBuffer;
+ nframes_t framesWritten = d->outputPos;
// Pad end with zeros if necessary
// FIXME: This shouldn't be necessary! :P
// is get_length() reporting incorrectly?
// are we not outputting the last mp3-frame for some reason?
- int remainingSamplesRequested = sampleCount - samplesWritten;
- int remainingSamplesInFile = (get_length() - m_readPos) *
get_num_channels() - samplesWritten;
- if (remainingSamplesRequested > 0 && remainingSamplesInFile > 0) {
- int padLength = (remainingSamplesRequested >
remainingSamplesInFile) ? remainingSamplesInFile : remainingSamplesRequested;
- memset(d->outputPointer, 0, padLength * sizeof(audio_sample_t));
- samplesWritten += padLength;
- PERROR("padding: %d", padLength);
+ int remainingFramesRequested = frameCount - framesWritten;
+ int remainingFramesInFile = get_length() - (m_readPos + framesWritten);
+ if (remainingFramesRequested > 0 && remainingFramesInFile > 0) {
+ int padLength = (remainingFramesRequested >
remainingFramesInFile) ? remainingFramesInFile : remainingFramesRequested;
+ for (int c = 0; c < get_num_channels(); c++) {
+ //memset(d->outputBuffers[c] + framesWritten, 0,
padLength * sizeof(audio_sample_t));
+ }
+ framesWritten += padLength;
+ printf("padding: %d\n", padLength);
}
- // Truncate so we don't return too many samples
- else if (samplesWritten > remainingSamplesInFile) {
- PERROR("truncating by %d!", (samplesWritten -
remainingSamplesInFile)/get_num_channels());
- samplesWritten = remainingSamplesInFile;
+ // Truncate so we don't return too many frames
+ if (framesWritten > remainingFramesInFile) {
+ printf("truncating by %d!\n", framesWritten -
remainingFramesInFile);
+ framesWritten = remainingFramesInFile;
}
- //printf("at: %lu (total: %lu), request: %d (returned: %d)\n",
m_readPos, m_frames, sampleCount/get_num_channels(),
samplesWritten/get_num_channels());
+ //printf("at: %lu (total: %lu), request: %d (returned: %d)\n",
m_readPos + framesWritten, m_frames, frameCount, framesWritten);
- return samplesWritten;
+ return framesWritten;
}
bool MadAudioReader::createPcmSamples(mad_synth* synth)
{
+ audio_sample_t **writeBuffers = d->outputBuffers;
+ int offset = d->outputPos;
nframes_t nframes = synth->pcm.length;
bool overflow = false;
int i;
- if ((nframes + ((d->outputPointer - d->outputBuffer)/get_num_channels()
+ m_readPos)) > get_length()) {
- nframes = get_length() - ((d->outputPointer -
d->outputBuffer)/get_num_channels() + m_readPos);
- //printf("!!!nframes: %lu, length: %lu, current: %lu\n",
nframes, get_length(), (d->outputPointer - d->outputBuffer)/get_num_channels()
+ m_readPos);
+ if ((m_readPos + d->outputPos + nframes) > get_length()) {
+ nframes = get_length() - (m_readPos + offset);
+ //printf("!!!nframes: %lu, length: %lu, current: %lu\n",
nframes, get_length(), d->outputPos + m_readPos);
}
// now create the output
for (i = 0; i < nframes; i++) {
- if (overflow == false && d->outputPointer >=
d->outputBufferEnd) {
- d->outputPointer = d->overflowBuffer;
+ if (overflow == false && d->outputPos + i >= d->outputSize) {
+ writeBuffers = d->overflowBuffers.data();
+ offset = 0 - i;
overflow = true;
}
/* Left channel */
- *(d->outputPointer++) =
mad_f_todouble(synth->pcm.samples[0][i]);
+ writeBuffers[0][offset + i] =
mad_f_todouble(synth->pcm.samples[0][i]);
- /* Right channel. If the decoded stream is monophonic then
- * the right output channel is the same as the left one.
+ /* Right channel. If the decoded stream is monophonic then no
right channel
*/
if (synth->pcm.channels == 2) {
- *(d->outputPointer++) =
mad_f_todouble(synth->pcm.samples[1][i]);
+ writeBuffers[1][offset + i] =
mad_f_todouble(synth->pcm.samples[1][i]);
}
} // pcm conversion
if (overflow) {
- d->overflowSize = d->outputPointer - d->overflowBuffer;
+ d->overflowSize = i + offset;
d->overflowStart = 0;
- d->outputPointer = d->outputBufferEnd;
- //printf("written: %d (overflow: %u)\n", nframes *
synth->pcm.channels - d->overflowSize, d->overflowSize);
+ d->outputPos -= offset; // i was stored here when we switched
to writing to overflow
+ //printf("written: %d (overflow: %u)\n", nframes -
d->overflowSize, d->overflowSize);
}
else {
- //printf("written: %d\n", i * synth->pcm.channels);
+ d->outputPos += i;
+ //printf("written: %d (os=%lu)\n", i, d->overflowSize);
}
return true;
Index: MadAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/MadAudioReader.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
Index: Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- Peak.cpp 18 Jul 2007 13:13:06 -0000 1.37
+++ Peak.cpp 19 Jul 2007 04:05:58 -0000 1.38
@@ -219,6 +219,10 @@
}
}
+ if (pixelcount <= 0) {
+ return 1;
+ }
+
// #define profile
#if defined (profile)
Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- ResampleAudioReader.cpp 18 Jul 2007 20:07:34 -0000 1.10
+++ ResampleAudioReader.cpp 19 Jul 2007 04:05:58 -0000 1.11
@@ -140,11 +140,13 @@
Q_ASSERT(m_reader);
if (audiodevice().get_sample_rate() == (uint)m_reader->get_rate()) {
+ AbstractAudioReader::seek(start);
return m_reader->seek(start);
}
reset();
+ AbstractAudioReader::seek(start);
return m_reader->seek(song_to_file_frame(start));
}
Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- ResampleAudioReader.h 18 Jul 2007 18:15:22 -0000 1.7
+++ ResampleAudioReader.h 19 Jul 2007 04:05:58 -0000 1.8
@@ -40,7 +40,6 @@
bool seek(nframes_t start);
nframes_t read(audio_sample_t** buffer, nframes_t frameCount);
-
protected:
void init(int converter_type);
void reset();
Index: SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- SFAudioReader.cpp 18 Jul 2007 18:15:22 -0000 1.5
+++ SFAudioReader.cpp 19 Jul 2007 04:05:58 -0000 1.6
@@ -127,6 +127,8 @@
return false;
}
+ AbstractAudioReader::seek(start);
+
return true;
}
Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- VorbisAudioReader.cpp 18 Jul 2007 18:15:23 -0000 1.7
+++ VorbisAudioReader.cpp 19 Jul 2007 04:05:58 -0000 1.8
@@ -123,6 +123,8 @@
return false;
}
+ AbstractAudioReader::seek(start);
+
return true;
}
Index: core.pro
===================================================================
RCS file: /sources/traverso/traverso/src/core/core.pro,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- core.pro 18 Jul 2007 18:15:23 -0000 1.34
+++ core.pro 19 Jul 2007 04:05:58 -0000 1.35
@@ -55,8 +55,7 @@
FlacAudioReader.cpp \
ResampleAudioReader.cpp \
VorbisAudioReader.cpp \
-# MadAudioReader.cpp
-
+ MadAudioReader.cpp
HEADERS = precompile.h \
AudioClip.h \
AudioClipList.h \
@@ -105,8 +104,7 @@
FlacAudioReader.h \
ResampleAudioReader.h \
VorbisAudioReader.h \
-# MadAudioReader.h
-
+ MadAudioReader.h
macx{
QMAKE_LIBDIR += /usr/local/qt/lib
}
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/08
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/09
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/13
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/15
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/18
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr...,
Ben Levitt <=
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/20
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/24
- [Traverso-commit] traverso/src/core AbstractAudioReader.cpp Abstr..., Ben Levitt, 2007/07/25