aboutsummaryrefslogtreecommitdiff
path: root/engines/sword1/sound.h
blob: ae96132241ebb0ff6e07a52c6cdb95975e5eab0d (plain)
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
/* 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 2
 * 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * $URL$
 * $Id$
 *
 */

#ifndef SWORD1_SOUND_H
#define SWORD1_SOUND_H

#include "sword1/object.h"
#include "sword1/sworddefs.h"
#include "common/file.h"
#include "common/util.h"
#include "common/random.h"
#include "audio/mixer.h"

namespace Audio {
	class Mixer;
}

namespace Sword1 {

#define	TOTAL_FX_PER_ROOM	7		// total loop & random fx per room (see fx_list.c)
#define	MAX_ROOMS_PER_FX	7		// max no. of rooms in the fx's room,vol list
#define	MAX_FXQ_LENGTH		32		// max length of sound queue - ie. max number of fx that can be stored up/playing together

#define FX_SPOT 1
#define FX_LOOP 2
#define FX_RANDOM 3

struct QueueElement {
	uint32 id, delay;
	Audio::SoundHandle handle;
};

struct RoomVol {
	int32 roomNo, leftVol, rightVol;
};

struct FxDef {
	uint32 sampleId, type, delay;
	RoomVol roomVolList[MAX_ROOMS_PER_FX];
};

class ResMan;
#define WAVE_VOL_TAB_LENGTH 480
#define WAVE_VOL_THRESHOLD 190000 //120000

enum CowMode {
	CowWave = 0,
	CowFLAC,
	CowVorbis,
	CowMP3,
	CowDemo,
	CowPSX
};

class Sound {
public:
	Sound(const char *searchPath, Audio::Mixer *mixer, ResMan *pResMan);
	~Sound();
	void setSpeechVol(uint8 volL, uint8 volR) { _speechVolL = volL; _speechVolR = volR; }
	void setSfxVol(uint8 volL, uint8 volR) { _sfxVolL = volL; _sfxVolR = volR; }
	void giveSpeechVol(uint8 *volL, uint8 *volR) { *volL = _speechVolL; *volR = _speechVolR; }
	void giveSfxVol(uint8 *volL, uint8 *volR) { *volL = _sfxVolL; *volR = _sfxVolR; }
	void newScreen(uint32 screen);
	void quitScreen();
	void closeCowSystem();

	bool startSpeech(uint16 roomNo, uint16 localNo);
	bool speechFinished();
	void stopSpeech();
	bool amISpeaking();

	void fnStopFx(int32 fxNo);
	int addToQueue(int32 fxNo);

	void engine();

	void checkSpeechFileEndianness();

private:
	uint8 _sfxVolL, _sfxVolR, _speechVolL, _speechVolR;
	void playSample(QueueElement *elem);
	void initCowSystem();

	int16 *uncompressSpeech(uint32 index, uint32 cSize, uint32 *size);
	void calcWaveVolume(int16 *data, uint32 length);
	bool _waveVolume[WAVE_VOL_TAB_LENGTH];
	uint16 _waveVolPos;
	Common::File _cowFile;
	uint32		 *_cowHeader;
	uint32		 _cowHeaderSize;
	uint8		 _currentCowFile;
	CowMode		 _cowMode;
	Audio::SoundHandle _speechHandle, _fxHandle;
	Common::RandomSource _rnd;

	QueueElement _fxQueue[MAX_FXQ_LENGTH];
	uint8		 _endOfQueue;
	Audio::Mixer *_mixer;
	ResMan *_resMan;
	bool _bigEndianSpeech;
	char _filePath[100];
	static const char _musicList[270];
	static const uint16 _roomsFixedFx[TOTAL_ROOMS][TOTAL_FX_PER_ROOM];
	static const FxDef _fxList[312];

};

} // End of namespace Sword1

#endif //BSSOUND_H