Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core6/src/orxonox/sound/SoundManager.h @ 9578

Last change on this file since 9578 was 9578, checked in by landauf, 11 years ago

made some classes (mostly singletons) inherit from Configurable instead of OrxonoxClass when they only need the config value facilities

  • Property svn:eol-style set to native
File size: 5.3 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:
23 *       Erwin 'vaiursch' Herrsche
[6417]24 *       Kevin Young
25 *       Reto Grieder
[3060]26 *   Co-authors:
27 *      ...
28 */
[6417]29
[3196]30#ifndef _SoundManager_H__
31#define _SoundManager_H__
[3060]32
33#include "OrxonoxPrereqs.h"
34
[3196]35#include <list>
[6417]36#include <map>
37#include <string>
38#include <boost/shared_ptr.hpp>
39
[3370]40#include "util/Singleton.h"
[9578]41#include "core/config/Configurable.h"
[9557]42#include "core/object/SmartPtr.h"
[3196]43
[6417]44// tolua_begin
[3060]45namespace orxonox
46{
[6417]47    //! Enum for the sound type.
48    namespace SoundType
[3060]49    {
[6417]50        enum Value
51        {
52            All     = 0,
53            Music   = 1,
54            Effects = 2
55        };
56    }
57
58    //! The SoundManager class manages the OpenAL device, context and listener position.
59    class _OrxonoxExport SoundManager
60    // tolua_end
[9578]61        : public Singleton<SoundManager>, public Configurable
[6417]62    { // tolua_export
[3370]63        friend class Singleton<SoundManager>;
[6417]64
[3060]65    public:
66        SoundManager();
67        ~SoundManager();
68
[6417]69        void preUpdate(const Clock& time);
70        void setConfigValues();
71
72        // tolua_begin
73        static SoundManager& getInstance() { return Singleton<SoundManager>::getInstance(); }
[8351]74        static bool exists() { return Singleton<SoundManager>::exists(); }
[6417]75
76        std::string getDeviceName(unsigned int index) const
77            { return index < this->deviceNames_.size() ? this->deviceNames_[index] : std::string(); }
78        // tolua_end
79
[5929]80        void setListenerPosition(const Vector3& position);
81        void setListenerOrientation(const Quaternion& orientation);
82
[6417]83        void registerAmbientSound(AmbientSound* newAmbient);
84        void unregisterAmbientSound(AmbientSound* oldAmbient);
85        void pauseAmbientSound(AmbientSound* ambient);
86
87        // tolua_begin
88        void setVolume(float vol, SoundType::Value type);
89        float getVolume(SoundType::Value type);
90        float getRealVolume(SoundType::Value type);
91
92        void toggleMute(SoundType::Value type);
93        bool getMute(SoundType::Value type);
94        // tolua_end
95
96        shared_ptr<SoundBuffer> getSoundBuffer(const std::string& filename);
97        void releaseSoundBuffer(const shared_ptr<SoundBuffer>& buffer, bool bPoolBuffer);
98
99        ALuint getSoundSource(BaseSound* object);
100        void releaseSoundSource(ALuint source);
101
102        static std::string getALErrorString(ALenum error);
103
[3060]104    private:
[6417]105        void processCrossFading(float dt);
106        void fadeIn(const SmartPtr<AmbientSound>& sound);
107        void fadeOut(const SmartPtr<AmbientSound>& sound);
108
109        void checkFadeStepValidity();
110
111        void checkVolumeValidity(SoundType::Value type);
112        void checkSoundVolumeValidity()   { this->checkVolumeValidity(SoundType::All); }
113        void checkAmbientVolumeValidity() { this->checkVolumeValidity(SoundType::Music); }
114        void checkEffectsVolumeValidity() { this->checkVolumeValidity(SoundType::Effects); }
115        void updateVolume(SoundType::Value type);
116
117        unsigned int createSoundSources(unsigned int n);
118
119        // OpenAL device/context related
120        std::vector<std::string> deviceNames_;
[3280]121        ALCdevice* device_;
[3060]122        ALCcontext* context_;
123
[6417]124        // Ambient sound related
125        typedef std::list<std::pair<AmbientSound*, bool> > AmbientList;
126        AmbientList                        ambientSounds_;
127        //! Absolute change per second (0.1 means 10% of the nominal volume) for cross fading
128        float                              crossFadeStep_;
129        std::list<SmartPtr<AmbientSound> > fadeInList_;
130        std::list<SmartPtr<AmbientSound> > fadeOutList_;
131
132        // Volume related
133        float volume_[3];
134        float mute_[3];
135
136        // Sound buffer related
137        static const unsigned int maxEffectsPoolSize_s = 40 * 1024 * 1024;
138        unsigned int effectsPoolSize_;
139        typedef std::list<shared_ptr<SoundBuffer> > EffectsPoolList;
140        EffectsPoolList effectsPool_;
141        typedef std::map<std::string, shared_ptr<SoundBuffer> > SoundBufferMap;
142        SoundBufferMap soundBuffers_;
143
144        // Sound source related
145        unsigned int minSources_;
146        unsigned int maxSources_;
147        std::vector<ALuint> availableSoundSources_;
148        std::vector<std::pair<ALuint, BaseSound*> > usedSoundSources_;
[7858]149
[7855]150        bool bDestructorCalled_; ///< Becomes true if the destructor is called - used to prevent ambient sounds from registering after the lists were cleared
[6417]151
[3370]152        static SoundManager* singletonPtr_s;
[6417]153    }; // tolua_export
154} // tolua_export
[3060]155
[3196]156#endif /* _SoundManager_H__ */
Note: See TracBrowser for help on using the repository browser.