ScummVM API documentation
sound.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef NEVERHOOD_SOUND_H
23#define NEVERHOOD_SOUND_H
24
25#include "audio/audiostream.h"
26#include "common/array.h"
27#include "neverhood/resourceman.h"
28
29namespace Common {
30class SeekableReadStream;
31}
32
33namespace Audio {
34class SoundHandle;
35}
36
37namespace Neverhood {
38
39class NeverhoodEngine;
40class AudioResourceManSoundItem;
41class AudioResourceManMusicItem;
42
44public:
47 bool isPlaying();
48 void load(uint32 fileHash);
49 void unload();
50 void play(uint32 fileHash);
51 void play();
52 void playLooping();
53 void stop();
54 void setVolume(int16 volume);
55 void setPan(int16 pan);
56protected:
57 NeverhoodEngine *_vm;
58 int16 _soundIndex;
59 AudioResourceManSoundItem *getSoundItem();
60};
61
63public:
65 bool isPlaying();
66 void load(uint32 fileHash);
67 void unload();
68 void play(int16 fadeVolumeStep);
69 void stop(int16 fadeVolumeStep);
70 void setVolume(int16 volume);
71protected:
72 NeverhoodEngine *_vm;
73 int16 _musicIndex;
74 AudioResourceManMusicItem *getMusicItem();
75};
76
77class MusicItem {
78public:
79 MusicItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 musicFileHash);
80 ~MusicItem();
81 void startMusic(int16 countdown, int16 fadeVolumeStep);
82 void stopMusic(int16 countdown, int16 fadeVolumeStep);
83 void update();
84 uint32 getGroupNameHash() const { return _groupNameHash; }
85 uint32 getFileHash() const { return _fileHash; }
86protected:
87 NeverhoodEngine *_vm;
88 uint32 _groupNameHash;
89 uint32 _fileHash;
90 bool _play;
91 bool _stop;
92 int16 _fadeVolumeStep;
93 int16 _countdown;
94 MusicResource *_musicResource;
95};
96
97class SoundItem {
98public:
99 SoundItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 soundFileHash,
100 bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
101 bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown);
102 ~SoundItem();
103 void setSoundParams(bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
104 int16 firstMinCountdown, int16 firstMaxCountdown);
105 void playSoundLooping();
106 void stopSound();
107 void setVolume(int volume);
108 void update();
109 void setPlayOnceAfterCountdown(bool playOnceAfterCountdown) { _playOnceAfterCountdown = playOnceAfterCountdown; }
110 uint32 getGroupNameHash() const { return _groupNameHash; }
111 uint32 getFileHash() const { return _fileHash; }
112 int16 getCurrCountdown() const { return _currCountdown; }
113protected:
114 NeverhoodEngine *_vm;
115 uint32 _groupNameHash;
116 uint32 _fileHash;
117 bool _playOnceAfterRandomCountdown;
118 int16 _minCountdown;
119 int16 _maxCountdown;
120 bool _playOnceAfterCountdown;
121 int16 _initialCountdown;
122 bool _playLooping;
123 int16 _currCountdown;
124 SoundResource *_soundResource;
125};
126
127class SoundMan {
128public:
130 ~SoundMan();
131
132 void stopAllMusic();
133 void stopAllSounds();
134
135 // Music
136 void addMusic(uint32 groupNameHash, uint32 musicFileHash);
137 void deleteMusic(uint32 musicFileHash);
138 void startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep);
139 void stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep);
140
141 // Sound
142 void addSound(uint32 groupNameHash, uint32 soundFileHash);
143 void addSoundList(uint32 groupNameHash, const uint32 *soundFileHashList);
144 void deleteSound(uint32 soundFileHash);
145 void setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown,
146 int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown);
147 void setSoundListParams(const uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
148 int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown);
149 void playSoundLooping(uint32 soundFileHash);
150 void stopSound(uint32 soundFileHash);
151 void setSoundVolume(uint32 soundFileHash, int volume);
152
153 // Misc
154 void update();
155 void deleteGroup(uint32 groupNameHash);
156 void deleteMusicGroup(uint32 groupNameHash);
157 void deleteSoundGroup(uint32 groupNameHash);
158 void playTwoSounds(uint32 groupNameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown);
159 void playSoundThree(uint32 groupNameHash, uint32 soundFileHash);
160 void setTwoSoundsPlayFlag(bool playOnceAfterCountdown);
161 void setSoundThreePlayFlag(bool playOnceAfterCountdown);
162
163protected:
164 NeverhoodEngine *_vm;
165
166 // TODO Find out what these special sounds are used for (door sounds?)
167 int _soundIndex1, _soundIndex2;
168 int16 _initialCountdown;
169 bool _playOnceAfterCountdown;
170
171 int _soundIndex3;
172 int16 _initialCountdown3;
173 bool _playOnceAfterCountdown3;
174
175 Common::Array<MusicItem*> _musicItems;
176 Common::Array<SoundItem*> _soundItems;
177
178 MusicItem *getMusicItemByHash(uint32 musicFileHash);
179 SoundItem *getSoundItemByHash(uint32 soundFileHash);
180 int16 addMusicItem(MusicItem *musicItem);
181 int16 addSoundItem(SoundItem *soundItem);
182 void deleteSoundByIndex(int index);
183
184};
185
187public:
188 NeverhoodAudioStream(int rate, byte shiftValue, bool isLooping, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream);
189 ~NeverhoodAudioStream() override;
190 int readBuffer(int16 *buffer, const int numSamples) override;
191 bool isStereo() const override { return _isStereo; }
192 bool endOfData() const override { return _endOfData; }
193 int getRate() const override { return _rate; }
194private:
195 const int _rate;
196 const bool _isLooping;
197 const bool _isStereo;
198 const byte _shiftValue;
199 const bool _isCompressed;
200 int16 _prevValue;
202 bool _endOfData;
203 byte *_buffer;
204 enum {
205 kSampleBufferLength = 2048
206 };
207 int fillBuffer(int maxSamples);
208};
209
210// TODO Rename these
211
213public:
214 AudioResourceManSoundItem(NeverhoodEngine *vm, uint32 fileHash);
216 void loadSound();
217 void unloadSound();
218 void setVolume(int16 volume);
219 void setPan(int16 pan);
220 void playSound(bool looping);
221 void stopSound();
222 bool isPlaying();
223protected:
224 NeverhoodEngine *_vm;
225 uint32 _fileHash;
226 ResourceHandle _resourceHandle;
227 const byte *_data;
228 bool _isLoaded;
229 bool _isPlaying;
230 int16 _volume;
231 int16 _panning;
232 Audio::SoundHandle *_soundHandle;
233};
234
236public:
237 AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash);
239 void playMusic(int16 fadeVolumeStep);
240 void stopMusic(int16 fadeVolumeStep);
241 void unloadMusic();
242 void setVolume(int16 volume);
243 void restart();
244 void update();
245 bool isPlaying() const { return _isPlaying; }
246 bool canRestart() const { return _canRestart; }
247 bool isTerminated() const { return _terminate; }
248 uint32 getFileHash() const { return _fileHash; }
249protected:
250 NeverhoodEngine *_vm;
251 uint32 _fileHash;
252 bool _isPlaying;
253 bool _canRestart;
254 bool _terminate;
255 int16 _volume;
256 int16 _panning;
257 bool _start;
258 bool _isFadingIn;
259 bool _isFadingOut;
260 int16 _fadeVolume;
261 int16 _fadeVolumeStep;
262 Audio::SoundHandle *_soundHandle;
263};
264
266public:
269
270 void stopAllMusic();
271 void stopAllSounds();
272
273 int16 addSound(uint32 fileHash);
274 void removeSound(int16 soundIndex);
275
276 int16 loadMusic(uint32 fileHash);
277 void updateMusic();
278
279 AudioResourceManSoundItem *getSoundItem(int16 index);
280 AudioResourceManMusicItem *getMusicItem(int16 index);
281
282protected:
283 NeverhoodEngine *_vm;
284
287
288 int16 addSoundItem(AudioResourceManSoundItem *soundItem);
289
290};
291
292} // End of namespace Neverhood
293
294#endif /* NEVERHOOD_SOUND_H */
Definition: audiostream.h:50
Definition: mixer.h:49
Definition: array.h:52
Definition: stream.h:745
Definition: sound.h:265
Definition: sound.h:77
Definition: sound.h:62
Definition: sound.h:186
int getRate() const override
Definition: sound.h:193
bool isStereo() const override
Definition: sound.h:191
int readBuffer(int16 *buffer, const int numSamples) override
bool endOfData() const override
Definition: sound.h:192
Definition: neverhood.h:69
Definition: sound.h:97
Definition: sound.h:127
Definition: sound.h:43
Definition: system.h:39
Definition: algorithm.h:29
Definition: resourceman.h:64