Changeset 5955 in orxonox.OLD for branches/powerups/src/lib/sound
- Timestamp:
- Dec 7, 2005, 1:05:10 PM (19 years ago)
- Location:
- branches/powerups/src/lib/sound
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/powerups/src/lib/sound/sound_buffer.cc
r5422 r5955 20 20 #include "sound_engine.h" 21 21 22 23 22 using namespace std; 24 25 23 26 24 ////////////////// … … 36 34 this->setName(fileName); 37 35 38 SoundEngine::getInstance()->addBuffer(this);39 40 36 ALenum format; 41 37 ALvoid* data; … … 47 43 alGenBuffers(1, &this->bufferID); 48 44 if ((result = alGetError()) != AL_NO_ERROR) 49 SoundEngine::PrintALErrorString(result);45 PRINTF(2)("%s\n", SoundEngine::getALErrorString(result)); 50 46 51 47 // read in the wav data … … 59 55 #endif 60 56 if ((result = alGetError()) != AL_NO_ERROR) 61 SoundEngine::PrintALErrorString(result);57 PRINTF(2)("%s\n", SoundEngine::getALErrorString(result)); 62 58 63 59 // send the loaded wav data to the buffer 64 60 alBufferData(this->bufferID, format, data, this->size, freq); 65 61 if ((result = alGetError()) != AL_NO_ERROR) 66 SoundEngine::PrintALErrorString(result);62 PRINTF(2)("%s\n", SoundEngine::getALErrorString(result)); 67 63 68 64 // remove the wav data (redundant) 69 65 alutUnloadWAV(format, data, this->size, freq); 70 66 if ((result = alGetError()) != AL_NO_ERROR) 71 SoundEngine::PrintALErrorString(result);67 PRINTF(2)("%s\n", SoundEngine::getALErrorString(result)); 72 68 } 73 69 -
branches/powerups/src/lib/sound/sound_engine.cc
r5871 r5955 27 27 #include "resource_manager.h" 28 28 #include "debug.h" 29 #include " ini_parser.h"29 #include "parser/ini_parser/ini_parser.h" 30 30 #include "globals.h" 31 31 … … 47 47 this->bufferList = NULL; 48 48 this->sourceList = NULL; 49 50 this->device = NULL; 51 this->context = NULL; 52 53 this->maxSourceCount = 32; 49 54 } 50 55 … … 64 69 while (this->sourceList->size() > 0) 65 70 delete dynamic_cast<SoundSource*>(this->sourceList->front()); 71 } 72 73 while(!this->ALSources.empty()) 74 { 75 alDeleteSources(1, &this->ALSources.top()); 76 this->ALSources.pop(); 66 77 } 67 78 … … 86 97 void SoundEngine::loadSettings(IniParser* iniParser) 87 98 { 99 const char* channels = iniParser->getVar(CONFIG_NAME_AUDIO_CHANNELS, CONFIG_SECTION_AUDIO, "32"); 100 this->maxSourceCount = atoi(channels); 88 101 const char* musicVolume = iniParser->getVar(CONFIG_NAME_MUSIC_VOLUME, CONFIG_SECTION_AUDIO, "80"); 89 102 this->musicVolume = atof(musicVolume)/100.0; … … 118 131 119 132 120 /** 121 * adds a SoundBuffer to the bufferList of the SoundEngine 122 * @param buffer The buffer to add to the bufferList 123 */ 124 void SoundEngine::addBuffer(SoundBuffer* buffer) 125 { 126 if (unlikely(this->bufferList == NULL)) 127 this->bufferList = ClassList::getList(CL_SOUND_BUFFER); 128 } 129 130 /** 131 * removes a SoundBuffer from the bufferList of the SoundEngine 132 * @param buffer The buffer to delete from the SoundEngine 133 */ 134 void SoundEngine::removeBuffer(SoundBuffer* buffer) 135 { 136 // look if there are any sources that have the buffer still loaded 137 if (this->sourceList != NULL) 138 { 139 list<BaseObject*>::iterator source; 140 for (source = this->sourceList->begin(); source != this->sourceList->end(); source++) 141 { 142 if (buffer == static_cast<SoundSource*>(*source)->getBuffer()) 143 delete (*source); 133 void SoundEngine::popALSource(ALuint& source) 134 { 135 if (source != 0) 136 return; 137 else 138 { 139 140 /// @TODO try to create more sources if needed 141 if (!this->ALSources.empty()) 142 { 143 144 source = this->ALSources.top(); 145 printf("test: : %d\n", source); 146 this->ALSources.pop(); 144 147 } 145 148 } 146 149 } 147 150 148 /**149 * adds a SoundSource to the sourceList of the SoundEngine150 * @param source The source to add to the sourceList151 */152 void SoundEngine::addSource(SoundSource* source)153 {154 this->sourceList = ClassList::getList(CL_SOUND_SOURCE);155 }156 151 157 152 /** … … 180 175 181 176 // updating all the Sources positions 182 if (likely(this->sourceList != NULL ))183 { 184 list<BaseObject*>:: iterator sourceIT;177 if (likely(this->sourceList != NULL || (this->sourceList = ClassList::getList(CL_SOUND_SOURCE)) != NULL)) 178 { 179 list<BaseObject*>::const_iterator sourceIT; 185 180 SoundSource* source; 186 181 for (sourceIT = this->sourceList->begin(); sourceIT != this->sourceList->end(); sourceIT++) 187 182 { 188 183 source = static_cast<SoundSource*>(*sourceIT); 189 if ( likely(source->getNode() != NULL))184 if (source->isPlaying()) 190 185 { 191 alSource3f(source->getID(), AL_POSITION, 192 source->getNode()->getAbsCoor().x, 193 source->getNode()->getAbsCoor().y, 194 source->getNode()->getAbsCoor().z); 195 alSource3f(source->getID(), AL_VELOCITY, 196 source->getNode()->getVelocity().x, 197 source->getNode()->getVelocity().y, 198 source->getNode()->getVelocity().z); 186 int play; 187 alGetSourcei(source->getID(), AL_SOURCE_STATE, &play); 188 if(play == AL_PLAYING) 189 { 190 if (likely(source->getNode() != NULL)) 191 { 192 alSource3f(source->getID(), AL_POSITION, 193 source->getNode()->getAbsCoor().x, 194 source->getNode()->getAbsCoor().y, 195 source->getNode()->getAbsCoor().z); 196 alSource3f(source->getID(), AL_VELOCITY, 197 source->getNode()->getVelocity().x, 198 source->getNode()->getVelocity().y, 199 source->getNode()->getVelocity().z); 200 } 201 202 } 203 else 204 { 205 source->stop(); 206 } 199 207 } 200 208 } … … 281 289 282 290 // INITIALIZING THE DEVICE: 291 #ifndef AL_VERSION_1_1 283 292 ALubyte deviceName[] = 293 #else 294 ALCchar deviceName[] = 295 #endif 284 296 #ifdef __WIN32__ 285 " native";297 "Direct3D"; 286 298 #else 287 "'( ( devices '( native artsnull ) ) )";299 "'( ( devices '( native null ) ) )"; 288 300 #endif 289 301 // … … 296 308 297 309 if ((result = alGetError()) != AL_NO_ERROR) 298 SoundEngine::PrintALErrorString(result);310 PRINTF(2)("%s\n", SoundEngine::getALErrorString(result)); 299 311 300 312 this->setDopplerValues(SOUND_DOPPLER_FACTOR, SOUND_DOPPLER_VELOCITY); 313 } 314 315 316 /** 317 * Allocates openAL sources 318 * @param count how many sources to allocate 319 * @returns true on success, false if at least one source could not be allocated 320 */ 321 bool SoundEngine::allocateSources(unsigned int count) 322 { 323 ALenum result; 324 // Setting default values. 325 for (unsigned int i = 0; i < count; i++) 326 { 327 ALuint source; 328 329 alGenSources(1, &source); 330 if ((result = alGetError()) != AL_NO_ERROR) 331 PRINTF(1)("Error Generating Sources: '%s'\n", SoundEngine::getALErrorString(result)); 332 333 alSourcef (source, AL_PITCH, 1.0 ); 334 alSourcef (source, AL_GAIN, this->getEffectsVolume() ); 335 alSourcei (source, AL_LOOPING, AL_FALSE ); 336 this->ALSources.push(source); 337 } 338 return true; 301 339 } 302 340 … … 305 343 * @param err The error found 306 344 */ 307 void SoundEngine::PrintALErrorString(ALenum err)345 const char* SoundEngine::getALErrorString(ALenum err) 308 346 { 309 347 switch(err) 310 348 { 311 349 case AL_NO_ERROR: 312 PRINTF(4)("AL_NO_ERROR\n"); 313 break; 314 350 return ("AL_NO_ERROR"); 315 351 case AL_INVALID_NAME: 316 PRINTF(2)("AL_INVALID_NAME\n"); 317 break; 318 352 return ("AL_INVALID_NAME"); 319 353 case AL_INVALID_ENUM: 320 PRINTF(2)("AL_INVALID_ENUM\n"); 321 break; 322 354 return ("AL_INVALID_ENUM"); 323 355 case AL_INVALID_VALUE: 324 PRINTF(2)("AL_INVALID_VALUE\n"); 325 break; 326 356 return ("AL_INVALID_VALUE"); 327 357 case AL_INVALID_OPERATION: 328 PRINTF(2)("AL_INVALID_OPERATION\n"); 329 break; 330 358 return ("AL_INVALID_OPERATION"); 331 359 case AL_OUT_OF_MEMORY: 332 PRINTF(2)("AL_OUT_OF_MEMORY\n"); 333 break; 360 return ("AL_OUT_OF_MEMORY"); 334 361 }; 335 362 } … … 337 364 void SoundEngine::listDevices() 338 365 { 339 340 366 printf("%s\n",(const char*)alcGetString(NULL, ALC_DEVICE_SPECIFIER)); 341 367 } -
branches/powerups/src/lib/sound/sound_engine.h
r5819 r5955 14 14 15 15 #include <list> 16 #include <stack> 16 17 17 18 #define SOUND_DOPPLER_FACTOR 0.001 //!< A factor for the audible doppler effect … … 22 23 class IniParser; 23 24 25 24 26 //! A class that handles audio via the openAudioLibrary 25 27 class SoundEngine : public BaseObject { 26 27 28 public: 28 29 virtual ~SoundEngine(); … … 47 48 48 49 // administrative 49 void addBuffer(SoundBuffer* buffer); 50 void removeBuffer(SoundBuffer* buffer); 51 void addSource(SoundSource* source); 50 void popALSource(ALuint& source); 51 void pushALSource(ALuint& source) { if (source != 0) this->ALSources.push(source); }; 52 52 53 53 void flushUnusedBuffers(); 54 54 void flushAllBuffers(); 55 55 void flushAllSources(); 56 56 57 bool initAudio(); 58 bool allocateSources(unsigned int count); 57 59 58 60 // error handling: 59 static void PrintALErrorString(ALenum err); 60 // static void PrintALCErrorString(ALenum err); 61 61 static const char* getALErrorString(ALenum err); 62 62 63 63 private: 64 64 SoundEngine(); 65 65 66 void listDevices(); 66 67 67 68 private: 68 static SoundEngine* singletonRef; //!< Reference to this class69 static SoundEngine* singletonRef; //!< Reference to this class 69 70 70 ALCdevice* device; //!< the used audio-device.71 ALCcontext* context; //!< the context, currently in use.71 ALCdevice* device; //!< the used audio-device. 72 ALCcontext* context; //!< the context, currently in use. 72 73 73 float musicVolume; //!< the maximum volume of the music in % (0f,1f]74 float effectsVolume; //!< the maximum volume of sound-effects in % (0f,1f]75 PNode* listener; //!< The listener of the Scene74 float musicVolume; //!< the maximum volume of the music in % (0f,1f] 75 float effectsVolume; //!< the maximum volume of sound-effects in % (0f,1f] 76 PNode* listener; //!< The listener of the Scene 76 77 77 std::list<BaseObject*>* bufferList; //!< A list of buffers78 std::list<BaseObject*>* sourceList; //!< A list for all the sources in the scene.78 const std::list<BaseObject*>* bufferList; //!< A list of buffers 79 const std::list<BaseObject*>* sourceList; //!< A list for all the sources in the scene. 79 80 80 81 unsigned int maxSourceCount; //!< How many Sources is the Maximum 82 std::stack<ALuint> ALSources; //!< A list of real openAL-Sources, the engine allocates, and stores for reuse. 81 83 }; 82 84 -
branches/powerups/src/lib/sound/sound_source.cc
r5386 r5955 18 18 #include "sound_source.h" 19 19 #include "sound_engine.h" 20 20 21 #include "alincl.h" 21 22 #include "compiler.h" … … 33 34 34 35 // adding the Source to the SourcesList of the SoundEngine 35 SoundEngine::getInstance()->addSource(this);36 37 36 this->buffer = buffer; 38 37 this->sourceNode = sourceNode; 39 38 40 alGenSources(1, &this->sourceID); 41 if ((result = alGetError()) != AL_NO_ERROR) 42 SoundEngine::PrintALErrorString(result); 43 if (this->buffer != NULL) 44 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 45 alSourcef (this->sourceID, AL_PITCH, 1.0 ); 46 alSourcef (this->sourceID, AL_GAIN, SoundEngine::getInstance()->getEffectsVolume() ); 47 alSourcei (sourceID, AL_LOOPING, AL_FALSE ); 39 this->sourceID = 0; 40 this->bPlay = false; 48 41 } 49 42 … … 53 46 SoundSource::~SoundSource() 54 47 { 55 //SoundEngine::getInstance()->removeSource(this); 56 alDeleteSources(1, &this->sourceID); 48 SoundEngine::getInstance()->pushALSource(this->sourceID); 57 49 } 58 50 … … 62 54 void SoundSource::play() 63 55 { 56 if (this->sourceID == 0) 57 SoundEngine::getInstance()->popALSource(this->sourceID); 64 58 alSourcePlay(this->sourceID); 59 this->bPlay = true; 65 60 } 66 61 … … 71 66 void SoundSource::play(const SoundBuffer* buffer) 72 67 { 68 if (unlikely(this->sourceID == 0)) 69 SoundEngine::getInstance()->popALSource(this->sourceID); 70 71 printf("%d\n",sourceID); 73 72 alSourceStop(this->sourceID); 74 73 alSourcei (this->sourceID, AL_BUFFER, buffer->getID()); … … 77 76 if (unlikely(this->buffer != NULL)) 78 77 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 78 this->bPlay = true; 79 79 } 80 80 … … 84 84 void SoundSource::stop() 85 85 { 86 this->bPlay = false; 86 87 alSourceStop(this->sourceID); 88 SoundEngine::getInstance()->pushALSource(this->sourceID); 87 89 } 88 90 -
branches/powerups/src/lib/sound/sound_source.h
r5386 r5955 31 31 /** @returns The ID of this Source */ 32 32 inline ALuint getID() const { return this->sourceID; } 33 /** @returns true, if the Source is Playing */ 34 inline bool isPlaying() const { return this->bPlay; }; 33 35 /** @returns the SoundBuffer of this Source */ 34 36 inline const SoundBuffer* getBuffer() const { return this->buffer; } … … 39 41 40 42 private: 43 bool bPlay; //!< If the Source is Playing. 41 44 ALuint sourceID; //!< The ID of the Source 42 45 const SoundBuffer* buffer; //!< The buffer to play in this source.
Note: See TracChangeset
for help on using the changeset viewer.