Changeset 5896 for code/branches/core5/src/orxonox/sound/BaseSound.cc
- Timestamp:
- Oct 6, 2009, 11:12:01 PM (15 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
code/branches/core5/src/orxonox/sound/BaseSound.cc
r5891 r5896 21 21 * 22 22 * Author: 23 * 23 * Erwin 'vaiursch' Herrsche 24 24 * Co-authors: 25 * ...25 * Reto Grieder 26 26 * 27 27 */ 28 28 29 #include "SoundBase.h" 30 31 #include <string> 29 #include "BaseSound.h" 30 32 31 #include <vector> 33 32 #include <AL/alut.h> 34 33 #include <vorbis/vorbisfile.h> 35 34 36 #include "util/Math.h" 35 #include "core/CoreIncludes.h" 36 #include "core/GameMode.h" 37 37 #include "core/Resource.h" 38 #include "worldentities/WorldEntity.h"39 #include "SoundManager.h"40 38 41 39 namespace orxonox 42 40 { 43 SoundBase::SoundBase(WorldEntity* entity) 44 { 45 this->source_ = 0; 46 this->buffer_ = 0; 47 this->entity_ = entity; 48 49 SoundManager::getInstance().addSound(this); 50 } 51 52 SoundBase::~SoundBase() 53 { 54 alSourcei(this->source_, AL_BUFFER, 0); 55 alDeleteSources(1, &this->source_); 56 alDeleteBuffers(1, &this->buffer_); 57 } 58 59 void SoundBase::attachToEntity(WorldEntity* entity) 60 { 61 this->entity_ = entity; 62 this->update(); 63 } 64 65 void SoundBase::update() { 66 if(this->entity_ != NULL && alIsSource(this->source_)) { 67 const Vector3& pos = this->entity_->getPosition(); 68 alSource3f(this->source_, AL_POSITION, pos.x, pos.y, pos.z); 69 ALenum error = alGetError(); 70 if(error == AL_INVALID_VALUE) 71 COUT(2) << "Sound: OpenAL: Invalid sound position" << std::endl; 72 73 const Vector3& vel = this->entity_->getVelocity(); 74 alSource3f(this->source_, AL_VELOCITY, vel.x, vel.y, vel.z); 75 error = alGetError(); 76 if(error == AL_INVALID_VALUE) 77 COUT(2) << "Sound: OpenAL: Invalid sound velocity" << std::endl; 78 79 const Quaternion& orient = this->entity_->getOrientation(); 80 Vector3 at = orient.zAxis(); 81 alSource3f(this->source_, AL_DIRECTION, at.x, at.y, at.z); 82 error = alGetError(); 83 if(error == AL_INVALID_VALUE) 84 COUT(2) << "Sound: OpenAL: Invalid sound direction" << std::endl; 85 } 86 } 87 88 void SoundBase::play(bool loop) { 89 if(alIsSource(this->source_)) { 90 if(loop) 41 BaseSound::BaseSound() 42 : source_(0) 43 , buffer_(0) 44 , bPlayOnLoad_(false) 45 , bLoop_(false) 46 { 47 RegisterRootObject(BaseSound); 48 } 49 50 BaseSound::~BaseSound() 51 { 52 this->setSoundFile(""); 53 } 54 55 void BaseSound::play() 56 { 57 if (alIsSource(this->source_)) 58 { 59 if (this->bLoop_) 91 60 alSourcei(this->source_, AL_LOOPING, AL_TRUE); 92 61 else … … 94 63 alSourcePlay(this->source_); 95 64 96 if (alGetError() != AL_NO_ERROR)65 if (alGetError() != AL_NO_ERROR) 97 66 { 98 67 COUT(2) << "Sound: OpenAL: Error playin sound " << this->source_ << std::endl; … … 101 70 } 102 71 103 void SoundBase::stop() { 104 if(alIsSource(this->source_)) { 72 void BaseSound::stop() 73 { 74 if (alIsSource(this->source_)) 105 75 alSourceStop(this->source_); 106 107 } 108 109 void SoundBase::pause(){110 if (alIsSource(this->source_)) {76 } 77 78 void BaseSound::pause() 79 { 80 if (alIsSource(this->source_)) 111 81 alSourcePause(this->source_); 112 113 } 114 115 bool SoundBase::isPlaying(){116 if (alIsSource(this->source_)) {82 } 83 84 bool BaseSound::isPlaying() 85 { 86 if (alIsSource(this->source_)) 117 87 return getSourceState() == AL_PLAYING; 118 }119 88 return false; 120 89 } 121 90 122 bool SoundBase::isPaused() { 123 if(alIsSource(this->source_)) { 91 bool BaseSound::isPaused() 92 { 93 if (alIsSource(this->source_)) 124 94 return getSourceState() == AL_PAUSED; 125 }126 95 return true; 127 96 } 128 97 129 bool SoundBase::isStopped() { 130 if(alIsSource(this->source_)) { 98 bool BaseSound::isStopped() 99 { 100 if (alIsSource(this->source_)) 131 101 return getSourceState() == AL_INITIAL || getSourceState() == AL_STOPPED; 132 }133 102 return true; 134 103 } 135 104 136 bool SoundBase::loadFile(const std::string& filename) { 137 if(!SoundManager::getInstance().isSoundAvailable()) 138 { 139 COUT(3) << "Sound: not available, skipping " << filename << std::endl; 140 return false; 141 } 142 143 COUT(3) << "Sound: OpenAL ALUT: loading file " << filename << std::endl; 105 void BaseSound::setPlayOnLoad(bool val) 106 { 107 this->bPlayOnLoad_ = true; 108 this->play(); 109 } 110 111 void BaseSound::setSoundFile(const std::string& soundFile) 112 { 113 this->soundFile_ = soundFile; 114 if (!GameMode::playsSound()) 115 return; 116 117 if (soundFile.empty() && alIsSource(this->source_)) 118 { 119 // Unload sound 120 alSourcei(this->source_, AL_BUFFER, 0); 121 alDeleteSources(1, &this->source_); 122 alDeleteBuffers(1, &this->buffer_); 123 return; 124 } 125 126 COUT(3) << "Sound: OpenAL ALUT: loading file " << soundFile << std::endl; 144 127 // Get DataStream from the resources 145 shared_ptr<ResourceInfo> fileInfo = Resource::getInfo(filename); 146 if (fileInfo == NULL) { 147 COUT(2) << "Warning: Sound file '" << filename << "' not found" << std::endl; 148 return false; 149 } 150 DataStreamPtr stream = Resource::open(filename); 128 shared_ptr<ResourceInfo> fileInfo = Resource::getInfo(soundFile); 129 if (fileInfo == NULL) 130 { 131 COUT(2) << "Warning: Sound file '" << soundFile << "' not found" << std::endl; 132 return; 133 } 134 DataStreamPtr stream = Resource::open(soundFile); 151 135 // Read everything into a temporary buffer 152 136 char* buffer = new char[fileInfo->size]; … … 156 140 delete[] buffer; 157 141 158 if(this->buffer_ == AL_NONE) { 142 if (this->buffer_ == AL_NONE) 143 { 159 144 COUT(2) << "Sound: OpenAL ALUT: " << alutGetErrorString(alutGetError()) << std::endl; 160 if(filename.find("ogg", 0) != std::string::npos) 161 { 162 COUT(2) << "Sound: Trying fallback ogg loader" << std::endl; 163 this->buffer_ = loadOggFile(filename); 164 } 165 166 if(this->buffer_ == AL_NONE) 167 { 168 COUT(2) << "Sound: fallback ogg loader failed: " << alutGetErrorString(alutGetError()) << std::endl; 169 return false; 170 } 145 return; 146 //if (filename.find("ogg", 0) != std::string::npos) 147 //{ 148 // COUT(2) << "Sound: Trying fallback ogg loader" << std::endl; 149 // this->buffer_ = loadOggFile(filename); 150 //} 151 152 //if (this->buffer_ == AL_NONE) 153 //{ 154 // COUT(2) << "Sound: fallback ogg loader failed: " << alutGetErrorString(alutGetError()) << std::endl; 155 // return; 156 //} 171 157 } 172 158 173 159 alGenSources(1, &this->source_); 174 160 alSourcei(this->source_, AL_BUFFER, this->buffer_); 175 if(alGetError() != AL_NO_ERROR) { 176 COUT(2) << "Sound: OpenAL: Error loading sample file: " << filename << std::endl; 177 return false; 178 } 179 return true; 180 } 181 182 ALint SoundBase::getSourceState() { 161 if (alGetError() != AL_NO_ERROR) 162 { 163 COUT(2) << "Sound: OpenAL: Error loading sample file: " << soundFile << std::endl; 164 return; 165 } 166 167 alSource3f(this->source_, AL_POSITION, 0, 0, 0); 168 169 if (this->bPlayOnLoad_) 170 this->play(); 171 } 172 173 ALint BaseSound::getSourceState() 174 { 183 175 ALint state; 184 176 alGetSourcei(this->source_, AL_SOURCE_STATE, &state); … … 186 178 } 187 179 188 ALuint SoundBase::loadOggFile(const std::string& filename) 180 #if 0 // Not yet supported because of missing resource implementation 181 ALuint BaseSound::loadOggFile(const std::string& filename) 189 182 { 190 183 char inbuffer[4096]; … … 199 192 FILE* f = fopen(filename.c_str(), "rb"); 200 193 201 if (ov_open(f, &vf, NULL, 0) < 0)194 if (ov_open(f, &vf, NULL, 0) < 0) 202 195 { 203 196 COUT(2) << "Sound: libvorbisfile: File does not seem to be an Ogg Vorbis bitstream" << std::endl; … … 206 199 } 207 200 208 while (!eof)201 while (!eof) 209 202 { 210 203 long ret = ov_read(&vf, inbuffer, sizeof(inbuffer), 0, 2, 1, ¤t_section); … … 226 219 227 220 vorbisInfo = ov_info(&vf, -1); 228 if (vorbisInfo->channels == 1)221 if (vorbisInfo->channels == 1) 229 222 format = AL_FORMAT_MONO16; 230 223 else … … 237 230 return buffer; 238 231 } 232 #endif 233 239 234 } // namespace: orxonox
Note: See TracChangeset
for help on using the changeset viewer.