Minor API changes to the manager, release is now releaseAllSources, createFromFile is now create.

Added the ability for the user to provide a DataSourceFactory, which cAudio will use to get audio data.  This interface can be overridden to provide cAudio the ability to read from zip archives, TCP streams, potentially any location.  DataSourceFactories can also be prioritized.
Made the existing FileSource a factory and registered it by default with the manager.  If the user wishes to prevent cAudio from reading from disk, unRegister the "FileSystem" data source.
Made tutorials conform with the changes to the API.
This commit is contained in:
Joshua Jones 2010-02-13 05:48:19 +00:00
parent 16581113c9
commit 3f06749573
12 changed files with 203 additions and 262 deletions

View File

@ -43,7 +43,7 @@ int main(int argc, char* argv[])
manager->initialize(manager->getAvailableDeviceName(deviceSelection));
//Create a IAudio object and load a sound from a file
cAudio::IAudioSource* mysound = manager->createFromFile("bling","../../media/cAudioTheme1.ogg",true);
cAudio::IAudioSource* mysound = manager->create("bling","../../media/cAudioTheme1.ogg",true);
if(mysound)
{
@ -58,7 +58,7 @@ int main(int argc, char* argv[])
}
//Delete all IAudio sounds
manager->release();
manager->releaseAllSources();
//Shutdown cAudio
manager->shutDown();

View File

@ -50,7 +50,7 @@ int main(int argc, char* argv[])
cAudio::IListener* listener = manager->getListener();
//Create a IAudio object and load a sound from a file
cAudio::IAudioSource* mysound = manager->createFromFile("bling", "../../media/bling.ogg", false);
cAudio::IAudioSource* mysound = manager->create("bling", "../../media/bling.ogg", false);
//Set the IAudio Sound to play3d and loop
//play3d takes 4 arguments play3d(toloop,x,y,z,strength)
@ -93,7 +93,7 @@ int main(int argc, char* argv[])
std::cout << std::endl;
//Delete all IAudio sounds
manager->release();
manager->releaseAllSources();
//Shutdown cAudio
manager->shutDown();

View File

@ -60,7 +60,7 @@ int main(int argc, char* argv[])
}
//Delete all IAudio sounds
manager->release();
manager->releaseAllSources();
//Shutdown cAudio
manager->shutDown();

View File

@ -124,7 +124,7 @@ int main(int argc, char* argv[])
}
//Delete all IAudio sounds
manager->release();
manager->releaseAllSources();
//Shutdown cAudio
manager->shutDown();

View File

