added sdl_audio.h

This commit is contained in:
Alessandro Mauri 2025-05-21 23:16:04 +02:00
parent 3b3f3e20e2
commit 9d507e38cb

View File

@ -1,3 +1,113 @@
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");