From 9d507e38cb5007f466f5e74a44ed0973832fb337 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Wed, 21 May 2025 23:16:04 +0200 Subject: [PATCH] added sdl_audio.h --- sdl3.c3l/sdl3_audio.c3i | 112 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/sdl3.c3l/sdl3_audio.c3i b/sdl3.c3l/sdl3_audio.c3i index 92c11d4..1d8067e 100644 --- a/sdl3.c3l/sdl3_audio.c3i +++ b/sdl3.c3l/sdl3_audio.c3i @@ -1,3 +1,113 @@ module sdl3::sdl; -typedef AudioDeviceID = uint; \ No newline at end of file +const ushort AUDIO_MASK_BITSIZE @builtin = (0xFF); +const ushort AUDIO_MASK_FLOAT @builtin = (1<<8); +const ushort AUDIO_MASK_BIG_ENDIAN @builtin = (1<<12); +const ushort AUDIO_MASK_SIGNED @builtin = (1<<15); + +macro @define_audio_format($signed, $bigendian, $flt, $size) => + (((ushort)$signed << 15) | ((ushort)$bigendian << 12) | ((ushort)$flt << 8) | ($size & AUDIO_MASK_BITSIZE)); + +typedef AudioFormat = CInt; + +const AudioFormat AUDIO_UNKNOWN @builtin = 0x0000; +const AudioFormat AUDIO_U8 @builtin = 0x0008; +const AudioFormat AUDIO_S8 @builtin = 0x8008; +const AudioFormat AUDIO_S16LE @builtin = 0x8010; +const AudioFormat AUDIO_S16BE @builtin = 0x9010; +const AudioFormat AUDIO_S32LE @builtin = 0x8020; +const AudioFormat AUDIO_S32BE @builtin = 0x9020; +const AudioFormat AUDIO_F32LE @builtin = 0x8120; +const AudioFormat AUDIO_F32BE @builtin = 0x9120; +// FIXME: this only works on little endian systems +const AudioFormat AUDIO_S16 @builtin = AUDIO_S16LE; +const AudioFormat AUDIO_S32 @builtin = AUDIO_S32LE; +const AudioFormat AUDIO_F32 @builtin = AUDIO_F32LE; + + +macro @audio_bitsize($x) => $x & AUDIO_MASK_BITSIZE; +macro @audio_bytesize($x) => @audio_bitsize($x) / 8; +macro @audio_isfloat($x) => $x & AUDIO_MASK_FLOAT; +macro @audio_isbigendian($x) => $x & AUDIO_MASK_BIG_ENDIAN; +macro @audio_islittleendian($x) => !@audio_isbigendian($x); +macro @audio_issigned($x) => $x & AUDIO_MASK_SIGNED; +macro @audio_isint($x) => !@audio_isfloat($x); +macro @audio_isunsigned($x) => !@audio_issigned($x); + +typedef AudioDeviceID = uint; + +const AudioDeviceID AUDIO_DEVICE_DEFAULT_PLAYBACK @builtin = (AudioDeviceID)0xFFFFFFFF; +const AudioDeviceID AUDIO_DEVICE_DEFAULT_RECORDING @builtin = (AudioDeviceID)0xFFFFFFFE; + +struct AudioSpec { + AudioFormat format; + int channels; + int freq; +} + +macro @audio_framesize($x) => @audio_bytesize(($x).format) * $x.channels; + +typedef AudioStream = void; + +extern fn int get_num_audio_drivers() @extern("SDL_GetNumAudioDrivers"); +extern fn ZString get_audio_driver(int index) @extern("SDL_GetAudioDriver"); +extern fn ZString get_current_audio_driver() @extern("SDL_GetCurrentAudioDriver"); +extern fn AudioDeviceID * get_audio_playback_devices(int *count) @extern("SDL_GetAudioPlaybackDevices"); +extern fn AudioDeviceID * get_audio_recording_devices(int *count) @extern("SDL_GetAudioRecordingDevices"); +extern fn ZString get_audio_device_name(AudioDeviceID devid) @extern("SDL_GetAudioDeviceName"); +extern fn bool get_audio_device_format(AudioDeviceID devid, AudioSpec* spec, int *sample_frames) @extern("SDL_GetAudioDeviceFormat"); +extern fn int * get_audio_device_channel_map(AudioDeviceID devid, int *count) @extern("SDL_GetAudioDeviceChannelMap"); +extern fn AudioDeviceID open_audio_device(AudioDeviceID devid, AudioSpec* spec) @extern("SDL_OpenAudioDevice"); +extern fn bool is_audio_device_physical(AudioDeviceID devid) @extern("SDL_IsAudioDevicePhysical"); +extern fn bool is_audio_device_playback(AudioDeviceID devid) @extern("SDL_IsAudioDevicePlayback"); +extern fn bool pause_audio_device(AudioDeviceID devid) @extern("SDL_PauseAudioDevice"); +extern fn bool resume_audio_device(AudioDeviceID devid) @extern("SDL_ResumeAudioDevice"); +extern fn bool audio_device_paused(AudioDeviceID devid) @extern("SDL_AudioDevicePaused"); +extern fn float get_audio_device_gain(AudioDeviceID devid) @extern("SDL_GetAudioDeviceGain"); +extern fn bool set_audio_device_gain(AudioDeviceID devid, float gain) @extern("SDL_SetAudioDeviceGain"); +extern fn void close_audio_device(AudioDeviceID devid) @extern("SDL_CloseAudioDevice"); +extern fn bool bind_audio_streams(AudioDeviceID devid, AudioStream**streams, int num_streams) @extern("SDL_BindAudioStreams"); +extern fn bool bind_audio_stream(AudioDeviceID devid, AudioStream* stream) @extern("SDL_BindAudioStream"); +extern fn void unbind_audio_streams(AudioStream**streams, int num_streams) @extern("SDL_UnbindAudioStreams"); +extern fn void unbind_audio_stream(AudioStream* stream) @extern("SDL_UnbindAudioStream"); +extern fn AudioDeviceID get_audio_stream_device(AudioStream* stream) @extern("SDL_GetAudioStreamDevice"); +extern fn AudioStream* create_audio_stream(AudioSpec* src_spec, AudioSpec* dst_spec) @extern("SDL_CreateAudioStream"); +extern fn PropertiesID get_audio_stream_properties(AudioStream* stream) @extern("SDL_GetAudioStreamProperties"); +extern fn bool get_audio_stream_format(AudioStream* stream, AudioSpec* src_spec, AudioSpec* dst_spec) @extern("SDL_GetAudioStreamFormat"); +extern fn bool set_audio_stream_format(AudioStream* stream, AudioSpec* src_spec, AudioSpec* dst_spec) @extern("SDL_SetAudioStreamFormat"); +extern fn float get_audio_stream_frequency_ratio(AudioStream* stream) @extern("SDL_GetAudioStreamFrequencyRatio"); +extern fn bool set_audio_stream_frequency_ratio(AudioStream* stream, float ratio) @extern("SDL_SetAudioStreamFrequencyRatio"); +extern fn float get_audio_stream_gain(AudioStream* stream) @extern("SDL_GetAudioStreamGain"); +extern fn bool set_audio_stream_gain(AudioStream* stream, float gain) @extern("SDL_SetAudioStreamGain"); +extern fn int * get_audio_stream_input_channel_map(AudioStream* stream, int *count) @extern("SDL_GetAudioStreamInputChannelMap"); +extern fn int * get_audio_stream_output_channel_map(AudioStream* stream, int *count) @extern("SDL_GetAudioStreamOutputChannelMap"); +extern fn bool set_audio_stream_input_channel_map(AudioStream* stream, int* chmap, int count) @extern("SDL_SetAudioStreamInputChannelMap"); +extern fn bool set_audio_stream_output_channel_map(AudioStream* stream, int* chmap, int count) @extern("SDL_SetAudioStreamOutputChannelMap"); +extern fn bool put_audio_stream_data(AudioStream* stream, void* buf, int len) @extern("SDL_PutAudioStreamData"); +extern fn int get_audio_stream_data(AudioStream* stream, void *buf, int len) @extern("SDL_GetAudioStreamData"); +extern fn int get_audio_stream_available(AudioStream* stream) @extern("SDL_GetAudioStreamAvailable"); +extern fn int get_audio_stream_queued(AudioStream* stream) @extern("SDL_GetAudioStreamQueued"); +extern fn bool flush_audio_stream(AudioStream* stream) @extern("SDL_FlushAudioStream"); +extern fn bool clear_audio_stream(AudioStream* stream) @extern("SDL_ClearAudioStream"); +extern fn bool pause_audio_stream_device(AudioStream* stream) @extern("SDL_PauseAudioStreamDevice"); +extern fn bool resume_audio_stream_device(AudioStream* stream) @extern("SDL_ResumeAudioStreamDevice"); +extern fn bool audio_stream_device_paused(AudioStream* stream) @extern("SDL_AudioStreamDevicePaused"); +extern fn bool lock_audio_stream(AudioStream* stream) @extern("SDL_LockAudioStream"); +extern fn bool unlock_audio_stream(AudioStream* stream) @extern("SDL_UnlockAudioStream"); + +alias AudioStreamCallback = fn void(void *userdata, AudioStream* stream, int additional_amount, int total_amount); + +extern fn bool set_audio_stream_get_callback(AudioStream* stream, AudioStreamCallback callback, void *userdata) @extern("SDL_SetAudioStreamGetCallback"); +extern fn bool set_audio_stream_put_callback(AudioStream* stream, AudioStreamCallback callback, void *userdata) @extern("SDL_SetAudioStreamPutCallback"); +extern fn void destroy_audio_stream(AudioStream* stream) @extern("SDL_DestroyAudioStream"); +extern fn AudioStream* open_audio_device_stream(AudioDeviceID devid, AudioSpec* spec, AudioStreamCallback callback, void *userdata) @extern("SDL_OpenAudioDeviceStream"); + +alias AudioPostmixCallback = fn void(void *userdata, AudioSpec* spec, float *buffer, int buflen); + +extern fn bool set_audio_postmix_callback(AudioDeviceID devid, AudioPostmixCallback callback, void *userdata) @extern("SDL_SetAudioPostmixCallback"); +extern fn bool load_wav_io(IOStream *src, bool closeio, AudioSpec* spec, char **audio_buf, uint *audio_len) @extern("SDL_LoadWAV_IO"); +extern fn bool load_wav(ZString path, AudioSpec* spec, char **audio_buf, uint *audio_len) @extern("SDL_LoadWAV"); +extern fn bool mix_audio(char *dst, char* src, AudioFormat format, uint len, float volume) @extern("SDL_MixAudio"); +extern fn bool convert_audio_samples(AudioSpec* src_spec, char* src_data, int src_len, AudioSpec* dst_spec, char **dst_data, int *dst_len) @extern("SDL_ConvertAudioSamples"); +extern fn ZString get_audio_format_name(AudioFormat format) @extern("SDL_GetAudioFormatName"); +extern fn int get_silence_value_for_format(AudioFormat format) @extern("SDL_GetSilenceValueForFormat");