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 }