IAudioSource* cAudioManager::create(const char* name, const char* filename, bool stream) { if(!Initialized) return NULL; cAudioMutexBasicLock lock(Mutex); cAudioString audioName = safeCStr(name); cAudioString path = safeCStr(filename); cAudioString ext = getExt(path); IAudioDecoderFactory* factory = getAudioDecoderFactory(ext.c_str()); if(!factory) { getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): No decoder could be found for (.%s).", audioName.c_str(), ext.c_str()); return NULL; } for(size_t i=0; i<dataSourcePriorityList.size(); ++i) { const cAudioString dataSourceName = dataSourcePriorityList[i].second; IDataSourceFactory* dataFactory = datasourcemap[dataSourceName]; if(dataFactory) { IDataSource* source = dataFactory->CreateDataSource(filename, stream); if(source && source->isValid()) { IAudioDecoder* decoder = factory->CreateAudioDecoder(source); source->drop(); IAudioSource* audio = createAudioSource(decoder, audioName, dataSourceName); if(audio != NULL) return audio; if(source) source->drop(); return NULL; } } } return NULL; }
IAudioBuffer* cAudioManager::createBuffer(const char* filename) { if(!Initialized) return NULL; cAudioMutexBasicLock lock(Mutex); cAudioString path = fromUTF8(filename); cAudioString ext = getExt(path); IAudioDecoderFactory* factory = getAudioDecoderFactory(toUTF8(ext)); if(!factory) { getLogger()->logError("AudioManager", "Failed to create Audio Buffer: No decoder could be found for (.%s).", toUTF8(ext)); return NULL; } for(size_t i=0; i<dataSourcePriorityList.size(); ++i) { const cAudioString dataSourceName = dataSourcePriorityList[i].second; IDataSourceFactory* dataFactory = datasourcemap[dataSourceName]; if(dataFactory) { IDataSource* source = dataFactory->CreateDataSource(filename, false); if(source && source->isValid()) { IAudioDecoder* decoder = factory->CreateAudioDecoder(source); source->drop(); IAudioBuffer* buffer = CAUDIO_NEW cAudioBuffer(decoder); if(buffer != NULL) return buffer; //if(source) // source->drop(); return NULL; } } } return NULL; }