File: sound.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (148 lines) | stat: -rw-r--r-- 3,989 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef SOUND_H_
#define SOUND_H_

#include "audio/audiostream.h"
#include "audio/mixer.h"

#include "common/str.h"

namespace Myst3 {

class Myst3Engine;

enum SoundType {
	kAny,
	kAmbient,
	kCue,
	kEffect,
	kMusic
};

enum SoundNextCommand {
	kRandom,
	kNext,
	kRandomIfOtherStarting,
	kNextIfOtherStarting
};

class SoundChannel {
public:
	SoundChannel(Myst3Engine *vm);
	virtual ~SoundChannel();

	void play(uint32 id, uint32 volume, uint16 heading, uint16 attenuation, bool loop, SoundType type);
	void setVolume3D(uint32 volume, uint16 heading, uint16 attenuation);
	void fade(uint32 targetVolume, int32 targetHeading, int32 targetAttenuation, uint32 fadeDelay);
	void fadeOut(uint32 fadeDelay);
	void update();
	void stop();
	void age(uint32 maxAge);
	uint32 playedFrames();
	uint32 adjustVolume(uint32 volume);

	uint32 _id;
	bool _playing;
	bool _stopWhenSilent;
	bool _fading;
	SoundType _type;
	uint32 _age;
	uint32 _ambientFadeOutDelay;

	uint _fadeLastTick;
	int32 _fadeDuration; // In frames (@30 fps)
	int32 _fadePosition;

	int32 _fadeSourceVolume;
	int32 _fadeTargetVolume;
	int32 _fadeSourceHeading;
	int32 _fadeTargetHeading;
	int32 _fadeSourceAttenuation;
	int32 _fadeTargetAttenuation;

	bool _hasFadeArray;
	uint32 _fadeArrayPosition;
	uint32 _fadeDurations[4];
	uint32 _fadeVolumes[4];

private:
	Myst3Engine *_vm;

	Common::String _name;

	uint32 _volume;
	int32 _heading;
	uint32 _headingAngle;

	Audio::AudioStream *_stream;
	Audio::SoundHandle _handle;
	Audio::Timestamp _length;

	Audio::RewindableAudioStream *makeAudioStream(const Common::String &name) const;
	void updateFading();
	Audio::Mixer::SoundType mixerSoundType();
};

class Sound {
public:
	Sound(Myst3Engine *vm);
	virtual ~Sound();

	SoundChannel *getChannelForSound(uint32 id, SoundType type, bool *found = nullptr);

	void playEffect(uint32 id, uint32 volume, uint16 heading = 0, uint16 attenuation = 0);
	void playEffectLooping(uint32 id, uint32 volume, uint16 heading = 0, uint16 attenuation = 0);
	void playEffectFadeInOut(uint32 id, uint32 volume, uint16 heading, uint16 attenuation,
	                         uint32 fadeInDuration, uint32 playDuration, uint32 fadeOutDuration);
	void stopEffect(uint32 id, uint32 fadeDuration);

	void playCue(uint32 id, uint32 volume, uint16 heading, uint16 attenuation);
	void stopCue(uint32 fadeDelay);

	void stopMusic(uint32 fadeDelay);

	bool isPlaying(uint32 id);
	int32 playedFrames(uint32 id);

	void update();
	void age();

	void fadeOutOldSounds(uint32 fadeDelay);

	void computeVolumeBalance(int32 volume, int32 heading, uint attenuation, int32 *mixerVolume, int32 *balance);

	void setupNextSound(SoundNextCommand command, int16 controlVar, int16 startSoundId, int16 soundCount,
	                    int32 soundMinDelay, int32 soundMaxDelay, int32 controlSoundId = 0, int32 controlSoundMaxPosition = 0);
	void resetSoundVars();
private:
	static const uint kNumChannels = 14;

	Myst3Engine *_vm;
	SoundChannel *_channels[kNumChannels];

	void compute3DVolumes(int32 heading, uint angle, int32 *left, int32 *right);
};

} // End of namespace Myst3

#endif // SOUND_H_