diff options
Diffstat (limited to 'intern/audaspace/sndfile')
-rw-r--r-- | intern/audaspace/sndfile/AUD_SndFileFactory.cpp | 34 | ||||
-rw-r--r-- | intern/audaspace/sndfile/AUD_SndFileFactory.h | 19 | ||||
-rw-r--r-- | intern/audaspace/sndfile/AUD_SndFileReader.cpp | 53 | ||||
-rw-r--r-- | intern/audaspace/sndfile/AUD_SndFileReader.h | 21 |
4 files changed, 49 insertions, 78 deletions
diff --git a/intern/audaspace/sndfile/AUD_SndFileFactory.cpp b/intern/audaspace/sndfile/AUD_SndFileFactory.cpp index bac6dc321f4..d8ea7006073 100644 --- a/intern/audaspace/sndfile/AUD_SndFileFactory.cpp +++ b/intern/audaspace/sndfile/AUD_SndFileFactory.cpp @@ -29,39 +29,21 @@ #include <cstring> -AUD_SndFileFactory::AUD_SndFileFactory(const char* filename) +AUD_SndFileFactory::AUD_SndFileFactory(std::string filename) : + m_filename(filename) { - if(filename != NULL) - { - m_filename = new char[strlen(filename)+1]; AUD_NEW("string") - strcpy(m_filename, filename); - } - else - m_filename = NULL; } -AUD_SndFileFactory::AUD_SndFileFactory(unsigned char* buffer, int size) +AUD_SndFileFactory::AUD_SndFileFactory(const data_t* buffer, int size) : + m_buffer(new AUD_Buffer(size)) { - m_filename = NULL; - m_buffer = AUD_Reference<AUD_Buffer>(new AUD_Buffer(size)); memcpy(m_buffer.get()->getBuffer(), buffer, size); } -AUD_SndFileFactory::~AUD_SndFileFactory() -{ - if(m_filename) - { - delete[] m_filename; AUD_DELETE("string") - } -} - -AUD_IReader* AUD_SndFileFactory::createReader() +AUD_IReader* AUD_SndFileFactory::createReader() const { - AUD_IReader* reader; - if(m_filename) - reader = new AUD_SndFileReader(m_filename); + if(m_buffer.get()) + return new AUD_SndFileReader(m_buffer); else - reader = new AUD_SndFileReader(m_buffer); - AUD_NEW("reader") - return reader; + return new AUD_SndFileReader(m_filename); } diff --git a/intern/audaspace/sndfile/AUD_SndFileFactory.h b/intern/audaspace/sndfile/AUD_SndFileFactory.h index 98187ff1590..350e48abef8 100644 --- a/intern/audaspace/sndfile/AUD_SndFileFactory.h +++ b/intern/audaspace/sndfile/AUD_SndFileFactory.h @@ -30,6 +30,8 @@ #include "AUD_Reference.h" class AUD_Buffer; +#include <string> + /** * This factory reads a sound file via libsndfile. */ @@ -39,33 +41,32 @@ private: /** * The filename of the sound source file. */ - char* m_filename; + std::string m_filename; /** * The buffer to read from. */ AUD_Reference<AUD_Buffer> m_buffer; + // hide copy constructor and operator= + AUD_SndFileFactory(const AUD_SndFileFactory&); + AUD_SndFileFactory& operator=(const AUD_SndFileFactory&); + public: /** * Creates a new factory. * \param filename The sound file path. */ - AUD_SndFileFactory(const char* filename); + AUD_SndFileFactory(std::string filename); /** * Creates a new factory. * \param buffer The buffer to read from. * \param size The size of the buffer. */ - AUD_SndFileFactory(unsigned char* buffer, int size); - - /** - * Destroys the factory. - */ - ~AUD_SndFileFactory(); + AUD_SndFileFactory(const data_t* buffer, int size); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_SNDFILEFACTORY diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.cpp b/intern/audaspace/sndfile/AUD_SndFileReader.cpp index f9ed8d6388e..488a06d8728 100644 --- a/intern/audaspace/sndfile/AUD_SndFileReader.cpp +++ b/intern/audaspace/sndfile/AUD_SndFileReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_SndFileReader.h" -#include "AUD_Buffer.h" #include <cstring> @@ -77,30 +76,31 @@ sf_count_t AUD_SndFileReader::vio_tell(void *user_data) return reader->m_memoffset; } -AUD_SndFileReader::AUD_SndFileReader(const char* filename) +static const char* fileopen_error = "AUD_SndFileReader: File couldn't be " + "read."; + +AUD_SndFileReader::AUD_SndFileReader(std::string filename) : + m_position(0) { SF_INFO sfinfo; sfinfo.format = 0; - m_sndfile = sf_open(filename, SFM_READ, &sfinfo); + m_sndfile = sf_open(filename.c_str(), SFM_READ, &sfinfo); if(!m_sndfile) - AUD_THROW(AUD_ERROR_FILE); + AUD_THROW(AUD_ERROR_FILE, fileopen_error); m_specs.channels = (AUD_Channels) sfinfo.channels; m_specs.rate = (AUD_SampleRate) sfinfo.samplerate; m_length = sfinfo.frames; m_seekable = sfinfo.seekable; - m_position = 0; - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } -AUD_SndFileReader::AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer) +AUD_SndFileReader::AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer) : + m_position(0), + m_membuffer(buffer), + m_memoffset(0) { - m_membuffer = buffer; - m_memoffset = 0; - m_vio.get_filelen = vio_get_filelen; m_vio.read = vio_read; m_vio.seek = vio_seek; @@ -113,25 +113,20 @@ AUD_SndFileReader::AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer) m_sndfile = sf_open_virtual(&m_vio, SFM_READ, &sfinfo, this); if(!m_sndfile) - AUD_THROW(AUD_ERROR_FILE); + AUD_THROW(AUD_ERROR_FILE, fileopen_error); m_specs.channels = (AUD_Channels) sfinfo.channels; m_specs.rate = (AUD_SampleRate) sfinfo.samplerate; m_length = sfinfo.frames; m_seekable = sfinfo.seekable; - m_position = 0; - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } AUD_SndFileReader::~AUD_SndFileReader() { sf_close(m_sndfile); - - delete m_buffer; AUD_DELETE("buffer") } -bool AUD_SndFileReader::isSeekable() +bool AUD_SndFileReader::isSeekable() const { return m_seekable; } @@ -145,40 +140,30 @@ void AUD_SndFileReader::seek(int position) } } -int AUD_SndFileReader::getLength() +int AUD_SndFileReader::getLength() const { return m_length; } -int AUD_SndFileReader::getPosition() +int AUD_SndFileReader::getPosition() const { return m_position; } -AUD_Specs AUD_SndFileReader::getSpecs() +AUD_Specs AUD_SndFileReader::getSpecs() const { return m_specs; } -AUD_ReaderType AUD_SndFileReader::getType() -{ - return AUD_TYPE_STREAM; -} - -bool AUD_SndFileReader::notify(AUD_Message &message) -{ - return false; -} - void AUD_SndFileReader::read(int & length, sample_t* & buffer) { int sample_size = AUD_SAMPLE_SIZE(m_specs); // resize output buffer if necessary - if(m_buffer->getSize() < length*sample_size) - m_buffer->resize(length*sample_size); + if(m_buffer.getSize() < length*sample_size) + m_buffer.resize(length*sample_size); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); length = sf_readf_float(m_sndfile, buffer, length); diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.h b/intern/audaspace/sndfile/AUD_SndFileReader.h index 8886b6e9efc..a53189fdecd 100644 --- a/intern/audaspace/sndfile/AUD_SndFileReader.h +++ b/intern/audaspace/sndfile/AUD_SndFileReader.h @@ -28,8 +28,9 @@ #include "AUD_IReader.h" #include "AUD_Reference.h" -class AUD_Buffer; +#include "AUD_Buffer.h" +#include <string> #include <sndfile.h> typedef sf_count_t (*sf_read_f)(SNDFILE *sndfile, void *ptr, sf_count_t frames); @@ -63,7 +64,7 @@ private: /** * The playback buffer. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; /** * The sndfile. @@ -91,6 +92,10 @@ private: static sf_count_t vio_read(void *ptr, sf_count_t count, void *user_data); static sf_count_t vio_tell(void *user_data); + // hide copy constructor and operator= + AUD_SndFileReader(const AUD_SndFileReader&); + AUD_SndFileReader& operator=(const AUD_SndFileReader&); + public: /** * Creates a new reader. @@ -98,7 +103,7 @@ public: * \exception AUD_Exception Thrown if the file specified does not exist or * cannot be read with libsndfile. */ - AUD_SndFileReader(const char* filename); + AUD_SndFileReader(std::string filename); /** * Creates a new reader. @@ -113,13 +118,11 @@ public: */ virtual ~AUD_SndFileReader(); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; |