summaryrefslogtreecommitdiff
path: root/g_src/music_and_sound_fmodex.h
blob: 444d555421822b4e51b28ad969d14d4866acecb9 (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
//copyright (c) 2006 by tarn adams

#define SOUND_CHANNELNUM 16

#include <string>
#include <map>

#ifndef NO_FMOD

#include <fmod.hpp>
#include <fmod_errors.h>

/* The maximums can be no larger than the largest value
 * of a signed integer.
 */
#define MAXSONGNUM       1000
#define MAXSOUNDNUM      1000
#define FSOUND_STEREOPAN 0

struct fmodSound {
	FMOD::Sound *sound;
	FMOD::Channel *channel;
};



class musicsoundst
{
	public:
		enum linux_sound_system {
			ALSA,
			OSS,
			ESD,
		};
		
		int SoftChannelNumber;

		musicsoundst() : song(-1), system(NULL), masterchannelgroup(NULL), sound_system(ALSA)
		{
			int s;
			for (s = 0; s < MAXSONGNUM; s++) {
				mod[s].sound = NULL;
				mod[s].channel = NULL;
			}

			for (s = 0; s < MAXSOUNDNUM; s++) {
				samp[s].sound = NULL;
				samp[s].channel = NULL;
			}
		}
		~musicsoundst()
		{
			deinitsound();
		}

		void startbackgroundmusic(int new_song);
		void stopbackgroundmusic();
		void playsound(int s,int channel=-1);
		void playsound(int s,int min_channel,int max_channel,int force_channel);
		void initsound();
		void deinitsound();
		void set_song(string &filename,int slot);
		void set_sound(string &filename,int slot,int pan=-1,int priority=0);
		void set_sound_params(int slot,int p1,int vol,int pan,int priority);
		void stop_sound(int channel);
		void stop_sound() {
			masterchannelgroup->stop();
		}
		void set_master_volume(long newvol);
		void update() {
			if (!on) {
				return;
			}

			system->update();
		}
		
		void set_sound_system(musicsoundst::linux_sound_system system) {
			sound_system = system;
		}

	private:
		float oldval_to_volumefloat(int val);
		float oldval_to_panfloat(int val);
		int oldval_to_priority(int val);

		int song;
		char musicactive;
		char soundpriority;
		int soundplaying;

		char on;

		FMOD::System *system;
		FMOD::ChannelGroup *masterchannelgroup;
		fmodSound      mod[MAXSONGNUM];
		fmodSound      samp[MAXSOUNDNUM];

		musicsoundst::linux_sound_system sound_system;
};
#endif