[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: |
Thu, 27 Sep 2007 19:20:30 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Remon Sijrier <r_sijrier> 07/09/27 19:20:30
Modified files:
src/audiofileio/decode: AbstractAudioReader.h
ResampleAudioReader.cpp
ResampleAudioReader.h
src/core : ReadSource.cpp ReadSource.h
src/engine : defines.h
Log message:
* use ResampledAudioReader in ReadSource, not an AbstractAudioReader.
* add ability to (re)set the converter type for ResampledAudioReader
* small cleanup, some comments added
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/AbstractAudioReader.h?cvsroot=traverso&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/ResampleAudioReader.h?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.62&r2=1.63
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.h?cvsroot=traverso&r1=1.36&r2=1.37
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/defines.h?cvsroot=traverso&r1=1.23&r2=1.24
Patches:
Index: audiofileio/decode/AbstractAudioReader.h
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/AbstractAudioReader.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- audiofileio/decode/AbstractAudioReader.h 20 Sep 2007 16:04:27 -0000
1.15
+++ audiofileio/decode/AbstractAudioReader.h 27 Sep 2007 19:20:29 -0000
1.16
@@ -102,11 +102,6 @@
bool eof();
nframes_t pos();
- nframes_t read_from(DecodeBuffer* buffer, TimeRef& start, nframes_t
count) {
- return read_from(buffer, start.to_frame(m_rate), count);
- }
- bool seek(const TimeRef& start);
-
nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t
count);
bool seek(nframes_t start);
nframes_t read(DecodeBuffer* buffer, nframes_t frameCount);
Index: audiofileio/decode/ResampleAudioReader.cpp
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- audiofileio/decode/ResampleAudioReader.cpp 19 Sep 2007 20:27:46 -0000
1.12
+++ audiofileio/decode/ResampleAudioReader.cpp 27 Sep 2007 19:20:29 -0000
1.13
@@ -30,36 +30,33 @@
// On init, creates a child AudioReader for any filetype, and a samplerate
converter
-ResampleAudioReader::ResampleAudioReader(QString filename, int converter_type,
const QString& decoder)
+ResampleAudioReader::ResampleAudioReader(QString filename, const QString&
decoder)
: AbstractAudioReader(filename)
{
m_reader = AbstractAudioReader::create_audio_reader(filename, decoder);
if (!m_reader) {
PERROR("ResampleAudioReader: couldn't create AudioReader");
- return;
- }
-
+ m_channels = m_nframes = 0;
+ } else {
m_channels = m_reader->get_num_channels();
m_rate = m_reader->get_file_rate();
m_nframes = m_reader->get_nframes();
m_length = m_reader->get_length();
m_outputRate = m_rate;
+ }
+ m_isResampleAvailable = false;
m_overflowBuffers = 0;
m_overflowUsed = 0;
-
- init(converter_type);
}
ResampleAudioReader::~ResampleAudioReader()
{
- if (!m_reader) {
- return;
- }
-
+ if (m_reader) {
delete m_reader;
+ }
while (m_srcStates.size()) {
src_delete(m_srcStates.back());
@@ -90,33 +87,6 @@
}
}
-
-void ResampleAudioReader::init(int converter_type)
-{
- int error;
-
- for (int c = 0; c < m_reader->get_num_channels(); c++) {
- m_srcStates.append(src_new(converter_type, 1, &error));
- if (!m_srcStates[c]) {
- PERROR("ResampleAudioReader: couldn't create
libSampleRate SRC_STATE");
- delete m_reader;
- m_reader = 0;
- return;
- }
- m_srcStates.append(src_new(converter_type, 1, &error));
- if (!m_srcStates[c]) {
- PERROR("ResampleAudioReader: couldn't create
libSampleRate SRC_STATE");
- delete m_reader;
- m_reader = 0;
- return;
- }
- }
-
- reset();
- seek_private(0);
-}
-
-
// Clear the samplerateconverter to a clean state (used on seek)
void ResampleAudioReader::reset()
{
@@ -133,12 +103,41 @@
m_readExtraFrames = OVERFLOW_SIZE;
}
+void ResampleAudioReader::set_converter_type(int converter_type)
+{
+ int error;
+
+ while (m_srcStates.size()) {
+ src_delete(m_srcStates.back());
+ m_srcStates.pop_back();
+ }
+
+ for (int c = 0; c < m_reader->get_num_channels(); c++) {
+
+ m_srcStates.append(src_new(converter_type, 1, &error));
+
+ if (!m_srcStates[c]) {
+ PERROR("ResampleAudioReader: couldn't create
libSampleRate SRC_STATE");
+ m_isResampleAvailable = false;
+ } else {
+ m_isResampleAvailable = true;
+ clear_buffers();
+ }
+ }
+
+ // seek_private will reset the src states!
+ seek_private(0);
+}
int ResampleAudioReader::get_output_rate()
{
return m_outputRate;
}
+int ResampleAudioReader::get_file_rate()
+{
+ m_reader->get_file_rate();
+}
void ResampleAudioReader::set_output_rate(int rate)
{
@@ -157,7 +156,7 @@
{
Q_ASSERT(m_reader);
- if (m_outputRate == m_rate) {
+ if (m_outputRate == m_rate || !m_isResampleAvailable) {
return m_reader->seek(start);
}
@@ -174,7 +173,7 @@
Q_ASSERT(m_reader);
// pass through if not changing sampleRate.
- if (m_outputRate == m_rate) {
+ if (m_outputRate == m_rate || !m_isResampleAvailable) {
return m_reader->read(buffer, frameCount);
} else if (!m_overflowBuffers) {
create_overflow_buffers();
Index: audiofileio/decode/ResampleAudioReader.h
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/decode/ResampleAudioReader.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- audiofileio/decode/ResampleAudioReader.h 20 Sep 2007 16:04:27 -0000
1.8
+++ audiofileio/decode/ResampleAudioReader.h 27 Sep 2007 19:20:29 -0000
1.9
@@ -31,17 +31,18 @@
{
public:
- ResampleAudioReader(QString filename, int converter_type, const
QString& decoder);
+ ResampleAudioReader(QString filename, const QString& decoder);
~ResampleAudioReader();
QString decoder_type() const {return (m_reader) ?
m_reader->decoder_type() : "";}
void clear_buffers();
int get_output_rate();
+ int get_file_rate();
void set_output_rate(int rate);
+ void set_converter_type(int converter_type);
protected:
- void init(int converter_type);
void reset();
bool seek_private(nframes_t start);
@@ -56,6 +57,7 @@
audio_sample_t** m_overflowBuffers;
long m_overflowUsed;
int m_outputRate;
+ bool m_isResampleAvailable;
nframes_t m_readExtraFrames;
private:
Index: core/ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -b -r1.62 -r1.63
--- core/ReadSource.cpp 24 Sep 2007 00:57:50 -0000 1.62
+++ core/ReadSource.cpp 27 Sep 2007 19:20:29 -0000 1.63
@@ -20,10 +20,8 @@
*/
#include "ReadSource.h"
-#include "AbstractAudioReader.h"
#include "ResampleAudioReader.h"
-#include "Peak.h"
#include "ProjectManager.h"
#include "Project.h"
#include "AudioClip.h"
@@ -222,20 +220,19 @@
if (useResampling) {
int converter_type;
converter_type = config().get_property("Conversion",
"RTResamplingConverterType", 2).toInt();
+
// There should be another config option for ConverterType to
use for export (higher quality)
//converter_type = config().get_property("Conversion",
"ExportResamplingConverterType", 0).toInt();
- m_audioReader = new ResampleAudioReader(m_fileName,
converter_type, m_decodertype);
+ m_audioReader = new ResampleAudioReader(m_fileName,
m_decodertype);
+
if (m_audioReader->is_valid()) {
set_output_rate(audiodevice().get_sample_rate());
- }
- else {
+ m_audioReader->set_converter_type(converter_type);
+ } else {
delete m_audioReader;
m_audioReader = 0;
}
}
- else {
- m_audioReader =
AbstractAudioReader::create_audio_reader(m_fileName, m_decodertype);
- }
if (m_audioReader == 0) {
return COULD_NOT_OPEN_FILE;
@@ -243,22 +240,24 @@
// (re)set the decoder type
m_decodertype = m_audioReader->decoder_type();
+ m_channelCount = m_audioReader->get_num_channels();
- if (m_audioReader->get_num_channels() > 2) {
- PERROR("ReadAudioSource: file contains %d channels; only 2
channels are supported", m_audioReader->get_num_channels());
+ // @Ben: I thought we support any channel count now ??
+ if (m_channelCount > 2) {
+ PERROR("ReadAudioSource: file contains %d channels; only 2
channels are supported", m_channelCount);
delete m_audioReader;
m_audioReader = 0;
return INVALID_CHANNEL_COUNT;
}
- if (m_audioReader->get_num_channels() == 0) {
- PERROR("ReadAudioSource: not a valid channel count: %d",
m_audioReader->get_num_channels());
+ // Never reached, it's allready checked in
AbstractAudioReader::is_valid() which was allready called!
+ if (m_channelCount == 0) {
+ PERROR("ReadAudioSource: not a valid channel count: %d",
m_channelCount);
delete m_audioReader;
m_audioReader = 0;
return ZERO_CHANNELS;
}
- m_channelCount = m_audioReader->get_num_channels();
m_rate = m_audioReader->get_file_rate();
m_length = m_audioReader->get_length();
@@ -269,43 +268,23 @@
void ReadSource::set_output_rate(int rate)
{
Q_ASSERT(rate > 0);
- ResampleAudioReader* reader =
dynamic_cast<ResampleAudioReader*>(m_audioReader);
- if (reader) {
- reader->set_output_rate(rate);
+
+ m_audioReader->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();
- }
+ m_length = m_audioReader->get_length();
}
int ReadSource::file_read(DecodeBuffer* buffer, TimeRef& start, nframes_t cnt)
const
{
-#if defined (profile)
- trav_time_t starttime = get_microseconds();
-#endif
-
- int rate = audiodevice().get_sample_rate();
-
- // Oh boy, the rate we have to use is the output rate of the resampled
reader
- // in case the audioreader is a ResampleAudioReader. Somehow Remon
thinks it's
- // better to use TimeRef based read_from() ....
- ResampleAudioReader* reader =
dynamic_cast<ResampleAudioReader*>(m_audioReader);
- if (reader) {
- rate = reader->get_output_rate();
- }
-
+// PROFILE_START;
+ int rate = m_audioReader->get_output_rate();
nframes_t result = m_audioReader->read_from(buffer,
start.to_frame(rate), cnt);
-
-#if defined (profile)
- int processtime = (int) (get_microseconds() - starttime);
- if (processtime > 40000) {
- printf("Process time for %s: %d useconds\n\n",
QS_C(m_fileName), processtime);
- }
-#endif
-
+// PROFILE_END("ReadSource::fileread");
return result;
}
@@ -624,14 +603,19 @@
int ReadSource::file_read(DecodeBuffer * buffer, nframes_t start, nframes_t
cnt)
{
- TimeRef startlocation(start, get_rate());
+ TimeRef startlocation(start, m_audioReader->get_output_rate());
return file_read(buffer, startlocation, cnt);
}
int ReadSource::get_file_rate() const
{
- Q_ASSERT(m_audioReader);
+ if (m_audioReader) {
return m_audioReader->get_file_rate();
+ } else {
+ PERROR("ReadSource::get_file_rate(), but no audioreader
available!!");
+ }
+
+ return pm().get_project()->get_rate();
}
Index: core/ReadSource.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.h,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -b -r1.36 -r1.37
--- core/ReadSource.h 17 Sep 2007 13:40:34 -0000 1.36
+++ core/ReadSource.h 27 Sep 2007 19:20:29 -0000 1.37
@@ -27,7 +27,7 @@
#include <QDomDocument>
-class AbstractAudioReader;
+class ResampleAudioReader;
class AudioClip;
struct BufferStatus;
class DecodeBuffer;
@@ -79,7 +79,7 @@
void set_output_rate(int rate);
private:
- AbstractAudioReader* m_audioReader;
+ ResampleAudioReader* m_audioReader;
AudioClip* m_clip;
int m_refcount;
int m_error;
Index: engine/defines.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/defines.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- engine/defines.h 26 Sep 2007 21:19:39 -0000 1.23
+++ engine/defines.h 27 Sep 2007 19:20:30 -0000 1.24
@@ -375,6 +375,9 @@
#endif // endif RELAYTOOL_PRESENT
+#define PROFILE_START trav_time_t starttime = get_microseconds();
+#define PROFILE_END(args...) int processtime = (int) (get_microseconds() -
starttime);printf("Process time for %s: %d useconds\n\n", args, processtime);
+
#endif // endif TRAVERSO_TYPES_H
//eof