@ -55,7 +55,7 @@ int main(int argc, char* argv[])
filter->setLowFrequencyVolume(0.1f);
//Create a IAudio object and load a sound from a file
cAudio::IAudioSource* mysound = manager->createFromFile("bling","../../media/Footsteps.wav",false);
cAudio::IAudioSource* mysound = manager->create("bling","../../media/Footsteps.wav",false);
if(mysound)
{
@ -345,7 +345,7 @@ int main(int argc, char* argv[])
#endif
//Delete all IAudio sounds
manager->release();
manager->releaseAllSources();
//Shutdown cAudio
manager->shutDown();

View File

@ -26,7 +26,6 @@ namespace cAudio
class cAudioManager : public IAudioManager
{
public:
enum Events{
ON_INIT,
ON_UPDATE,
@ -48,7 +47,7 @@ namespace cAudio
//!Gets you the cAudio object you want
virtual IAudioSource* getSoundByName(const char* name);
//!Releases "ALL" cAudio objects
virtual void release();
virtual void releaseAllSources();
//!Releases a single cAudio source
virtual void release(IAudioSource* source);
@ -61,13 +60,11 @@ namespace cAudio
virtual const char* getDefaultDeviceName();
//!Creates the cAudio object
virtual IAudioSource* createFromFile(const char* name, const char* pathToFile, bool stream = false);
virtual IAudioSource* create(const char* name, const char* filename, bool stream = false);
//!Loads data from memory or virtual file system
virtual IAudioSource* createFromMemory(const char* name, const char* data, size_t length, const char* extension);
//!Loads raw audio from memory.
virtual IAudioSource* createFromRaw(const char* name, const char* data, size_t length, unsigned int frequency, AudioFormats format);
//!Loads audio from alternative data source.
virtual IAudioSource* createFromSource(const char* name, const char* source);
//!Register Audio Codec
virtual bool registerAudioDecoder(IAudioDecoderFactory* factory, const char* extension);
@ -79,15 +76,16 @@ namespace cAudio
virtual bool isAudioDecoderRegistered(const char* extension);
//!Returns a registered audio decoder factory
virtual IAudioDecoderFactory* getAudioDecoderFactory(const char* extension);
//!Register a alternative source
virtual bool registerSource(const char* identifier,IDataSource* datasource);
//! Unregister source (allows you to prevent creation of audio files from specific source)
//!Note that all current sound sources will still continue to use any currently used source.
//!Unregisters all Audio Codecs
//!Note that all current sound sources will still continue to use any currently allocated decoders.
//!Will NOT delete any user added factory instance, you must do that yourself
virtual void unRegisterSource(const char* source);
//!Checks if the source type is registered.
virtual bool isSourceRegistered(const char* source);
virtual void unRegisterAllAudioDecoders();
virtual bool registerDataSource(IDataSourceFactory* factory, const char* name, int priority);
virtual void unRegisterDataSource(const char* name);
virtual bool isDataSourceRegistered(const char* name);
virtual IDataSourceFactory* getDataSourceFactory(const char* name);
virtual void unRegisterAllDataSources();
//!Registers a new event handler to the manager
virtual void registerEventHandler(IManagerEventHandler* handler);
@ -106,10 +104,6 @@ namespace cAudio
#endif
private:
//Signals a event to all event handlers
void signalEvent(Events sevent);
//Mutex for thread syncronization
cAudioMutex Mutex;
@ -131,10 +125,8 @@ namespace cAudio
//! Decoder map that holds all decoders by file extension
std::map<std::string, IAudioDecoderFactory*> decodermap;
//! Archive map that holds all datasource types
std::map<std::string, IDataSource*> datasourcemap;
//! List of all attached event handlers
std::list<IManagerEventHandler*> eventHandlerList;
std::map<std::string, IDataSourceFactory*> datasourcemap;
std::vector< std::pair<int, std::string> > dataSourcePriorityList;
//! The listener object
cListener initlistener;
@ -147,6 +139,12 @@ namespace cAudio
std::vector<std::string> AvailableDevices;
std::string DefaultDevice;
//Signals a event to all event handlers
void signalEvent(Events sevent);
//! List of all attached event handlers
std::list<IManagerEventHandler*> eventHandlerList;
};
}

View File

@ -16,7 +16,7 @@ namespace cAudio
class cFileSource : public IDataSource
{
public:
cFileSource(const std::string& filename);
cFileSource(const char* filename);
~cFileSource();
//!Returns whether the source is valid (in case of an error, like the file couldn't be found)

View File

@ -14,9 +14,11 @@
#include "../Headers/cLogger.h"
#include "../Headers/cPluginManager.h"
#include "../include/cAudioPlatform.h"
#include "../Headers/cFileSourceFactory.h"
#include <set>
#include <string.h>
#include <algorithm>
#ifdef CAUDIO_EFX_ENABLED
@ -32,8 +34,6 @@
#endif
#define LOAD_AL_FUNC(x) (x = (typeof(x))alGetProcAddress(#x))
namespace cAudio
{
static bool RunAudioManagerThread(false);
@ -47,6 +47,8 @@ namespace cAudio
static cRawAudioDecoderFactory RawDecoderFactory;
static cFileSourceFactory FileSourceFactory;
//Note: OpenAL is threadsafe, so a mutex only needs to protect the class state
#ifdef CAUDIO_USE_INTERNAL_THREAD
static cAudioMutex AudioManagerObjectsMutex;
@ -158,113 +160,74 @@ namespace cAudio
#ifdef CAUDIO_COMPILE_WITH_WAV_DECODER
registerAudioDecoder(&WavDecoderFactory, "wav");
#endif
#ifdef CAUDIO_COMPILE_WITH_RAW_DECODER
registerAudioDecoder(&RawDecoderFactory, "raw");
#endif
registerDataSource(&FileSourceFactory, "FileSystem", 0);
Initialized = true;
signalEvent(ON_INIT);
return true;
}
//!create a sound source
IAudioSource* cAudioManager::createFromFile(const char* name, const char* pathToFile, bool stream)
IAudioSource* cAudioManager::create(const char* name, const char* filename, bool stream)
{
cAudioMutexBasicLock lock(Mutex);
std::string audioName = safeCStr(name);
std::string path = safeCStr(pathToFile);
std::string path = safeCStr(filename);
std::string ext = getExt(path);
IAudioDecoderFactory* factory = getAudioDecoderFactory(ext.c_str());
if(factory)
{
if(stream)
for(int i=0; i<dataSourcePriorityList.size(); ++i)
{
cFileSource* source = new cFileSource(path);
if(source)
IDataSourceFactory* dataFactory = datasourcemap[dataSourcePriorityList[i].second];
if(dataFactory)
{
if(source->isValid())
IDataSource* source = dataFactory->CreateDataSource(filename, stream);
if(source && source->isValid())
{
IAudioDecoder* decoder = factory->CreateAudioDecoder(source);
source->drop();
if(decoder)
if(decoder && decoder->isValid())
{
if(decoder->isValid())
{
#ifdef CAUDIO_EFX_ENABLED
IAudioSource* audio = new cAudioSource(decoder, Context, initEffects.getEFXInterface());
IAudioSource* audio = new cAudioSource(decoder, Context, initEffects.getEFXInterface());
#else
IAudioSource* audio = new cAudioSource(decoder, Context);
IAudioSource* audio = new cAudioSource(decoder, Context);
#endif
decoder->drop();
if(audio)
{
if(audio->isValid())
{
if(!audioName.empty())
audioIndex[audioName] = audio;
audioSources.push_back(audio);
getLogger()->logInfo("AudioManager", "Streaming Audio Source (%s) created from file %s.", audioName.c_str(), path.c_str());
signalEvent(ON_SOURCECREATE);
return audio;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Error creating audio source.", audioName.c_str());
audio->drop();
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory.", audioName.c_str());
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Audio data could not be decoded by (.%s) decoder.", audioName.c_str(), ext.c_str());
decoder->drop();
if(audio && audio->isValid())
{
if(!audioName.empty())
audioIndex[audioName] = audio;
audioSources.push_back(audio);
getLogger()->logInfo("AudioManager", "Audio Source (%s) created from file %s from Data Source %s.", audioName.c_str(), path.c_str(), dataSourcePriorityList[i].second.c_str());
return audio;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Error creating audio source.", audioName.c_str());
audio->drop();
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory.", audioName.c_str());
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Audio data could not be decoded by (.%s) decoder.", audioName.c_str(), ext.c_str());
decoder->drop();
return NULL;
}
source->drop();
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not load file %s.", audioName.c_str(), path.c_str());
return NULL;
if(source)
source->drop();
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory.", audioName.c_str());
return NULL;
}
else
{
cFileSource* tempsource = new cFileSource(path);
if(tempsource)
{
if(tempsource->isValid())
{
int length = tempsource->getSize();
char *tempbuf = new char[length];
if(tempbuf)
{
tempsource->read(tempbuf,length);
IAudioSource* guy = createFromMemory(name, tempbuf, length, getExt(path).c_str());
delete[]tempbuf;
tempsource->drop();
signalEvent(ON_SOURCECREATE);
return guy;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory.", audioName.c_str());
tempsource->drop();
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Audio data is corrupt.", audioName.c_str());
tempsource->drop();
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory.", audioName.c_str());
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): File could not be found (.%s).", audioName.c_str(), path.c_str());
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Codec (.%s) is not supported.", audioName.c_str(), ext.c_str());
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): No decoder could be found for (.%s).", audioName.c_str(), ext.c_str());
return NULL;
}
@ -306,7 +269,7 @@ namespace cAudio
audioSources.push_back(audio);
getLogger()->logInfo("AudioManager", "Audio Source (%s) successfully created from memory.", audioName.c_str());
signalEvent(ON_SOURCECREATE);
return audio;
}
audio->drop();
@ -341,7 +304,7 @@ namespace cAudio
std::string audioName = safeCStr(name);
IAudioDecoderFactory* factory = getAudioDecoderFactory("raw");
if(factory)
{IAudioDecoderFactory* factory = getAudioDecoderFactory("raw");
{
cMemorySource* source = new cMemorySource(data, length, true);
if(source)
{
@ -370,7 +333,7 @@ namespace cAudio
audioSources.push_back(audio);
getLogger()->logInfo("AudioManager", "Audio Source (%s) successfully created from raw data.", audioName.c_str());
signalEvent(ON_SOURCECREATE);
return audio;
}
audio->drop();
@ -398,116 +361,12 @@ namespace cAudio
return NULL;
}
IAudioSource* cAudioManager::createFromSource(const char* name, const char* source)
{
std::string audioName = safeCStr(name);
std::string src = safeCStr(source);
std::map<std::string, IDataSource*>::iterator it = datasourcemap.find(src);
IAudioDecoderFactory* factory = getAudioDecoderFactory("raw");
if(it != datasourcemap.end())
{
if(it->second)
{
if(it->second->isValid())
{
IAudioDecoder* decoder = factory->CreateAudioDecoder(it->second);
if(decoder)
{
if(decoder->isValid())
{
#ifdef CAUDIO_EFX_ENABLED
IAudioSource* audio = new cAudioSource(decoder, Context, initEffects.getEFXInterface());
#else
IAudioSource* audio = new cAudioSource(decoder, Context);
#endif
decoder->drop();
if(audio)
{
if(audio->isValid())
{
if(!audioName.empty())
audioIndex[audioName] = audio;
audioSources.push_back(audio);
getLogger()->logInfo("AudioManager", "Audio Source (%s) successfully created from raw data. Using ($s) source", audioName.c_str(),src.c_str());
signalEvent(ON_SOURCECREATE);
return audio;
}
audio->drop();
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Error creating audio source. Using ($) source", audioName.c_str(),src.c_str());
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory.", audioName.c_str());
return NULL;
}
decoder->drop();
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Audio data could not be decoded by (.%s) decoder.", audioName.c_str(), "raw");
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory for decoder.", audioName.c_str());
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Audio data is corrupt.", audioName.c_str());
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Could not allocate enough memory.", audioName.c_str());
return NULL;
}
getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Codec (.%s) is not supported.", audioName.c_str(), "raw");
return NULL;
}
bool cAudioManager::registerSource(const char* identifier,IDataSource* datasource)
{
cAudioMutexBasicLock lock(Mutex);
std::string ident = safeCStr(identifier);
datasourcemap[ident] = datasource;
getLogger()->logInfo("AudioManager","Audio source %s registered.", ident.c_str());
signalEvent(ON_DATASOURCEREGISTER);
return true;
}
bool cAudioManager::isSourceRegistered(const char* source)
{
cAudioMutexBasicLock lock(Mutex);
std::string src = safeCStr(source);
std::map<std::string, IDataSource*>::iterator it = datasourcemap.find(src);
return (it != datasourcemap.end());
}
void cAudioManager::unRegisterSource(const char* source)
{
cAudioMutexBasicLock lock(Mutex);
std::string src = safeCStr(source);
std::map<std::string, IDataSource*>::iterator it = datasourcemap.find(src);
if(it != datasourcemap.end())
{
datasourcemap.erase(it);
getLogger()->logInfo("AudioManager", "DataSource .%s unregistered.", src.c_str());
}
}
bool cAudioManager::registerAudioDecoder(IAudioDecoderFactory* factory, const char* extension)
{
cAudioMutexBasicLock lock(Mutex);
std::string ext = safeCStr(extension);
decodermap[ext] = factory;
getLogger()->logInfo("AudioManager", "Audio Decoder for extension .%s registered.", ext.c_str());
signalEvent(ON_DECODERREGISTER);
return true;
}
@ -531,6 +390,91 @@ namespace cAudio
return (it != decodermap.end());
}
IAudioDecoderFactory* cAudioManager::getAudioDecoderFactory(const char* extension)
{
cAudioMutexBasicLock lock(Mutex);
std::string ext = safeCStr(extension);
std::map<std::string, IAudioDecoderFactory*>::iterator it = decodermap.find(ext);
if(it != decodermap.end())
{
return it->second;
}
return NULL;
}
void cAudioManager::unRegisterAllAudioDecoders()
{
cAudioMutexBasicLock lock(Mutex);
decodermap.clear();
}
bool compareDataSourcePriorities(std::pair<int, std::string> left, std::pair<int, std::string> right)
{
return (left.first > right.first);
}
bool cAudioManager::registerDataSource(IDataSourceFactory* factory, const char* name, int priority)
{
cAudioMutexBasicLock lock(Mutex);
std::string safeName = safeCStr(name);
datasourcemap[safeName] = factory;
dataSourcePriorityList.push_back(std::pair<int, std::string>(priority, safeName));
std::sort(dataSourcePriorityList.begin(), dataSourcePriorityList.end(), compareDataSourcePriorities);
getLogger()->logInfo("AudioManager", "Data Source named %s registered (Priority %i).", safeName.c_str(), priority);
return true;
}
void cAudioManager::unRegisterDataSource(const char* name)
{
cAudioMutexBasicLock lock(Mutex);
std::string safeName = safeCStr(name);
std::map<std::string, IDataSourceFactory*>::iterator it = datasourcemap.find(safeName);
if(it != datasourcemap.end())
{
datasourcemap.erase(it);
getLogger()->logInfo("AudioManager", "Data Source named %s unregistered.", safeName.c_str());
}
for(int i=0; i<dataSourcePriorityList.size(); ++i)
{
if(dataSourcePriorityList[i].second == safeName)
{
dataSourcePriorityList.erase(dataSourcePriorityList.begin()+i);
break;
}
}
std::sort(dataSourcePriorityList.begin(), dataSourcePriorityList.end(), compareDataSourcePriorities);
}
bool cAudioManager::isDataSourceRegistered(const char* name)
{
cAudioMutexBasicLock lock(Mutex);
std::string safeName = safeCStr(name);
std::map<std::string, IDataSourceFactory*>::iterator it = datasourcemap.find(safeName);
return (it != datasourcemap.end());
}
IDataSourceFactory* cAudioManager::getDataSourceFactory(const char* name)
{
cAudioMutexBasicLock lock(Mutex);
std::string safeName = safeCStr(name);
std::map<std::string, IDataSourceFactory*>::iterator it = datasourcemap.find(safeName);
if(it != datasourcemap.end())
{
return it->second;
}
return NULL;
}
void cAudioManager::unRegisterAllDataSources()
{
cAudioMutexBasicLock lock(Mutex);
datasourcemap.clear();
dataSourcePriorityList.clear();
}
void cAudioManager::registerEventHandler(IManagerEventHandler* handler)
{
if(handler)
@ -553,11 +497,10 @@ namespace cAudio
if(it != eventHandlerList.end())
{
for(it; it != eventHandlerList.end(); it++){
for(it; it != eventHandlerList.end(); it++)
{
eventHandlerList.remove((*it));
}
}
}
@ -565,13 +508,14 @@ namespace cAudio
{
std::list<IManagerEventHandler*>::iterator it = eventHandlerList.begin();
if(it != eventHandlerList.end()){
switch(sevent){
if(it != eventHandlerList.end())
{
switch(sevent)
{
case ON_INIT:
for(it; it != eventHandlerList.end(); it++){
for(it; it != eventHandlerList.end(); it++)
{
(*it)->onInit();
}
@ -579,7 +523,8 @@ namespace cAudio
case ON_UPDATE:
for(it; it != eventHandlerList.end(); it++){
for(it; it != eventHandlerList.end(); it++)
{
(*it)->onUpdate();
}
@ -587,7 +532,8 @@ namespace cAudio
case ON_RELEASE:
for(it; it != eventHandlerList.end(); it++){
for(it; it != eventHandlerList.end(); it++)
{
(*it)->onRelease();
}
@ -595,16 +541,17 @@ namespace cAudio
case ON_SOURCECREATE:
for(it; it != eventHandlerList.end(); it++){
for(it; it != eventHandlerList.end(); it++)
{
(*it)->onSourceCreate();
}
break;
case ON_DECODERREGISTER:
for(it; it != eventHandlerList.end(); it++){
for(it; it != eventHandlerList.end(); it++)
{
(*it)->onDecoderRegister();
}
@ -612,7 +559,8 @@ namespace cAudio
case ON_DATASOURCEREGISTER:
for(it; it != eventHandlerList.end(); it++){
for(it; it != eventHandlerList.end(); it++)
{
(*it)->onDataSourceRegister();
}
@ -621,18 +569,6 @@ namespace cAudio
}
}
IAudioDecoderFactory* cAudioManager::getAudioDecoderFactory(const char* extension)
{
cAudioMutexBasicLock lock(Mutex);
std::string ext = safeCStr(extension);
std::map<std::string, IAudioDecoderFactory*>::iterator it = decodermap.find(ext);
if(it != decodermap.end())
{
return it->second;
}
return NULL;
}
//!grabs the selected audio file via the identifier
IAudioSource* cAudioManager::getSoundByName(const char* name)
{
@ -647,7 +583,7 @@ namespace cAudio
}
//!Releases the selected audio source
void cAudioManager::release()
void cAudioManager::releaseAllSources()
{
cAudioMutexBasicLock lock(Mutex);
for(unsigned int i=0; i<audioSources.size(); ++i)
@ -658,8 +594,6 @@ namespace cAudio
}
audioSources.clear();
audioIndex.clear();
signalEvent(ON_RELEASE);
}
void cAudioManager::release(IAudioSource* source)
@ -703,7 +637,6 @@ namespace cAudio
}
}
}
signalEvent(ON_UPDATE);
}
//!Shuts down cAudio. Deletes all audio sources in process
@ -712,7 +645,7 @@ namespace cAudio
if(Initialized)
{
cAudioMutexBasicLock lock(Mutex);
release();
releaseAllSources();
//Reset context to null
alcMakeContextCurrent(NULL);
//Delete the context

View File

@ -4,16 +4,18 @@
#include "../Headers/cFileSource.h"
#include <cstring>
#include "../Headers/cUtils.h"
namespace cAudio
{
//!Init Takes a string for file name
cFileSource::cFileSource(const std::string& filename) : pFile(NULL), Valid(false), Filesize(0)
cFileSource::cFileSource(const char* filename) : pFile(NULL), Valid(false), Filesize(0)
{
if(filename.length() != 0)
std::string safeFilename = safeCStr(filename);
if(safeFilename.length() != 0)
{
pFile = fopen(filename.c_str(),"rb");
pFile = fopen(safeFilename.c_str(),"rb");
if(pFile)
Valid = true;
}

View File

@ -215,6 +215,10 @@
RelativePath=".\Headers\cFileSource.h"
>
</File>
<File
RelativePath=".\Headers\cFileSourceFactory.h"
>
</File>
<File
RelativePath=".\Headers\cFilter.h"
>
@ -423,6 +427,10 @@
RelativePath=".\include\IDataSource.h"
>
</File>
<File
RelativePath=".\include\IDataSourceFactory.h"
>
</File>
<File
RelativePath=".\include\IEffect.h"
>

View File

@ -9,6 +9,7 @@
#include "cAudioDefines.h"
#include "EAudioFormats.h"
#include "IAudioEffects.h"
#include "IDataSourceFactory.h"
#include "IManagerEventHandler.h"
namespace cAudio
@ -31,7 +32,7 @@ namespace cAudio
//!Returns an IAudio object by its "name" and 0 if the name is not found
virtual IAudioSource* getSoundByName(const char* name) = 0;
//!Releases "ALL" cAudio objects (but does not shutdown the manager)
virtual void release() = 0;
virtual void releaseAllSources() = 0;
//!Releases a single cAudio source
virtual void release(IAudioSource* source) = 0;
@ -43,14 +44,12 @@ namespace cAudio
//! Returns the name of the default system playback device.
virtual const char* getDefaultDeviceName() = 0;
//!Creates the cAudio object
virtual IAudioSource* createFromFile(const char* name, const char* pathToFile, bool stream = false) = 0;
//!Creates the cAudio object using the highest priority data source that has it
virtual IAudioSource* create(const char* name, const char* filename, bool stream = false) = 0;
//!Loads audio from memory or virtual file system
virtual IAudioSource* createFromMemory(const char* name, const char* data, size_t length, const char* extension) = 0;
//!Loads raw audio from memory.
virtual IAudioSource* createFromRaw(const char* name, const char* data, size_t length, unsigned int frequency, AudioFormats format) = 0;
//!Loads audio from alternative source.
virtual IAudioSource* createFromSource(const char* name, const char* source) = 0;
//!Register Audio Codec
virtual bool registerAudioDecoder(IAudioDecoderFactory* factory, const char* extension) = 0;
@ -62,15 +61,16 @@ namespace cAudio
virtual bool isAudioDecoderRegistered(const char* extension) = 0;
//!Returns a registered audio decoder factory
virtual IAudioDecoderFactory* getAudioDecoderFactory(const char* extension) = 0;
//!Register a alternative source
virtual bool registerSource(const char* identifier, IDataSource* datasource) = 0;
//! Unregister source (allows you to prevent creation of audio files from specific source)
//!Note that all current sound sources will still continue to use any currently used source.
//!Unregisters all Audio Codecs
//!Note that all current sound sources will still continue to use any currently allocated decoders.
//!Will NOT delete any user added factory instance, you must do that yourself
virtual void unRegisterSource(const char* source) = 0;
//!Checks if the source type is registered.
virtual bool isSourceRegistered(const char* source) = 0;
virtual void unRegisterAllAudioDecoders() = 0;
virtual bool registerDataSource(IDataSourceFactory* factory, const char* name, int priority) = 0;
virtual void unRegisterDataSource(const char* name) = 0;
virtual bool isDataSourceRegistered(const char* name) = 0;
virtual IDataSourceFactory* getDataSourceFactory(const char* name) = 0;
virtual void unRegisterAllDataSources() = 0;
//!Registers a new event handler to the manager
virtual void registerEventHandler(IManagerEventHandler* handler) = 0;

View File

@ -73,7 +73,7 @@ int main(int argc, char* argv[])
unsigned int startTick = clock();
for(unsigned int i=0; i<MAXAUDIOSOURCES; ++i)
{
AudioSources[i] = manager->createFromFile("bling", "../../media/bling.ogg", false);
AudioSources[i] = manager->create("bling", "../../media/bling.ogg", false);
}
unsigned int endTick = clock();
unsigned int elaspedTicks = endTick - startTick;
@ -118,7 +118,7 @@ int main(int argc, char* argv[])
cout << "Deleting " << MAXAUDIOSOURCES << " sources. \n";
startTick = clock();
//Delete all IAudio sounds
manager->release();
manager->releaseAllSources();
endTick = clock();
elaspedTicks = endTick - startTick;
cout << "Took " << (float)elaspedTicks/(float)CLOCKS_PER_SEC << " seconds. \n \n";