114 lines
8.2 KiB
Plaintext
114 lines
8.2 KiB
Plaintext
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");
|