/* audio/sources.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include "audio/sources.h" #include "sys/sys.h" namespace audio { ALuint Sources::sources[MAXSOURCES]; bool Sources::source_available[MAXSOURCES]; void Sources::init() { int error; clear(); alGenSources(MAXSOURCES, sources); if ((error = alGetError()) != AL_NO_ERROR) { con_warn << "Error " << error << " initializing OpenAL sources!" << std::endl; return; } // all sources are available for use for (size_t i = MAXUISOURCES; i < MAXSOURCES; i++) { source_available[i] = true; } // reserve ui sound sources for (size_t i=0; i < MAXUISOURCES; i++) { source_available[i] = false; } } void Sources::shutdown() { // stop all sources for (size_t index= 0; index < MAXSOURCES; index++) { alSourceRewind(sources[index]); } alDeleteSources(MAXSOURCES, sources); clear(); } void Sources::clear() { memset(sources,0, sizeof(sources)); // all sources are available for use for (size_t i=0; i < MAXSOURCES; i++) { source_available[i] = false; } } size_t Sources::get() { for (size_t i= MAXUISOURCES; i < MAXSOURCES; i++) { if (source_available[i]) { source_available[i] = false; alSourcef(sources[i], AL_PITCH, 1.0); alSourcef(sources[i], AL_GAIN, 0.0); //con_debug << "reserved source " << i << std::endl; return i; } } return 0; } void Sources::remove(size_t index) { if ( (index < MAXUISOURCES ) || (MAXSOURCES <= index)) return; source_available[index] = true; alSourcef(sources[index], AL_GAIN, 0); alSourceRewind(sources[index]); //con_debug << "removed source " << index << std::endl; } }