[Top][All Lists]
[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: |
Wed, 19 Sep 2007 20:27:47 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Remon Sijrier <r_sijrier> 07/09/19 20:27:47
Modified files:
src/audiofileio/decode: AbstractAudioReader.h
ResampleAudioReader.cpp
src/core : ReadSource.cpp
Log message:
* due rounding issues, the length of the ResampledAudioReader can
differ slightly with different output rates. So always fetch the length of the
reader when changing the output rate!
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.h?cvsroot=traverso&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.58&r2=1.59
Patches:
Index: audiofileio/decode/AbstractAudioReader.h
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- audiofileio/decode/AbstractAudioReader.h 18 Sep 2007 19:15:20 -0000
1.12
+++ audiofileio/decode/AbstractAudioReader.h 19 Sep 2007 20:27:46 -0000
1.13
@@ -100,6 +100,7 @@
delete [] readBuffer;
}
readBuffer = 0;
+ readBufferSize = 0;
}
void delete_resample_buffers() {
@@ -112,6 +113,7 @@
delete [] resampleBuffer;
}
resampleBuffer = 0;
+ resampleBufferSize = 0;
}
};
Index: audiofileio/decode/ResampleAudioReader.cpp
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- audiofileio/decode/ResampleAudioReader.cpp 18 Sep 2007 15:52:18 -0000
1.11
+++ audiofileio/decode/ResampleAudioReader.cpp 19 Sep 2007 20:27:46 -0000
1.12
@@ -147,6 +147,7 @@
}
m_outputRate = rate;
m_nframes = file_to_resampled_frame(m_reader->get_nframes());
+ m_length = TimeRef(m_nframes, m_outputRate);
}
@@ -161,7 +162,7 @@
}
reset();
-
+// printf("ResampleAudioReader::seek_private: start: %d\n",
resampled_to_file_frame(start));
return m_reader->seek(resampled_to_file_frame(start));
}
@@ -264,7 +265,7 @@
framesRead = get_nframes() - m_readPos;
}
- //printf("framesRead: %lu of %lu (overflow: %lu) (at: %lu of %lu)\n",
framesRead, frameCount, m_overflowUsed, m_readPos + framesRead, get_nframes());
+// printf("framesRead: %lu of %lu (overflow: %lu) (at: %lu of %lu)\n",
framesRead, frameCount, m_overflowUsed, m_readPos /*+ framesRead*/,
get_nframes());
return framesRead;
}
@@ -272,17 +273,15 @@
nframes_t ResampleAudioReader::resampled_to_file_frame(nframes_t frame)
{
- Q_ASSERT(m_reader);
-
- return (nframes_t)(frame * ((double) m_rate / m_outputRate));
+ TimeRef location(frame, m_outputRate);
+ return location.to_frame(m_rate);
}
nframes_t ResampleAudioReader::file_to_resampled_frame(nframes_t frame)
{
- Q_ASSERT(m_reader);
-
- return (nframes_t)(frame * ((double) m_outputRate / m_rate));
+ TimeRef location(frame, m_rate);
+ return location.to_frame(m_outputRate);
}
void ResampleAudioReader::create_overflow_buffers()
Index: core/ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- core/ReadSource.cpp 17 Sep 2007 13:40:34 -0000 1.58
+++ core/ReadSource.cpp 19 Sep 2007 20:27:46 -0000 1.59
@@ -271,6 +271,11 @@
ResampleAudioReader* reader =
dynamic_cast<ResampleAudioReader*>(m_audioReader);
if (reader) {
reader->set_output_rate(rate);
+ // The length could have become slightly smaller/larger due
+ // rounding issues involved with converting to one samplerate
to another.
+ // Should be at the order of one sample at most, but for
reading purposes we
+ // need sample accurate information!
+ m_length = reader->get_length();
}
}
@@ -282,11 +287,6 @@
#endif
int rate = audiodevice().get_sample_rate();
- ResampleAudioReader* reader =
dynamic_cast<ResampleAudioReader*>(m_audioReader);
- if (reader) {
- rate = reader->get_output_rate();
- }
-
nframes_t result = m_audioReader->read_from(buffer,
start.to_frame(rate), cnt);
#if defined (profile)
@@ -380,7 +380,6 @@
m_rbRelativeFileReadPos += advance;
} else {
- printf("calling start_resync\n");
TimeRef synclocation = start +
m_clip->get_track_start_location() + m_clip->get_source_start_location();
start_resync(synclocation);
return 0;
@@ -454,7 +453,7 @@
{
// Do nothing if we passed the lenght of the AudioFile.
if (m_rbFileReadPos >= m_length) {
-// printf("returning, m_rbFileReadPos > m_length! (%d > %d)\n",
m_rbFileReadPos, m_source->m_length);
+// printf("returning, m_rbFileReadPos > m_length! (%d > %d)\n",
m_rbFileReadPos.to_frame(get_rate()), m_audioReader->get_nframes());
if (m_syncInProgress) {
finish_resync();
}
@@ -503,7 +502,7 @@
void ReadSource::start_resync(TimeRef& position)
{
- printf("starting resync!\n");
+// printf("starting resync!\n");
m_syncPos = position;
m_rbReady = 0;
m_needSync = 1;
@@ -511,7 +510,7 @@
void ReadSource::finish_resync()
{
- printf("sync finished\n");
+// printf("sync finished\n");
m_needSync = 0;
m_bufferUnderRunDetected = 0;
m_rbReady = 1;
@@ -574,6 +573,8 @@
{
int freespace = m_buffers.at(0)->write_space();
+// printf("m_rbFileReadPos, m_length %d, %d\n",
m_rbFileReadPos.to_frame(get_rate()), m_length.to_frame(get_rate()));
+
if (m_rbFileReadPos >= m_length) {
m_bufferstatus->fillStatus = 100;
freespace = 0;