[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src/core AbstractAudioReader.h MonoRea...
From: |
Ben Levitt |
Subject: |
[Traverso-commit] traverso/src/core AbstractAudioReader.h MonoRea... |
Date: |
Sat, 07 Jul 2007 22:00:13 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Ben Levitt <benjie> 07/07/07 22:00:13
Modified files:
src/core : AbstractAudioReader.h MonoReader.cpp
ResampleAudioReader.cpp ResampleAudioReader.h
SFAudioReader.cpp SFAudioReader.h
VorbisAudioReader.cpp VorbisAudioReader.h
Log message:
Fix vorbis reader, resample reader
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MonoReader.cpp?cvsroot=traverso&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
Patches:
Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- AbstractAudioReader.h 6 Jul 2007 22:13:32 -0000 1.1
+++ AbstractAudioReader.h 7 Jul 2007 22:00:12 -0000 1.2
@@ -41,7 +41,7 @@
virtual bool is_compressed() = 0;
int read_from(audio_sample_t* dst, nframes_t start, nframes_t cnt);
virtual bool seek(nframes_t start) = 0;
- virtual int read(audio_sample_t* dst, nframes_t cnt) = 0;
+ virtual int read(audio_sample_t* dst, int sampleCount) = 0;
static AbstractAudioReader* create_audio_reader(QString filename);
static AbstractAudioReader* create_resampled_audio_reader(QString
filename);
Index: MonoReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MonoReader.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- MonoReader.cpp 6 Jul 2007 22:13:32 -0000 1.18
+++ MonoReader.cpp 7 Jul 2007 22:00:13 -0000 1.19
@@ -155,6 +155,7 @@
nread /= m_audioReader->get_num_channels();
/* stride through the interleaved data */
+ // FIXME: deinterlace in AudioReader Classes instead of here
for (int32_t n = 0; n < nread; ++n) {
dst[n] = *ptr;
Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- ResampleAudioReader.cpp 6 Jul 2007 22:13:32 -0000 1.1
+++ ResampleAudioReader.cpp 7 Jul 2007 22:00:13 -0000 1.2
@@ -126,37 +126,40 @@
//
-int ResampleAudioReader::read(audio_sample_t* dst, nframes_t cnt)
+int ResampleAudioReader::read(audio_sample_t* dst, int sampleCount)
{
Q_ASSERT(m_realReader);
if (audiodevice().get_sample_rate() == m_realReader->get_rate()) {
- return m_realReader->read(dst, cnt);
+ return m_realReader->read(dst, sampleCount);
}
- nframes_t fileCnt = song_to_file_frame(cnt) + 4;
+ // The +1 means decode a tiny bit extra from the file to make sure we
can get enough resampled data
+ nframes_t fileCnt = (song_to_file_frame(sampleCount /
get_num_channels()) +1) * get_num_channels();
// make sure that the reusable m_fileBuffer is big enough for this read
if (m_fileBufferLength < fileCnt) {
if (m_fileBuffer) {
delete m_fileBuffer;
}
- m_fileBuffer = new audio_sample_t[fileCnt * get_num_channels()];
+ m_fileBuffer = new audio_sample_t[fileCnt];
m_fileBufferLength = fileCnt;
}
- if (cnt) printf("nextFrame = %lu, fileCnt = %lu\n", m_nextFrame,
fileCnt);
int samplesRead;
- samplesRead = m_realReader->read_from(m_fileBuffer, m_nextFrame,
fileCnt);
- if (cnt) printf("samplesRead = %d\n", samplesRead);
- // FIXME: Why does samplesRead==0 when it shouldn't???
+ samplesRead = m_realReader->read(m_fileBuffer, fileCnt);
- m_nextFrame += samplesRead / get_num_channels();
+ if (samplesRead == fileCnt) {
+ m_nextFrame += sampleCount / get_num_channels();
+ }
+ else {
+ m_nextFrame += file_to_song_frame(samplesRead) /
get_num_channels();
+ }
m_srcData.data_in = m_fileBuffer;
m_srcData.input_frames = samplesRead / get_num_channels();
m_srcData.data_out = dst;
- m_srcData.output_frames = cnt;
+ m_srcData.output_frames = sampleCount / get_num_channels();
m_srcData.src_ratio = (double) audiodevice().get_sample_rate() /
m_realReader->get_rate();
src_set_ratio(m_srcState, m_srcData.src_ratio);
Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- ResampleAudioReader.h 6 Jul 2007 22:13:32 -0000 1.1
+++ ResampleAudioReader.h 7 Jul 2007 22:00:13 -0000 1.2
@@ -37,7 +37,7 @@
int get_rate();
bool is_compressed();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, nframes_t cnt);
+ int read(audio_sample_t* dst, int sampleCount);
// Shouldn't ever actually get called
static bool can_decode(QString filename) {return false;}
Index: SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- SFAudioReader.cpp 6 Jul 2007 22:13:32 -0000 1.1
+++ SFAudioReader.cpp 7 Jul 2007 22:00:13 -0000 1.2
@@ -132,11 +132,13 @@
}
-int SFAudioReader::read(audio_sample_t* dst, nframes_t cnt)
+int SFAudioReader::read(audio_sample_t* dst, int sampleCount)
{
Q_ASSERT(m_sf);
- int samplesRead = sf_read_float (m_sf, dst, cnt);
+ int samplesRead = sf_read_float (m_sf, dst, sampleCount);
+
+ // FIXME: deinterlace here instead of in MonoReader
m_nextFrame += samplesRead / get_num_channels();
Index: SFAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- SFAudioReader.h 6 Jul 2007 22:13:32 -0000 1.1
+++ SFAudioReader.h 7 Jul 2007 22:00:13 -0000 1.2
@@ -37,7 +37,7 @@
int get_rate();
bool is_compressed();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, nframes_t cnt);
+ int read(audio_sample_t* dst, int sampleCount);
static bool can_decode(QString filename);
Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- VorbisAudioReader.cpp 6 Jul 2007 22:13:32 -0000 1.1
+++ VorbisAudioReader.cpp 7 Jul 2007 22:00:13 -0000 1.2
@@ -37,17 +37,19 @@
VorbisAudioReader::VorbisAudioReader(QString filename)
: AbstractAudioReader(filename)
{
- m_file = fopen(QFile::encodeName(filename), "r");
+ m_file = fopen(QFile::encodeName(filename).data(), "rb");
if (!m_file) {
PERROR("Couldn't open file %s.", QS_C(filename));
return;
}
- if (ov_open(m_file, &m_vf, NULL, 0) < 0) {
+ if (ov_open(m_file, &m_vf, 0, 0) < 0) {
PERROR("Input does not appear to be an Ogg bitstream.");
+ fclose(m_file);
return;
}
+ ov_pcm_seek(&m_vf, 0);
m_vi = ov_info(&m_vf,-1);
}
@@ -56,14 +58,13 @@
{
if (m_file) {
ov_clear(&m_vf);
- fclose(m_file);
}
}
bool VorbisAudioReader::can_decode(QString filename)
{
- FILE* file = fopen(QFile::encodeName(filename), "r");
+ FILE* file = fopen(QFile::encodeName(filename).data(), "rb");
if (!file) {
PERROR("Could not open file: %s.", QS_C(filename));
return false;
@@ -77,7 +78,6 @@
}
ov_clear(&of);
- fclose(file);
return true;
}
@@ -95,7 +95,7 @@
int VorbisAudioReader::get_length()
{
if (m_file) {
- return ov_pcm_total(&m_vf, -1) / get_num_channels();
+ return ov_pcm_total(&m_vf, -1);
}
return 0;
}
@@ -124,9 +124,9 @@
if (start >= get_length()) {
return false;
}
- //printf("seek to %lu\n", start);
- if (ov_pcm_seek(&m_vf, start) < 0) {
- PERROR("VorbisAudioReader: could not seek to frame %d within
%s", start, QS_C(m_fileName));
+
+ if (int result = ov_pcm_seek(&m_vf, start) < 0) {
+ PERROR("VorbisAudioReader: could not seek to frame %d within %s
(%d)", start, QS_C(m_fileName), result);
return false;
}
@@ -136,40 +136,42 @@
}
-int VorbisAudioReader::read(audio_sample_t* dst, nframes_t cnt)
+int VorbisAudioReader::read(audio_sample_t* dst, int sampleCount)
{
Q_ASSERT(m_file);
+ nframes_t totalRead = 0;
+
+ while (totalRead < sampleCount) {
audio_sample_t** tmp;
int bs;
-
- int samplesRead = ov_read_float (&m_vf, &tmp, cnt, &bs);
+ int samplesRead = ov_read_float(&m_vf, &tmp, (sampleCount -
totalRead) / get_num_channels(), &bs);
if (samplesRead == OV_HOLE) {
PERROR("VorbisAudioReader: OV_HOLE");
// recursive new try
- return read(dst, cnt);
+ return read(dst, sampleCount);
}
else if (samplesRead == 0) {
/* EOF */
- return 0;
+ break;
} else if (samplesRead < 0) {
/* error in the stream. */
- return 0;
+ break;
}
- int frames = samplesRead/get_num_channels();
+ // FIXME: Instead of interlacing here, deinterlace in other
AudioReaders!! (since we deinterlace later anyway)
+ int frames = samplesRead;
for (int f=0; f < frames; f++) {
for (int c=0; c < get_num_channels(); c++) {
- dst[f * get_num_channels() + c] = tmp[c][f];
+ dst[totalRead + f * get_num_channels() + c] =
tmp[c][f];
}
}
+ totalRead += samplesRead * get_num_channels();
+ }
- //printf("SFAudioReader: cnt = %lu, samplesRead = %d, length = %lu\n",
cnt, samplesRead, get_length());
-
- // m_nextFrame currently exists just for debugging
- m_nextFrame += frames;
+ m_nextFrame += totalRead / get_num_channels();
- return samplesRead;
+ return totalRead;
}
Index: VorbisAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- VorbisAudioReader.h 6 Jul 2007 22:13:32 -0000 1.1
+++ VorbisAudioReader.h 7 Jul 2007 22:00:13 -0000 1.2
@@ -39,7 +39,7 @@
int get_rate();
bool is_compressed();
bool seek(nframes_t start);
- int read(audio_sample_t* dst, nframes_t cnt);
+ int read(audio_sample_t* dst, int sampleCount);
static bool can_decode(QString filename);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso/src/core AbstractAudioReader.h MonoRea...,
Ben Levitt <=