use crate::{c_char, c_int, c_void, rwops::*, stdinc::*};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct SDL_AudioFormat(pub u16);
#[inline]
#[must_use]
pub const fn SDL_AUDIO_BITSIZE(af: SDL_AudioFormat) -> u16 {
af.0 & 0xFF
}
#[inline]
#[must_use]
pub const fn SDL_AUDIO_ISFLOAT(af: SDL_AudioFormat) -> bool {
af.0 & (1 << 8) != 0
}
#[inline]
#[must_use]
pub const fn SDL_AUDIO_ISBIGENDIAN(af: SDL_AudioFormat) -> bool {
af.0 & (1 << 12) != 0
}
#[inline]
#[must_use]
pub const fn SDL_AUDIO_ISSIGNED(af: SDL_AudioFormat) -> bool {
af.0 & (1 << 15) != 0
}
#[inline]
#[must_use]
pub const fn SDL_AUDIO_ISINT(af: SDL_AudioFormat) -> bool {
!SDL_AUDIO_ISFLOAT(af)
}
#[inline]
#[must_use]
pub const fn SDL_AUDIO_ISLITTLEENDIAN(af: SDL_AudioFormat) -> bool {
!SDL_AUDIO_ISBIGENDIAN(af)
}
#[inline]
#[must_use]
pub const fn SDL_AUDIO_ISUNSIGNED(af: SDL_AudioFormat) -> bool {
!SDL_AUDIO_ISSIGNED(af)
}
pub const AUDIO_U8: SDL_AudioFormat = SDL_AudioFormat(0x0008);
pub const AUDIO_S8: SDL_AudioFormat = SDL_AudioFormat(0x8008);
pub const AUDIO_U16LSB: SDL_AudioFormat = SDL_AudioFormat(0x0010);
pub const AUDIO_S16LSB: SDL_AudioFormat = SDL_AudioFormat(0x8010);
pub const AUDIO_U16MSB: SDL_AudioFormat = SDL_AudioFormat(0x1010);
pub const AUDIO_S16MSB: SDL_AudioFormat = SDL_AudioFormat(0x9010);
pub const AUDIO_U16: SDL_AudioFormat = AUDIO_U16LSB;
pub const AUDIO_S16: SDL_AudioFormat = AUDIO_S16LSB;
pub const AUDIO_S32LSB: SDL_AudioFormat = SDL_AudioFormat(0x8020);
pub const AUDIO_S32MSB: SDL_AudioFormat = SDL_AudioFormat(0x9020);
pub const AUDIO_S32: SDL_AudioFormat = AUDIO_S32LSB;
pub const AUDIO_F32LSB: SDL_AudioFormat = SDL_AudioFormat(0x8120);
pub const AUDIO_F32MSB: SDL_AudioFormat = SDL_AudioFormat(0x9120);
pub const AUDIO_F32: SDL_AudioFormat = AUDIO_F32LSB;
pub const AUDIO_U16SYS: SDL_AudioFormat =
if cfg!(target_endian = "little") { AUDIO_U16LSB } else { AUDIO_U16MSB };
pub const AUDIO_S16SYS: SDL_AudioFormat =
if cfg!(target_endian = "little") { AUDIO_S16LSB } else { AUDIO_S16MSB };
pub const AUDIO_S32SYS: SDL_AudioFormat =
if cfg!(target_endian = "little") { AUDIO_S32LSB } else { AUDIO_S32MSB };
pub const AUDIO_F32SYS: SDL_AudioFormat =
if cfg!(target_endian = "little") { AUDIO_F32LSB } else { AUDIO_F32MSB };
pub type SDL_AudioCallback = Option<
unsafe extern "C" fn(userdata: *mut c_void, stream: *mut Uint8, len: c_int),
>;
#[repr(C)]
pub struct SDL_AudioSpec {
pub freq: c_int,
pub format: SDL_AudioFormat,
pub channels: Uint8,
pub silence: Uint8,
pub samples: Uint16,
pub padding: Uint16,
pub size: Uint32,
pub callback: SDL_AudioCallback,
pub userdata: *mut c_void,
}
pub type SDL_AudioFilter =
Option<unsafe extern "C" fn(cvt: *mut SDL_AudioCVT, format: SDL_AudioFormat)>;
#[repr(C)]
pub struct SDL_AudioCVT {
pub needed: c_int,
pub src_format: SDL_AudioFormat,
pub dst_format: SDL_AudioFormat,
pub rate_incr: f64,
pub buf: *mut Uint8,
pub len: c_int,
pub len_cvt: c_int,
pub len_mult: c_int,
pub len_ratio: f64,
pub filters: [SDL_AudioFilter; 10],
pub filter_index: c_int,
}
pub const SDL_AUDIOCVT_MAX_FILTERS: u32 = 9;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct SDL_AudioDeviceID(pub u32);
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct SDL_AudioStatus(pub u32);
#[allow(missing_docs)]
pub const SDL_AUDIO_STOPPED: SDL_AudioStatus = SDL_AudioStatus(0);
#[allow(missing_docs)]
pub const SDL_AUDIO_PLAYING: SDL_AudioStatus = SDL_AudioStatus(1);
#[allow(missing_docs)]
pub const SDL_AUDIO_PAUSED: SDL_AudioStatus = SDL_AudioStatus(2);
#[allow(unused)]
#[repr(transparent)]
pub struct SDL_AudioStream(c_void);
pub const SDL_MIX_MAXVOLUME: c_int = 128;
extern "C" {
pub fn SDL_GetNumAudioDrivers() -> c_int;
pub fn SDL_GetAudioDriver(index: c_int) -> *const c_char;
pub fn SDL_GetCurrentAudioDriver() -> *const c_char;
pub fn SDL_OpenAudio(
desired: *mut SDL_AudioSpec, obtained: *mut SDL_AudioSpec,
) -> c_int;
pub fn SDL_GetNumAudioDevices(iscapture: c_int) -> c_int;
pub fn SDL_GetAudioDeviceName(
index: c_int, iscapture: c_int,
) -> *const c_char;
pub fn SDL_OpenAudioDevice(
device: *const c_char, iscapture: c_int, desired: *const SDL_AudioSpec,
obtained: *mut SDL_AudioSpec, allowed_changes: c_int,
) -> SDL_AudioDeviceID;
pub fn SDL_GetAudioStatus() -> SDL_AudioStatus;
pub fn SDL_GetAudioDeviceStatus(dev: SDL_AudioDeviceID) -> SDL_AudioStatus;
pub fn SDL_PauseAudio(pause_on: c_int);
pub fn SDL_PauseAudioDevice(dev: SDL_AudioDeviceID, pause_on: c_int);
pub fn SDL_LoadWAV_RW(
src: *mut SDL_RWops, freesrc: c_int, spec: *mut SDL_AudioSpec,
audio_buf: *mut *mut Uint8, audio_len: *mut Uint32,
) -> *mut SDL_AudioSpec;
pub fn SDL_FreeWAV(audio_buf: *mut Uint8);
pub fn SDL_BuildAudioCVT(
cvt: *mut SDL_AudioCVT, src_format: SDL_AudioFormat, src_channels: Uint8,
src_rate: c_int, dst_format: SDL_AudioFormat, dst_channels: Uint8,
dst_rate: c_int,
) -> c_int;
pub fn SDL_ConvertAudio(cvt: *mut SDL_AudioCVT) -> c_int;
pub fn SDL_NewAudioStream(
src_format: SDL_AudioFormat, src_channels: Uint8, src_rate: c_int,
dst_format: SDL_AudioFormat, dst_channels: Uint8, dst_rate: c_int,
) -> *mut SDL_AudioStream;
pub fn SDL_AudioStreamPut(
stream: *mut SDL_AudioStream, buf: *const c_void, len: c_int,
) -> c_int;
pub fn SDL_AudioStreamGet(
stream: *mut SDL_AudioStream, buf: *mut c_void, len: c_int,
) -> c_int;
pub fn SDL_AudioStreamAvailable(stream: *mut SDL_AudioStream) -> c_int;
pub fn SDL_AudioStreamFlush(stream: *mut SDL_AudioStream) -> c_int;
pub fn SDL_AudioStreamClear(stream: *mut SDL_AudioStream);
pub fn SDL_FreeAudioStream(stream: *mut SDL_AudioStream);
pub fn SDL_MixAudio(
dst: *mut Uint8, src: *const Uint8, len: Uint32, volume: c_int,
);
pub fn SDL_MixAudioFormat(
dst: *mut Uint8, src: *const Uint8, format: SDL_AudioFormat, len: Uint32,
volume: c_int,
);
pub fn SDL_QueueAudio(
dev: SDL_AudioDeviceID, data: *const c_void, len: Uint32,
) -> c_int;
pub fn SDL_DequeueAudio(
dev: SDL_AudioDeviceID, data: *mut c_void, len: Uint32,
) -> Uint32;
pub fn SDL_GetQueuedAudioSize(dev: SDL_AudioDeviceID) -> Uint32;
pub fn SDL_ClearQueuedAudio(dev: SDL_AudioDeviceID);
pub fn SDL_LockAudio();
pub fn SDL_LockAudioDevice(dev: SDL_AudioDeviceID);
pub fn SDL_UnlockAudio();
pub fn SDL_UnlockAudioDevice(dev: SDL_AudioDeviceID);
pub fn SDL_CloseAudio();
pub fn SDL_CloseAudioDevice(dev: SDL_AudioDeviceID);
pub fn SDL_GetAudioDeviceSpec(
index: c_int, iscapture: c_int, spec: *mut SDL_AudioSpec,
) -> c_int;
}
#[inline]
pub unsafe fn SDL_LoadWAV(
file: *const c_char, spec: *mut SDL_AudioSpec, audio_buf: *mut *mut Uint8,
audio_len: *mut Uint32,
) -> *mut SDL_AudioSpec {
SDL_LoadWAV_RW(
SDL_RWFromFile(file, b"rb\0".as_ptr().cast()),
1,
spec,
audio_buf,
audio_len,
)
}