Audaspace: HUGE Refactor.
Some points of the refactor not sorted by importance: * Fixed immutability of readers and factories (there are exceptions...) * Fixed copy constructors and = operators * Removed messaging system * Removed reader types * Added const where possible * Using initalisers when possible * Avoided use of pointers when possible * Removed AUD_NEW and AUD_DELETE macros * Removed useless NULL pointer checks * Fixed exception catching * Fixed some yet unknown bugs * Lots of other stuff
This commit is contained in:
@@ -26,28 +26,18 @@
|
||||
#include "AUD_SRCResampleFactory.h"
|
||||
#include "AUD_SRCResampleReader.h"
|
||||
|
||||
AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_IReader* reader,
|
||||
AUD_DeviceSpecs specs) :
|
||||
AUD_ResampleFactory(reader, specs) {}
|
||||
|
||||
AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_IFactory* factory,
|
||||
AUD_DeviceSpecs specs) :
|
||||
AUD_ResampleFactory(factory, specs) {}
|
||||
AUD_ResampleFactory(factory, specs)
|
||||
{
|
||||
}
|
||||
|
||||
AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_DeviceSpecs specs) :
|
||||
AUD_ResampleFactory(specs) {}
|
||||
|
||||
AUD_IReader* AUD_SRCResampleFactory::createReader()
|
||||
AUD_IReader* AUD_SRCResampleFactory::createReader() const
|
||||
{
|
||||
AUD_IReader* reader = getReader();
|
||||
|
||||
if(reader != 0)
|
||||
{
|
||||
if(reader->getSpecs().rate != m_specs.rate)
|
||||
{
|
||||
reader = new AUD_SRCResampleReader(reader, m_specs.specs);
|
||||
AUD_NEW("reader")
|
||||
}
|
||||
}
|
||||
if(reader->getSpecs().rate != m_specs.rate)
|
||||
reader = new AUD_SRCResampleReader(reader, m_specs.specs);
|
||||
|
||||
return reader;
|
||||
}
|
||||
|
@@ -34,12 +34,15 @@
|
||||
*/
|
||||
class AUD_SRCResampleFactory : public AUD_ResampleFactory
|
||||
{
|
||||
public:
|
||||
AUD_SRCResampleFactory(AUD_IReader* reader, AUD_DeviceSpecs specs);
|
||||
AUD_SRCResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs);
|
||||
AUD_SRCResampleFactory(AUD_DeviceSpecs specs);
|
||||
private:
|
||||
// hide copy constructor and operator=
|
||||
AUD_SRCResampleFactory(const AUD_SRCResampleFactory&);
|
||||
AUD_SRCResampleFactory& operator=(const AUD_SRCResampleFactory&);
|
||||
|
||||
virtual AUD_IReader* createReader();
|
||||
public:
|
||||
AUD_SRCResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs);
|
||||
|
||||
virtual AUD_IReader* createReader() const;
|
||||
};
|
||||
|
||||
#endif //AUD_SRCRESAMPLEFACTORY
|
||||
|
@@ -24,7 +24,6 @@
|
||||
*/
|
||||
|
||||
#include "AUD_SRCResampleReader.h"
|
||||
#include "AUD_Buffer.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
@@ -37,14 +36,13 @@ static long src_callback(void *cb_data, float **data)
|
||||
|
||||
AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_IReader* reader,
|
||||
AUD_Specs specs) :
|
||||
AUD_EffectReader(reader)
|
||||
AUD_EffectReader(reader),
|
||||
m_sspecs(reader->getSpecs()),
|
||||
m_factor(double(specs.rate) / double(m_sspecs.rate)),
|
||||
m_tspecs(specs),
|
||||
m_position(0)
|
||||
{
|
||||
m_sspecs = reader->getSpecs();
|
||||
|
||||
m_tspecs = specs;
|
||||
m_tspecs.channels = m_sspecs.channels;
|
||||
m_factor = (double)m_tspecs.rate / (double)m_sspecs.rate;
|
||||
m_position = 0;
|
||||
|
||||
int error;
|
||||
m_src = src_callback_new(src_callback,
|
||||
@@ -56,23 +54,19 @@ AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_IReader* reader,
|
||||
if(!m_src)
|
||||
{
|
||||
// XXX printf("%s\n", src_strerror(error));
|
||||
delete m_reader; AUD_DELETE("reader")
|
||||
delete m_reader;
|
||||
AUD_THROW(AUD_ERROR_READER);
|
||||
}
|
||||
|
||||
m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
|
||||
}
|
||||
|
||||
AUD_SRCResampleReader::~AUD_SRCResampleReader()
|
||||
{
|
||||
src_delete(m_src);
|
||||
|
||||
delete m_buffer; AUD_DELETE("buffer")
|
||||
}
|
||||
|
||||
long AUD_SRCResampleReader::doCallback(float** data)
|
||||
{
|
||||
int length = m_buffer->getSize() / AUD_SAMPLE_SIZE(m_tspecs);
|
||||
int length = m_buffer.getSize() / AUD_SAMPLE_SIZE(m_tspecs);
|
||||
sample_t* buffer;
|
||||
|
||||
m_reader->read(length, buffer);
|
||||
@@ -88,17 +82,17 @@ void AUD_SRCResampleReader::seek(int position)
|
||||
m_position = position;
|
||||
}
|
||||
|
||||
int AUD_SRCResampleReader::getLength()
|
||||
int AUD_SRCResampleReader::getLength() const
|
||||
{
|
||||
return m_reader->getLength() * m_factor;
|
||||
}
|
||||
|
||||
int AUD_SRCResampleReader::getPosition()
|
||||
int AUD_SRCResampleReader::getPosition() const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
|
||||
AUD_Specs AUD_SRCResampleReader::getSpecs()
|
||||
AUD_Specs AUD_SRCResampleReader::getSpecs() const
|
||||
{
|
||||
return m_tspecs;
|
||||
}
|
||||
@@ -107,10 +101,10 @@ void AUD_SRCResampleReader::read(int & length, sample_t* & buffer)
|
||||
{
|
||||
int size = length * AUD_SAMPLE_SIZE(m_tspecs);
|
||||
|
||||
if(m_buffer->getSize() < size)
|
||||
m_buffer->resize(size);
|
||||
if(m_buffer.getSize() < size)
|
||||
m_buffer.resize(size);
|
||||
|
||||
buffer = m_buffer->getBuffer();
|
||||
buffer = m_buffer.getBuffer();
|
||||
|
||||
length = src_callback_read(m_src, m_factor, length, buffer);
|
||||
|
||||
|
@@ -27,7 +27,7 @@
|
||||
#define AUD_SRCRESAMPLEREADER
|
||||
|
||||
#include "AUD_EffectReader.h"
|
||||
class AUD_Buffer;
|
||||
#include "AUD_Buffer.h"
|
||||
|
||||
#include <samplerate.h>
|
||||
|
||||
@@ -37,26 +37,26 @@ class AUD_Buffer;
|
||||
class AUD_SRCResampleReader : public AUD_EffectReader
|
||||
{
|
||||
private:
|
||||
/**
|
||||
* The sample specification of the source.
|
||||
*/
|
||||
const AUD_Specs m_sspecs;
|
||||
|
||||
/**
|
||||
* The resampling factor.
|
||||
*/
|
||||
double m_factor;
|
||||
const double m_factor;
|
||||
|
||||
/**
|
||||
* The sound output buffer.
|
||||
*/
|
||||
AUD_Buffer *m_buffer;
|
||||
AUD_Buffer m_buffer;
|
||||
|
||||
/**
|
||||
* The target specification.
|
||||
*/
|
||||
AUD_Specs m_tspecs;
|
||||
|
||||
/**
|
||||
* The sample specification of the source.
|
||||
*/
|
||||
AUD_Specs m_sspecs;
|
||||
|
||||
/**
|
||||
* The src state structure.
|
||||
*/
|
||||
@@ -67,14 +67,17 @@ private:
|
||||
*/
|
||||
int m_position;
|
||||
|
||||
// hide copy constructor and operator=
|
||||
AUD_SRCResampleReader(const AUD_SRCResampleReader&);
|
||||
AUD_SRCResampleReader& operator=(const AUD_SRCResampleReader&);
|
||||
|
||||
public:
|
||||
/**
|
||||
* Creates a resampling reader.
|
||||
* \param reader The reader to mix.
|
||||
* \param specs The target specification.
|
||||
* \exception AUD_Exception Thrown if the source specification cannot be
|
||||
* mixed to the target specification or if the reader is
|
||||
* NULL.
|
||||
* resampled to the target specification.
|
||||
*/
|
||||
AUD_SRCResampleReader(AUD_IReader* reader, AUD_Specs specs);
|
||||
|
||||
@@ -92,9 +95,9 @@ public:
|
||||
long doCallback(float** data);
|
||||
|
||||
virtual void seek(int position);
|
||||
virtual int getLength();
|
||||
virtual int getPosition();
|
||||
virtual AUD_Specs getSpecs();
|
||||
virtual int getLength() const;
|
||||
virtual int getPosition() const;
|
||||
virtual AUD_Specs getSpecs() const;
|
||||
virtual void read(int & length, sample_t* & buffer);
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user