OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
soundmanagerimp.hpp
Go to the documentation of this file.
1 #ifndef GAME_SOUND_SOUNDMANAGER_H
2 #define GAME_SOUND_SOUNDMANAGER_H
3 
4 #include <memory>
5 #include <string>
6 #include <utility>
7 #include <deque>
8 #include <map>
9 #include <unordered_map>
10 
12 
14 
15 #include "../mwbase/soundmanager.hpp"
16 
17 namespace VFS
18 {
19  class Manager;
20 }
21 
22 namespace ESM
23 {
24  struct Sound;
25 }
26 
27 namespace MWSound
28 {
29  class Sound_Output;
30  struct Sound_Decoder;
31  class Sound;
32  class Stream;
33  class Sound_Buffer;
34 
35  enum Environment {
38  };
39  // Extra play flags, not intended for caller use
40  enum PlayModeEx {
41  Play_2D = 0,
42  Play_3D = 1<<31
43  };
44 
46  {
48 
50  std::unique_ptr<Sound_Output> mOutput;
51 
52  // Caches available music tracks by <playlist name, (sound files) >
53  std::unordered_map<std::string, std::vector<std::string>> mMusicFiles;
54  std::unordered_map<std::string, std::vector<int>> mMusicToPlay; // A list with music files not yet played
55  std::string mLastPlayedMusic; // The music file that was last played
56 
58  float mSFXVolume;
59  float mMusicVolume;
60  float mVoiceVolume;
62 
67  std::string mNearWaterIndoorID;
68  std::string mNearWaterOutdoorID;
69  typedef std::unique_ptr<std::deque<Sound_Buffer> > SoundBufferList;
70  // List of sound buffers, grown as needed. New enties are added to the
71  // back, allowing existing Sound_Buffer references/pointers to remain
72  // valid.
77 
78  typedef std::unordered_map<std::string,Sound_Buffer*> NameBufferMap;
80 
81  // NOTE: unused buffers are stored in front-newest order.
82  typedef std::deque<Sound_Buffer*> SoundList;
84 
85  std::unique_ptr<std::deque<Sound>> mSounds;
86  std::vector<Sound*> mUnusedSounds;
87 
88  std::unique_ptr<std::deque<Stream>> mStreams;
89  std::vector<Stream*> mUnusedStreams;
90 
91  typedef std::pair<MWBase::Sound*,Sound_Buffer*> SoundBufferRefPair;
92  typedef std::vector<SoundBufferRefPair> SoundBufferRefPairList;
93  typedef std::map<MWWorld::ConstPtr,SoundBufferRefPairList> SoundMap;
95 
96  typedef std::map<MWWorld::ConstPtr,Stream*> SaySoundMap;
98 
99  typedef std::vector<Stream*> TrackList;
101 
103  std::string mCurrentPlaylist;
104 
106  osg::Vec3f mListenerPos;
107  osg::Vec3f mListenerDir;
108  osg::Vec3f mListenerUp;
109 
111 
114 
115  Sound_Buffer *insertSound(const std::string &soundId, const ESM::Sound *sound);
116 
117  Sound_Buffer *lookupSound(const std::string &soundId) const;
118  Sound_Buffer *loadSound(const std::string &soundId);
119 
120  // returns a decoder to start streaming
121  DecoderPtr loadVoice(const std::string &voicefile);
122 
123  Sound *getSoundRef();
124  Stream *getStreamRef();
125 
126  Stream *playVoice(DecoderPtr decoder, const osg::Vec3f &pos, bool playlocal);
127 
128  void streamMusicFull(const std::string& filename);
129  void advanceMusic(const std::string& filename);
130  void startRandomTitle();
131 
132  void updateSounds(float duration);
133  void updateRegionSound(float duration);
134  void updateWaterSound(float duration);
135  void updateMusic(float duration);
136 
137  std::string mNextMusic;
138 
139  float volumeFromType(Type type) const;
140 
141  SoundManager(const SoundManager &rhs);
142  SoundManager& operator=(const SoundManager &rhs);
143 
144  protected:
146  friend class OpenAL_Output;
147 
148  void stopSound(Sound_Buffer *sfx, const MWWorld::ConstPtr &ptr);
150 
151  public:
152  SoundManager(const VFS::Manager* vfs, const std::map<std::string, std::string>& fallbackMap, bool useSound);
153  virtual ~SoundManager();
154 
155  virtual void processChangedSettings(const Settings::CategorySettingVector& settings);
156 
157  virtual void stopMusic();
159 
160  virtual void streamMusic(const std::string& filename);
163 
164  virtual bool isMusicPlaying();
166 
167  virtual void playPlaylist(const std::string &playlist);
170 
171  virtual void say(const MWWorld::ConstPtr &reference, const std::string& filename);
174 
175  virtual void say(const std::string& filename);
178 
179  virtual bool sayDone(const MWWorld::ConstPtr &reference=MWWorld::ConstPtr()) const;
181 
182  virtual void stopSay(const MWWorld::ConstPtr &reference=MWWorld::ConstPtr());
184 
185  virtual float getSaySoundLoudness(const MWWorld::ConstPtr& reference) const;
189 
190  virtual Stream *playTrack(const DecoderPtr& decoder, Type type);
192 
193  virtual void stopTrack(Stream *stream);
195 
196  virtual double getTrackTimeDelay(Stream *stream);
200 
201  virtual Sound *playSound(const std::string& soundId, float volume, float pitch, Type type=Type::Sfx, PlayMode mode=PlayMode::Normal, float offset=0);
204 
205  virtual Sound *playSound3D(const MWWorld::ConstPtr &reference, const std::string& soundId,
206  float volume, float pitch, Type type=Type::Sfx,
207  PlayMode mode=PlayMode::Normal, float offset=0);
210 
211  virtual Sound *playSound3D(const osg::Vec3f& initialPos, const std::string& soundId,
212  float volume, float pitch, Type type, PlayMode mode, float offset=0);
215 
216  virtual void stopSound(Sound *sound);
219 
220  virtual void stopSound3D(const MWWorld::ConstPtr &reference, const std::string& soundId);
222 
223  virtual void stopSound3D(const MWWorld::ConstPtr &reference);
225 
226  virtual void stopSound(const MWWorld::CellStore *cell);
228 
229  virtual void stopSound(const std::string& soundId);
231 
232  virtual void fadeOutSound3D(const MWWorld::ConstPtr &reference, const std::string& soundId, float duration);
237 
238  virtual bool getSoundPlaying(const MWWorld::ConstPtr &reference, const std::string& soundId) const;
240 
241  virtual void pauseSounds(int types);
243 
244  virtual void resumeSounds(int types);
246 
247  virtual void update(float duration);
248 
249  virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater);
250 
251  virtual void updatePtr (const MWWorld::ConstPtr& old, const MWWorld::ConstPtr& updated);
252 
253  virtual void clear();
254  };
255 }
256 
257 #endif
float mNearWaterIndoorTolerance
Definition: soundmanagerimp.hpp:65
Stream * mMusic
Definition: soundmanagerimp.hpp:102
float mNearWaterOutdoorTolerance
Definition: soundmanagerimp.hpp:66
Stream * getStreamRef()
Definition: soundmanagerimp.cpp:280
NameBufferMap mBufferNameMap
Definition: soundmanagerimp.hpp:79
std::vector< Stream * > mUnusedStreams
Definition: soundmanagerimp.hpp:89
Definition: openal_output.hpp:21
int mNearWaterRadius
Definition: soundmanagerimp.hpp:63
std::map< MWWorld::ConstPtr, Stream * > SaySoundMap
Definition: soundmanagerimp.hpp:96
void stopSound(Sound_Buffer *sfx, const MWWorld::ConstPtr &ptr)
Stop the given object from playing given sound buffer.
Definition: soundmanagerimp.cpp:684
Definition: soundmanagerimp.hpp:37
Definition: sound_buffer.hpp:10
void updateRegionSound(float duration)
Definition: soundmanagerimp.cpp:795
int mPausedSoundTypes
Definition: soundmanagerimp.hpp:110
virtual void say(const MWWorld::ConstPtr &reference, const std::string &filename)
Definition: soundmanagerimp.cpp:465
osg::Vec3f mListenerUp
Definition: soundmanagerimp.hpp:108
float mSFXVolume
Definition: soundmanagerimp.hpp:58
virtual bool isMusicPlaying()
Returns true if music is playing.
Definition: soundmanagerimp.cpp:426
virtual void clear()
Definition: soundmanagerimp.cpp:1252
SoundBufferList mSoundBuffers
Definition: soundmanagerimp.hpp:73
virtual ~SoundManager()
Definition: soundmanagerimp.cpp:120
const VFS::Manager * mVFS
Definition: soundmanagerimp.hpp:47
osg::Vec3f mListenerPos
Definition: soundmanagerimp.hpp:106
std::unique_ptr< std::deque< Sound_Buffer > > SoundBufferList
Definition: soundmanagerimp.hpp:69
contains settings imported from the Morrowind INI file.
Definition: fallback.hpp:12
std::unordered_map< std::string, std::vector< std::string > > mMusicFiles
Definition: soundmanagerimp.hpp:53
std::map< MWWorld::ConstPtr, SoundBufferRefPairList > SoundMap
Definition: soundmanagerimp.hpp:93
MWSound::Sound Sound
Definition: soundmanager.hpp:56
float mVoiceVolume
Definition: soundmanagerimp.hpp:60
void streamMusicFull(const std::string &filename)
Definition: soundmanagerimp.cpp:363
PlayMode
Definition: soundmanager.hpp:23
virtual Stream * playTrack(const DecoderPtr &decoder, Type type)
Play a 2D audio track, using a custom decoder.
Definition: soundmanagerimp.cpp:538
Definition: sound.hpp:95
std::vector< Stream * > TrackList
Definition: soundmanagerimp.hpp:99
virtual void stopSay(const MWWorld::ConstPtr &reference=MWWorld::ConstPtr())
Stop an actor speaking.
Definition: soundmanagerimp.cpp:526
std::vector< SoundBufferRefPair > SoundBufferRefPairList
Definition: soundmanagerimp.hpp:92
Sound * mNearWaterSound
Definition: soundmanagerimp.hpp:113
osg::Vec3f mListenerDir
Definition: soundmanagerimp.hpp:107
float mFootstepsVolume
Definition: soundmanagerimp.hpp:61
std::set< std::pair< std::string, std::string > > CategorySettingVector
Definition: settings.hpp:11
Definition: soundmanagerimp.hpp:42
virtual void updatePtr(const MWWorld::ConstPtr &old, const MWWorld::ConstPtr &updated)
Definition: soundmanagerimp.cpp:1169
virtual bool getSoundPlaying(const MWWorld::ConstPtr &reference, const std::string &soundId) const
Is the given sound currently playing on the given object?
Definition: soundmanagerimp.cpp:759
float mMasterVolume
Definition: soundmanagerimp.hpp:57
virtual double getTrackTimeDelay(Stream *stream)
Definition: soundmanagerimp.cpp:566
std::unique_ptr< Sound_Output > mOutput
Definition: soundmanagerimp.hpp:50
virtual void update(float duration)
Definition: soundmanagerimp.cpp:1106
virtual bool sayDone(const MWWorld::ConstPtr &reference=MWWorld::ConstPtr()) const
Is actor not speaking?
Definition: soundmanagerimp.cpp:514
std::unordered_map< std::string, Sound_Buffer * > NameBufferMap
Definition: soundmanagerimp.hpp:78
virtual void stopTrack(Stream *stream)
Stop the given audio track from playing.
Definition: soundmanagerimp.cpp:557
Definition: soundmanagerimp.hpp:41
std::pair< MWBase::Sound *, Sound_Buffer * > SoundBufferRefPair
Definition: soundmanagerimp.hpp:91
virtual void playPlaylist(const std::string &playlist)
Definition: soundmanagerimp.cpp:431
SoundManager & operator=(const SoundManager &rhs)
virtual float getSaySoundLoudness(const MWWorld::ConstPtr &reference) const
Definition: soundmanagerimp.cpp:485
Sound_Buffer * lookupSound(const std::string &soundId) const
Definition: soundmanagerimp.cpp:173
Definition: soundmanagerimp.hpp:36
Mutable state of a cell.
Definition: cellstore.hpp:51
float volumeFromType(Type type) const
Definition: soundmanagerimp.cpp:329
SoundList mUnusedBuffers
Definition: soundmanagerimp.hpp:83
Pointer to a const LiveCellRef.
Definition: ptr.hpp:90
std::unique_ptr< std::deque< Stream > > mStreams
Definition: soundmanagerimp.hpp:88
Fallback::Map mFallback
Definition: soundmanagerimp.hpp:49
void startRandomTitle()
Definition: soundmanagerimp.cpp:394
Definition: loadsoun.hpp:17
void updateWaterSound(float duration)
Definition: soundmanagerimp.cpp:847
virtual Sound * playSound(const std::string &soundId, float volume, float pitch, Type type=Type::Sfx, PlayMode mode=PlayMode::Normal, float offset=0)
Definition: soundmanagerimp.cpp:572
SaySoundMap mActiveSaySounds
Definition: soundmanagerimp.hpp:97
virtual void stopSound3D(const MWWorld::ConstPtr &reference, const std::string &soundId)
Stop the given object from playing the given sound,.
Definition: soundmanagerimp.cpp:705
Sound_Buffer * loadSound(const std::string &soundId)
Definition: soundmanagerimp.cpp:186
TrackList mActiveTracks
Definition: soundmanagerimp.hpp:100
float mMusicVolume
Definition: soundmanagerimp.hpp:59
void advanceMusic(const std::string &filename)
Definition: soundmanagerimp.cpp:381
void updateSounds(float duration)
Definition: soundmanagerimp.cpp:944
Interface for sound manager (implemented in MWSound)
Definition: soundmanager.hpp:60
SoundMap mActiveSounds
Definition: soundmanagerimp.hpp:94
virtual void stopMusic()
Stops music if it's playing.
Definition: soundmanagerimp.cpp:353
size_t mBufferCacheMax
Definition: soundmanagerimp.hpp:75
std::vector< Sound * > mUnusedSounds
Definition: soundmanagerimp.hpp:86
std::string mNearWaterOutdoorID
Definition: soundmanagerimp.hpp:68
Definition: soundmanagerimp.hpp:45
Sound * getSoundRef()
Definition: soundmanagerimp.cpp:264
size_t mBufferCacheSize
Definition: soundmanagerimp.hpp:76
std::string mNextMusic
Definition: soundmanagerimp.hpp:137
virtual void streamMusic(const std::string &filename)
Definition: soundmanagerimp.cpp:421
DecoderPtr loadVoice(const std::string &voicefile)
Definition: soundmanagerimp.cpp:246
PlayModeEx
Definition: soundmanagerimp.hpp:40
bool mListenerUnderwater
Definition: soundmanagerimp.hpp:105
std::string mNearWaterIndoorID
Definition: soundmanagerimp.hpp:67
virtual void pauseSounds(int types)
Pauses all currently playing sounds, including music.
Definition: soundmanagerimp.cpp:774
The main class responsible for loading files from a virtual file system.
Definition: manager.hpp:20
SoundManager()
Definition: soundmanager.hpp:73
Stream * playVoice(DecoderPtr decoder, const osg::Vec3f &pos, bool playlocal)
Definition: soundmanagerimp.cpp:296
std::shared_ptr< Sound_Decoder > DecoderPtr
Definition: soundmanager.hpp:19
virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater)
Definition: soundmanagerimp.cpp:1160
DecoderPtr getDecoder()
Definition: soundmanagerimp.cpp:134
int mNearWaterPoints
Definition: soundmanagerimp.hpp:64
virtual void fadeOutSound3D(const MWWorld::ConstPtr &reference, const std::string &soundId, float duration)
Definition: soundmanagerimp.cpp:744
std::unique_ptr< std::deque< Sound > > mSounds
Definition: soundmanagerimp.hpp:85
void updateMusic(float duration)
Definition: soundmanagerimp.cpp:1089
virtual Sound * playSound3D(const MWWorld::ConstPtr &reference, const std::string &soundId, float volume, float pitch, Type type=Type::Sfx, PlayMode mode=PlayMode::Normal, float offset=0)
Definition: soundmanagerimp.cpp:601
std::string mCurrentPlaylist
Definition: soundmanagerimp.hpp:103
Type
Definition: soundmanager.hpp:39
std::string mLastPlayedMusic
Definition: soundmanagerimp.hpp:55
Environment
Definition: soundmanagerimp.hpp:35
virtual void resumeSounds(int types)
Resumes all previously paused sounds.
Definition: soundmanagerimp.cpp:784
Sound * mUnderwaterSound
Definition: soundmanagerimp.hpp:112
Sound_Buffer * insertSound(const std::string &soundId, const ESM::Sound *sound)
Definition: soundmanagerimp.cpp:139
std::deque< Sound_Buffer * > SoundList
Definition: soundmanagerimp.hpp:82
virtual void processChangedSettings(const Settings::CategorySettingVector &settings)
Definition: soundmanagerimp.cpp:1121
Definition: sound.hpp:104
std::unordered_map< std::string, std::vector< int > > mMusicToPlay
Definition: soundmanagerimp.hpp:54
size_t mBufferCacheMin
Definition: soundmanagerimp.hpp:74