Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2/src/orxonox/sound/BaseSound.cc @ 6254

Last change on this file since 6254 was 6254, checked in by rgrieder, 14 years ago

Added sound effects pooling. This should avoid long respawns (due to sound loading) if there are no more enemies.

  • Property svn:eol-style set to native
File size: 6.1 KB
RevLine 
[3060]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
[5896]23 *      Erwin 'vaiursch' Herrsche
[3060]24 *   Co-authors:
[5896]25 *      Reto Grieder
[3060]26 *
27 */
[3196]28
[5896]29#include "BaseSound.h"
[3196]30
[6117]31#include <cassert>
[3060]32#include <vector>
[6203]33#include <al.h>
[3060]34
[5896]35#include "core/CoreIncludes.h"
36#include "core/GameMode.h"
[5695]37#include "core/Resource.h"
[6117]38#include "core/XMLPort.h"
[6203]39#include "SoundBuffer.h"
[6186]40#include "SoundManager.h"
[3060]41
[5738]42namespace orxonox
[3060]43{
[5896]44    BaseSound::BaseSound()
[5899]45        : audioSource_(0)
[6254]46        , bPooling_(false)
[6203]47        , volume_(1.0)
[5896]48        , bLoop_(false)
[6117]49        , state_(Stopped)
[6222]50        , pitch_ (1.0)
[3060]51    {
[5896]52        RegisterRootObject(BaseSound);
[6117]53
54        if (GameMode::playsSound())
55        {
56            alGenSources(1, &this->audioSource_);
57            assert(this->audioSource_ != 0);
58        }
[3060]59    }
60
[5896]61    BaseSound::~BaseSound()
[3060]62    {
[5899]63        this->setSource("");
[6117]64        if (GameMode::playsSound())
65            alDeleteSources(1, &this->audioSource_);
[3060]66    }
67
[6117]68    void BaseSound::XMLPortExtern(Element& xmlelement, XMLPort::Mode mode)
69    {
70        XMLPortParam(BaseSound, "volume", setVolume,  getVolume,  xmlelement, mode);
71        XMLPortParam(BaseSound, "loop",   setLooping, getLooping, xmlelement, mode);
[6188]72        XMLPortParam(BaseSound, "play",   setPlaying, isPlaying,  xmlelement, mode);
[6117]73        XMLPortParam(BaseSound, "source", setSource,  getSource,  xmlelement, mode);
74    }
75
[5896]76    void BaseSound::play()
[3060]77    {
[6117]78        if (!this->isPlaying() && GameMode::showsGraphics())
[5896]79        {
[6117]80            this->state_ = Playing;
[5899]81            alSourcePlay(this->audioSource_);
[3108]82
[6203]83            if (int error = alGetError())
84                COUT(2) << "Sound: Error playing sound: " << error << std::endl;
[3060]85        }
86    }
87
[5896]88    void BaseSound::stop()
89    {
[6117]90        this->state_ = Stopped;
91        if (GameMode::playsSound())
[5899]92            alSourceStop(this->audioSource_);
[3060]93    }
94
[5896]95    void BaseSound::pause()
96    {
[6117]97        if (this->isStopped())
98            return;
99        this->state_ = Paused;
100        if (GameMode::playsSound())
[5899]101            alSourcePause(this->audioSource_);
[3060]102    }
103
[6117]104    void BaseSound::setVolume(float vol)
[5896]105    {
[6117]106        if (vol > 1 || vol < 0)
107        {
108            COUT(2) << "Sound warning: volume out of range, cropping value." << std::endl;
109            vol = vol > 1 ? 1 : vol;
110            vol = vol < 0 ? 0 : vol;
111        }
112        this->volume_ = vol;
[6186]113       
114        this->updateVolume();
[3060]115    }
[6184]116   
[6186]117    float BaseSound::getVolumeGain()
[6184]118    {
[6186]119        return SoundManager::getInstance().getVolume(SoundType::none);
[6184]120    }
121   
[6186]122    void BaseSound::updateVolume(void)
[6184]123    {
[6186]124        if (alIsSource(this->audioSource_))
[6204]125        {
[6186]126            alSourcef(this->audioSource_, AL_GAIN, this->volume_*this->getVolumeGain());
[6204]127            if (int error = alGetError())
128                COUT(2) << "Sound: Error setting volume: " << error << std::endl;
129        }
[6184]130    }
[3060]131
[6117]132    void BaseSound::setLooping(bool val)
[5896]133    {
[6117]134        this->bLoop_ = val;
135        if (GameMode::playsSound())
136            alSourcei(this->audioSource_, AL_LOOPING, (val ? AL_TRUE : AL_FALSE));
[3060]137    }
138
[6202]139    void BaseSound::setPitch(float pitch)
140    {
141        if (pitch > 2 || pitch < 0.5)
142        {
143            COUT(2) << "Sound warning: pitch out of range, cropping value." << std::endl;
144            pitch = pitch > 2 ? 2 : pitch;
145            pitch = pitch < 0.5 ? 0.5 : pitch;
146        }       
147        this->pitch_ = pitch;
148        if (GameMode::playsSound())
[6204]149        {
150            if (int error = alGetError())
151                COUT(2) << "Sound: Error setting pitch: " << error << std::endl;
[6205]152            alSourcef(this->audioSource_, AL_PITCH, pitch);
[6204]153        }
[6202]154    }
155
[5899]156    void BaseSound::setSource(const std::string& source)
[5896]157    {
[6117]158        if (!GameMode::playsSound() || source == this->source_) 
159        {
160            this->source_ = source;
[5896]161            return;
[6117]162        }
[5896]163
[6203]164        if (this->soundBuffer_ != NULL)
[3060]165        {
[6117]166            alSourceStop(this->audioSource_);
167            // Unload old sound first
[5899]168            alSourcei(this->audioSource_, AL_BUFFER, 0);
[6254]169            SoundManager::getInstance().releaseSoundBuffer(this->soundBuffer_, this->bPooling_);
[6203]170            this->soundBuffer_.reset();
[3060]171        }
172
[6117]173        this->source_ = source;
[6232]174        if (source_.empty())
[6117]175            return;
176
[5695]177        // Get DataStream from the resources
[5899]178        shared_ptr<ResourceInfo> fileInfo = Resource::getInfo(source);
[5896]179        if (fileInfo == NULL)
180        {
[6117]181            COUT(2) << "Sound: Warning: Sound file '" << source << "' not found" << std::endl;
[5896]182            return;
[5695]183        }
184
[6203]185        this->soundBuffer_ = SoundManager::getInstance().getSoundBuffer(fileInfo);
186        if (this->soundBuffer_ == NULL)
187            return;
[5695]188
[6203]189        alSourcei(this->audioSource_, AL_BUFFER, this->soundBuffer_->getBuffer());
[5896]190        if (alGetError() != AL_NO_ERROR)
191        {
[5899]192            COUT(2) << "Sound: OpenAL: Error loading sample file: " << source << std::endl;
[5896]193            return;
[3060]194        }
[5896]195
[5899]196        alSource3f(this->audioSource_, AL_POSITION,  0, 0, 0);
[6186]197        this->updateVolume();
[6202]198        this->setPitch(this->getPitch());
[6204]199        this->setLooping(getLooping());
[6117]200        if (this->isPlaying() || this->isPaused())
[6234]201        {
202            alSourcePlay(this->audioSource_);
203            if (int error = alGetError())
204                COUT(2) << "Sound: Error playing sound: " << error << std::endl;
205        }
[6117]206        if (this->isPaused())
[6234]207            alSourcePause(this->audioSource_);
[3060]208    }
[6117]209}
Note: See TracBrowser for help on using the repository browser.