module sdl3::sdl; 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");