1 module allegro5.allegro_audio;
2 
3 version(ALLEGRO_NO_PRAGMA_LIB) {}
4 else
5 {
6 	pragma(lib, "allegro_audio");
7 }
8 
9 import allegro5.allegro;
10 import allegro5.events;
11 import allegro5.internal.da5;
12 
13 extern (C)
14 {
15 	struct ALLEGRO_AUDIO_RECORDER_EVENT
16 	{
17 		mixin(_AL_EVENT_HEADER("ALLEGRO_AUDIO_RECORDER"));
18 		ALLEGRO_USER_EVENT_DESCRIPTOR* __internal__descr;
19 		void* buffer;
20 		uint samples;
21 	};
22 	
23 	enum ALLEGRO_AUDIO_DEPTH
24 	{
25 		ALLEGRO_AUDIO_DEPTH_INT8      = 0x00,
26 		ALLEGRO_AUDIO_DEPTH_INT16     = 0x01,
27 		ALLEGRO_AUDIO_DEPTH_INT24     = 0x02,
28 		ALLEGRO_AUDIO_DEPTH_FLOAT32   = 0x03,
29 
30 		ALLEGRO_AUDIO_DEPTH_UNSIGNED  = 0x08,
31 
32 		/* For convenience */
33 		ALLEGRO_AUDIO_DEPTH_UINT8  = ALLEGRO_AUDIO_DEPTH_INT8 | ALLEGRO_AUDIO_DEPTH_UNSIGNED,
34 		ALLEGRO_AUDIO_DEPTH_UINT16 = ALLEGRO_AUDIO_DEPTH_INT16 | ALLEGRO_AUDIO_DEPTH_UNSIGNED,
35 		ALLEGRO_AUDIO_DEPTH_UINT24 = ALLEGRO_AUDIO_DEPTH_INT24 | ALLEGRO_AUDIO_DEPTH_UNSIGNED
36 	}
37 
38 	enum ALLEGRO_CHANNEL_CONF
39 	{
40 		ALLEGRO_CHANNEL_CONF_1   = 0x10,
41 		ALLEGRO_CHANNEL_CONF_2   = 0x20,
42 		ALLEGRO_CHANNEL_CONF_3   = 0x30,
43 		ALLEGRO_CHANNEL_CONF_4   = 0x40,
44 		ALLEGRO_CHANNEL_CONF_5_1 = 0x51,
45 		ALLEGRO_CHANNEL_CONF_6_1 = 0x61,
46 		ALLEGRO_CHANNEL_CONF_7_1 = 0x71
47 	}
48 	
49 	const ALLEGRO_MAX_CHANNELS = 8;
50 
51 	enum ALLEGRO_PLAYMODE
52 	{
53 		ALLEGRO_PLAYMODE_ONCE   = 0x100,
54 		ALLEGRO_PLAYMODE_LOOP   = 0x101,
55 		ALLEGRO_PLAYMODE_BIDIR  = 0x102,
56 		_ALLEGRO_PLAYMODE_STREAM_ONCE   = 0x103,   /* internal */
57 		_ALLEGRO_PLAYMODE_STREAM_ONEDIR = 0x104    /* internal */
58 	}
59 
60 	enum ALLEGRO_MIXER_QUALITY
61 	{
62 		ALLEGRO_MIXER_QUALITY_POINT   = 0x110,
63 		ALLEGRO_MIXER_QUALITY_LINEAR  = 0x111,
64 		ALLEGRO_MIXER_QUALITY_CUBIC   = 0x112
65 	}
66 
67 	const float ALLEGRO_AUDIO_PAN_NONE = -1000.0f;
68 	
69 	enum ALLEGRO_AUDIO_EVENT_TYPE
70 	{
71 		ALLEGRO_EVENT_AUDIO_ROUTE_CHANGE       = 520,
72 		ALLEGRO_EVENT_AUDIO_INTERRUPTION       = 521,
73 		ALLEGRO_EVENT_AUDIO_END_INTERRUPTION   = 522
74 	}
75 
76 	struct ALLEGRO_SAMPLE {};
77 
78 	struct ALLEGRO_SAMPLE_ID
79 	{
80 		int _index;
81 		int _id;
82 	}
83 
84 	struct ALLEGRO_SAMPLE_INSTANCE {};
85 	
86 	struct ALLEGRO_AUDIO_STREAM {};
87 	
88 	struct ALLEGRO_MIXER {};
89 
90 	struct ALLEGRO_VOICE {};
91 	
92 	struct ALLEGRO_AUDIO_RECORDER {};
93 
94 	ALLEGRO_SAMPLE* al_create_sample(void* buf, uint samples, uint freq, ALLEGRO_AUDIO_DEPTH depth, ALLEGRO_CHANNEL_CONF chan_conf, bool free_buf);
95 	void al_destroy_sample(ALLEGRO_SAMPLE* spl);
96 
97 	/* Sample instance functions */
98 	ALLEGRO_SAMPLE_INSTANCE* al_create_sample_instance(ALLEGRO_SAMPLE* data);
99 	void al_destroy_sample_instance(ALLEGRO_SAMPLE_INSTANCE* spl);
100 
101 	uint al_get_sample_frequency(in ALLEGRO_SAMPLE* spl);
102 	uint al_get_sample_length(in ALLEGRO_SAMPLE* spl);
103 	ALLEGRO_AUDIO_DEPTH al_get_sample_depth(in ALLEGRO_SAMPLE* spl);
104 	ALLEGRO_CHANNEL_CONF al_get_sample_channels(in ALLEGRO_SAMPLE* spl);
105 	void* al_get_sample_data(in ALLEGRO_SAMPLE* spl);
106 
107 	uint al_get_sample_instance_frequency(in ALLEGRO_SAMPLE_INSTANCE* spl);
108 	uint al_get_sample_instance_length(in ALLEGRO_SAMPLE_INSTANCE* spl);
109 	uint al_get_sample_instance_position(in ALLEGRO_SAMPLE_INSTANCE* spl);
110 
111 	float al_get_sample_instance_speed(in ALLEGRO_SAMPLE_INSTANCE* spl);
112 	float al_get_sample_instance_gain(in ALLEGRO_SAMPLE_INSTANCE* spl);
113 	float al_get_sample_instance_pan(in ALLEGRO_SAMPLE_INSTANCE* spl);
114 	float al_get_sample_instance_time(in ALLEGRO_SAMPLE_INSTANCE* spl);
115 
116 	ALLEGRO_AUDIO_DEPTH al_get_sample_instance_depth(in ALLEGRO_SAMPLE_INSTANCE* spl);
117 	ALLEGRO_CHANNEL_CONF al_get_sample_instance_channels(in ALLEGRO_SAMPLE_INSTANCE* spl);
118 	ALLEGRO_PLAYMODE al_get_sample_instance_playmode(in ALLEGRO_SAMPLE_INSTANCE* spl);
119 
120 	bool al_get_sample_instance_playing(in ALLEGRO_SAMPLE_INSTANCE* spl);
121 	bool al_get_sample_instance_attached(in ALLEGRO_SAMPLE_INSTANCE* spl);
122 
123 	bool al_set_sample_instance_position(ALLEGRO_SAMPLE_INSTANCE* spl, uint val);
124 	bool al_set_sample_instance_length(ALLEGRO_SAMPLE_INSTANCE* spl, uint val);
125 
126 	bool al_set_sample_instance_speed(ALLEGRO_SAMPLE_INSTANCE* spl, float val);
127 	bool al_set_sample_instance_gain(ALLEGRO_SAMPLE_INSTANCE* spl, float val);
128 	bool al_set_sample_instance_pan(ALLEGRO_SAMPLE_INSTANCE* spl, float val);
129 
130 	bool al_set_sample_instance_playmode(ALLEGRO_SAMPLE_INSTANCE* spl, ALLEGRO_PLAYMODE val);
131 
132 	bool al_set_sample_instance_playing(ALLEGRO_SAMPLE_INSTANCE* spl, bool val);
133 	bool al_detach_sample_instance(ALLEGRO_SAMPLE_INSTANCE* spl);
134 
135 	bool al_set_sample(ALLEGRO_SAMPLE_INSTANCE* spl, ALLEGRO_SAMPLE* data);
136 	ALLEGRO_SAMPLE* al_get_sample(ALLEGRO_SAMPLE_INSTANCE* spl);
137 	bool al_play_sample_instance(ALLEGRO_SAMPLE_INSTANCE* spl);
138 	bool al_stop_sample_instance(ALLEGRO_SAMPLE_INSTANCE* spl);
139 
140 
141 	/* Stream functions */
142 	ALLEGRO_AUDIO_STREAM* al_create_audio_stream(size_t buffer_count, uint samples, uint freq, ALLEGRO_AUDIO_DEPTH depth, ALLEGRO_CHANNEL_CONF chan_conf);
143 	void al_destroy_audio_stream(ALLEGRO_AUDIO_STREAM* stream);
144 	void al_drain_audio_stream(ALLEGRO_AUDIO_STREAM* stream);
145 
146 	uint al_get_audio_stream_frequency(in ALLEGRO_AUDIO_STREAM* stream);
147 	uint al_get_audio_stream_length(in ALLEGRO_AUDIO_STREAM* stream);
148 	uint al_get_audio_stream_fragments(in ALLEGRO_AUDIO_STREAM* stream);
149 	uint al_get_available_audio_stream_fragments(in ALLEGRO_AUDIO_STREAM* stream);
150 
151 	float al_get_audio_stream_speed(in ALLEGRO_AUDIO_STREAM* stream);
152 	float al_get_audio_stream_gain(in ALLEGRO_AUDIO_STREAM* stream);
153 	float al_get_audio_stream_pan(in ALLEGRO_AUDIO_STREAM* stream);
154 
155 	ALLEGRO_CHANNEL_CONF al_get_audio_stream_channels(in ALLEGRO_AUDIO_STREAM* stream);
156 	ALLEGRO_AUDIO_DEPTH al_get_audio_stream_depth(in ALLEGRO_AUDIO_STREAM* stream);
157 	ALLEGRO_PLAYMODE al_get_audio_stream_playmode(in ALLEGRO_AUDIO_STREAM* stream);
158 
159 	bool al_get_audio_stream_playing(in ALLEGRO_AUDIO_STREAM* spl);
160 	bool al_get_audio_stream_attached(in ALLEGRO_AUDIO_STREAM* spl);
161 	ulong al_get_audio_stream_played_samples(in ALLEGRO_AUDIO_STREAM* stream);
162 
163 	void* al_get_audio_stream_fragment(in ALLEGRO_AUDIO_STREAM* stream);
164 
165 	bool al_set_audio_stream_speed(ALLEGRO_AUDIO_STREAM* stream, float val);
166 	bool al_set_audio_stream_gain(ALLEGRO_AUDIO_STREAM* stream, float val);
167 	bool al_set_audio_stream_pan(ALLEGRO_AUDIO_STREAM* stream, float val);
168 
169 	bool al_set_audio_stream_playmode(ALLEGRO_AUDIO_STREAM* stream, ALLEGRO_PLAYMODE val);
170 
171 	bool al_set_audio_stream_playing(ALLEGRO_AUDIO_STREAM* stream, bool val);
172 	bool al_detach_audio_stream(ALLEGRO_AUDIO_STREAM* stream);
173 	bool al_set_audio_stream_fragment(ALLEGRO_AUDIO_STREAM* stream, void* val);
174 
175 	bool al_rewind_audio_stream(ALLEGRO_AUDIO_STREAM* stream);
176 	bool al_seek_audio_stream_secs(ALLEGRO_AUDIO_STREAM* stream, double time);
177 	double al_get_audio_stream_position_secs(ALLEGRO_AUDIO_STREAM* stream);
178 	double al_get_audio_stream_length_secs(ALLEGRO_AUDIO_STREAM* stream);
179 	bool al_set_audio_stream_loop_secs(ALLEGRO_AUDIO_STREAM* stream, double start, double end);
180 
181 	ALLEGRO_EVENT_SOURCE * al_get_audio_stream_event_source(ALLEGRO_AUDIO_STREAM* stream);
182 
183 	/* Mixer functions */
184 	ALLEGRO_MIXER* al_create_mixer(uint freq,
185 	ALLEGRO_AUDIO_DEPTH depth, ALLEGRO_CHANNEL_CONF chan_conf);
186 	void al_destroy_mixer(ALLEGRO_MIXER* mixer);
187 	bool al_attach_sample_instance_to_mixer(ALLEGRO_SAMPLE_INSTANCE* stream, ALLEGRO_MIXER* mixer);
188 	bool al_attach_audio_stream_to_mixer(ALLEGRO_AUDIO_STREAM* stream, ALLEGRO_MIXER* mixer);
189 	bool al_attach_mixer_to_mixer(ALLEGRO_MIXER* stream, ALLEGRO_MIXER* mixer);
190 	bool al_set_mixer_postprocess_callback(ALLEGRO_MIXER* mixer, void function(void* buf, uint samples, void* data) cb, void* data);
191 
192 	uint al_get_mixer_frequency(in ALLEGRO_MIXER* mixer);
193 	ALLEGRO_CHANNEL_CONF al_get_mixer_channels(in ALLEGRO_MIXER* mixer);
194 	ALLEGRO_AUDIO_DEPTH al_get_mixer_depth(in ALLEGRO_MIXER* mixer);
195 	ALLEGRO_MIXER_QUALITY al_get_mixer_quality(in ALLEGRO_MIXER* mixer);
196 	float al_get_mixer_gain(in ALLEGRO_MIXER *mixer);
197 	bool al_get_mixer_playing(in ALLEGRO_MIXER* mixer);
198 	bool al_get_mixer_attached(in ALLEGRO_MIXER* mixer);
199 	bool al_set_mixer_frequency(ALLEGRO_MIXER* mixer, uint val);
200 	bool al_set_mixer_quality(ALLEGRO_MIXER* mixer, ALLEGRO_MIXER_QUALITY val);
201 	bool al_set_mixer_gain(ALLEGRO_MIXER *mixer, float gain);
202 	bool al_set_mixer_playing(ALLEGRO_MIXER* mixer, bool val);
203 	bool al_detach_mixer(ALLEGRO_MIXER* mixer);
204 
205 	/* Voice functions */
206 	ALLEGRO_VOICE* al_create_voice(uint freq,
207 	ALLEGRO_AUDIO_DEPTH depth,
208 	ALLEGRO_CHANNEL_CONF chan_conf);
209 	void al_destroy_voice(ALLEGRO_VOICE* voice);
210 	bool al_attach_sample_instance_to_voice(ALLEGRO_SAMPLE_INSTANCE* stream, ALLEGRO_VOICE* voice);
211 	bool al_attach_audio_stream_to_voice(ALLEGRO_AUDIO_STREAM* stream, ALLEGRO_VOICE* voice );
212 	bool al_attach_mixer_to_voice(ALLEGRO_MIXER* mixer,
213 	ALLEGRO_VOICE* voice);
214 	void al_detach_voice(ALLEGRO_VOICE* voice);
215 
216 	uint al_get_voice_frequency(in ALLEGRO_VOICE* voice);
217 	uint al_get_voice_position(in ALLEGRO_VOICE* voice);
218 	ALLEGRO_CHANNEL_CONF al_get_voice_channels(in ALLEGRO_VOICE* voice);
219 	ALLEGRO_AUDIO_DEPTH al_get_voice_depth(in ALLEGRO_VOICE* voice);
220 	bool al_get_voice_playing(in ALLEGRO_VOICE* voice);
221 	bool al_set_voice_position(ALLEGRO_VOICE* voice, uint val);
222 	bool al_set_voice_playing(ALLEGRO_VOICE* voice, bool val);
223 
224 	/* Misc. audio functions */
225 	bool al_install_audio();
226 	void al_uninstall_audio();
227 	bool al_is_audio_installed();
228 	uint al_get_allegro_audio_version();
229 
230 	size_t al_get_channel_count(ALLEGRO_CHANNEL_CONF conf);
231 	size_t al_get_audio_depth_size(ALLEGRO_AUDIO_DEPTH conf);
232 
233 	void al_fill_silence(void* buf, uint samples, ALLEGRO_AUDIO_DEPTH depth, ALLEGRO_CHANNEL_CONF chan_conf);
234 
235 	/* Simple audio layer */
236 	bool al_reserve_samples(int reserve_samples);
237 	ALLEGRO_MIXER* al_get_default_mixer();
238 	bool al_set_default_mixer(ALLEGRO_MIXER* mixer);
239 	bool al_restore_default_mixer();
240 	bool al_play_sample(ALLEGRO_SAMPLE* data, float gain, float pan, float speed, int loop, ALLEGRO_SAMPLE_ID* ret_id);
241 	void al_stop_sample(ALLEGRO_SAMPLE_ID* spl_id);
242 	void al_stop_samples();
243 
244 	/* File type handlers */
245 	bool al_register_sample_loader(in char* ext, ALLEGRO_SAMPLE* function(in char* filename) loader);
246 	bool al_register_sample_saver(in char* ext, bool function(in char* filename, ALLEGRO_SAMPLE* spl) saver);
247 	bool al_register_audio_stream_loader(in char* ext, ALLEGRO_AUDIO_STREAM* function(in char* filename, size_t buffer_count, uint samples) stream_loader);
248 
249 	bool al_register_sample_loader_f(in char* ext, ALLEGRO_SAMPLE* function(ALLEGRO_FILE* fp) loader);
250 	bool al_register_sample_saver_f(in char* ext, bool function(ALLEGRO_FILE* fp, ALLEGRO_SAMPLE* spl) saver);
251 	bool al_register_audio_stream_loader_f(in char* ext, ALLEGRO_AUDIO_STREAM* function(ALLEGRO_FILE* fp, size_t buffer_count, uint samples) stream_loader);
252 
253 	ALLEGRO_SAMPLE* al_load_sample(in char* filename);
254 	bool al_save_sample(in char* filename, ALLEGRO_SAMPLE* spl);
255 	ALLEGRO_AUDIO_STREAM* al_load_audio_stream(in char* filename, size_t buffer_count, uint samples);
256 	
257 	ALLEGRO_SAMPLE* al_load_sample_f(ALLEGRO_FILE* fp, in char* ident);
258 	bool al_save_sample_f(ALLEGRO_FILE* fp, in char* ident, ALLEGRO_SAMPLE* spl);
259 	ALLEGRO_AUDIO_STREAM * al_load_audio_stream_f(ALLEGRO_FILE* fp, in char* ident,	size_t buffer_count, uint samples);
260 
261 	/* Recording functions */
262 	ALLEGRO_AUDIO_RECORDER* al_create_audio_recorder(size_t fragment_count, uint samples, uint freq, ALLEGRO_AUDIO_DEPTH depth, ALLEGRO_CHANNEL_CONF chan_conf);
263 	bool al_start_audio_recorder(ALLEGRO_AUDIO_RECORDER* r);
264 	void al_stop_audio_recorder(ALLEGRO_AUDIO_RECORDER* r);
265 	bool al_is_audio_recorder_recording(ALLEGRO_AUDIO_RECORDER* r);
266 	ALLEGRO_EVENT_SOURCE* al_get_audio_recorder_event_source(ALLEGRO_AUDIO_RECORDER* r);
267 	ALLEGRO_AUDIO_RECORDER_EVENT* al_get_audio_recorder_event(ALLEGRO_EVENT* event);
268 	void al_destroy_audio_recorder(ALLEGRO_AUDIO_RECORDER* r);
269 }