package sdl2_mixer import "core:c" import SDL ".." when ODIN_OS == .Windows { foreign import lib "SDL2_mixer.lib" } else { foreign import lib "system:SDL2_mixer" } MAJOR_VERSION :: 2 MINOR_VERSION :: 0 PATCHLEVEL :: 4 CHANNELS :: 8 bool :: SDL.bool InitFlag :: enum c.int { FLAC = 0, MOD = 1, MP3 = 3, OGG = 4, MID = 5, OPUS = 6, } InitFlags :: distinct bit_set[InitFlag; c.int] INIT_FLAC :: InitFlags{.FLAC} INIT_MOD :: InitFlags{.MOD} INIT_MP3 :: InitFlags{.MP3} INIT_OGG :: InitFlags{.OGG} INIT_MID :: InitFlags{.MID} INIT_OPUS :: InitFlags{.OPUS} DEFAULT_FREQUENCY :: 44100 DEFAULT_FORMAT :: SDL.AUDIO_S16SYS DEFAULT_CHANNELS :: 2 MAX_VOLUME :: SDL.MIX_MAXVOLUME Chunk :: struct { allocated: c.int, abuf: [^]u8, alen: u32, volume: u8, /* Per-sample volume, 0-128 */ } Fading :: enum c.int { NO_FADING, FADING_OUT, FADING_IN, } NO_FADING :: Fading.NO_FADING FADING_OUT :: Fading.FADING_OUT FADING_IN :: Fading.FADING_IN MusicType :: enum c.int { NONE, CMD, WAV, MOD, MID, OGG, MP3, MP3_MAD_UNUSED, FLAC, MODPLUG_UNUSED, OPUS, } MUS_NONE :: MusicType.NONE MUS_CMD :: MusicType.CMD MUS_WAV :: MusicType.WAV MUS_MOD :: MusicType.MOD MUS_MID :: MusicType.MID MUS_OGG :: MusicType.OGG MUS_MP3 :: MusicType.MP3 MUS_MP3_MAD_UNUSED :: MusicType.MP3_MAD_UNUSED MUS_FLAC :: MusicType.FLAC MUS_MODPLUG_UNUSED :: MusicType.MODPLUG_UNUSED MUS_OPUS :: MusicType.OPUS Music :: struct {} /* We'll use SDL for reporting errors */ SetError :: SDL.SetError GetError :: SDL.GetError ClearError :: SDL.ClearError LoadWAV :: #force_inline proc "c" (file: cstring) -> ^Chunk { return LoadWAV_RW(SDL.RWFromFile(file, "rb"), true) } MixFunc :: proc "c" (udata: rawptr, stream: [^]u8, len: c.int) @(default_calling_convention="c", link_prefix="Mix_") foreign lib { Linked_Version :: proc() -> ^SDL.version --- Init :: proc(flags: InitFlags) -> c.int --- Quit :: proc() --- OpenAudio :: proc(frequency: c.int, format: u16, channels: c.int, chunksize: c.int) -> c.int --- OpenAudioDevice :: proc(frequency: c.int, format: u16, channels: c.int, chunksize: c.int, device: cstring, allowed_changed: c.int) -> c.int --- AllocateChannels :: proc(numchans: c.int) -> c.int --- QuerySpec :: proc(frequency: ^c.int, format: ^u16, channels: ^c.int) -> c.int --- LoadWAV_RW :: proc(src: ^SDL.RWops, freesrc: bool) -> ^Chunk --- LoadMUS :: proc(file: cstring) -> ^Music --- LoadMUS_RW :: proc(src: ^SDL.RWops, freesrc: bool) -> ^Music --- LoadMUSType_RW :: proc(src: ^SDL.RWops, type: MusicType, freesrc: bool) -> ^Music --- QuickLoad_WAV :: proc(mem: [^]u8) -> ^Chunk --- QuickLoad_RAW :: proc(mem: [^]u8, len: u32) -> ^Chunk --- FreeChunk :: proc(chunk: ^Chunk) --- FreeMusic :: proc(music: ^Music) --- GetNumChunkDecoders :: proc() -> c.int --- GetChunkDecoder :: proc(index: c.int) -> cstring --- HasChunkDecoder :: proc(name: cstring) -> bool --- GetNumMusicDecoders :: proc() -> c.int --- GetMusicDecoder :: proc(index: c.int) -> cstring --- HasMusicDecoder :: proc(name: cstring) -> bool --- GetMusicType :: proc(music: ^Music) -> MusicType --- GetMusicTitle :: proc(music: ^Music) -> cstring --- GetMusicTitleTag :: proc(music: ^Music) -> cstring --- GetMusicArtistTag :: proc(music: ^Music) -> cstring --- GetMusicAlbumTag :: proc(music: ^Music) -> cstring --- GetMusicCopyrightTag :: proc(music: ^Music) -> cstring --- SetPostMix :: proc(mix_func: MixFunc, arg: rawptr) --- HookMusic :: proc(mix_func: MixFunc, arg: rawptr) --- HookMusicFinished :: proc(music_finished: proc "c" ()) --- GetMusicHookData :: proc() -> rawptr --- ChannelFinished :: proc(channel_finished: proc "c" (channel: c.int)) --- } CHANNEL_POST :: -2 EffectFunc_t :: proc "c" (chan: c.int, stream: rawptr, len: c.int, udata: rawptr) EffectDone_t :: proc "c" (chan: c.int, udata: rawptr) EFFECTSMAXSPEED :: "MIX_EFFECTSMAXSPEED" PlayChannel :: #force_inline proc "c" (channel: c.int, chunk: ^Chunk, loops: c.int) -> c.int { return PlayChannelTimed(channel, chunk, loops, -1) } FadeInChannel :: #force_inline proc "c" (channel: c.int, chunk: ^Chunk, loops: c.int, ms: c.int) -> c.int { return FadeInChannelTimed(channel, chunk, loops, ms, -1) } @(default_calling_convention="c", link_prefix="Mix_") foreign lib { RegisterEffect :: proc(chan: c.int, f: EffectFunc_t, d: EffectDone_t, arg: rawptr) -> c.int --- UnregisterEffect :: proc(channel: c.int, f: EffectFunc_t) -> c.int --- UnregisterAllEffects :: proc(channel: c.int) -> c.int --- SetPanning :: proc(channel: c.int, left, right: u8) -> c.int --- SetPosition :: proc(channel: c.int, angle: i16, distance: u8) -> c.int --- SetDistance :: proc(channel: c.int, distance: u8) -> c.int --- SetReverseStereo :: proc(channel: c.int, flip: bool) -> c.int --- ReserveChannels :: proc(num: c.int) -> c.int --- GroupChannel :: proc(which: c.int, tag: c.int) -> c.int --- GroupChannels :: proc(from, to: c.int, tag: c.int) -> c.int --- GroupAvailable :: proc(tag: c.int) -> c.int --- GroupCount :: proc(tag: c.int) -> c.int --- GroupOldest :: proc(tag: c.int) -> c.int --- GroupNewer :: proc(tag: c.int) -> c.int --- PlayChannelTimed :: proc(channel: c.int, chunk: ^Chunk, loops: c.int, ticks: c.int) -> c.int --- PlayMusic :: proc(music: ^Music, loops: c.int) -> c.int --- FadeInMusic :: proc(music: ^Music, loops: c.int, ms: c.int) -> c.int --- FadeInMusicPos :: proc(music: ^Music, loops: c.int, ms: c.int, position: f64) -> c.int --- FadeInChannelTimed :: proc(channel: c.int, chunk: ^Chunk, loops: c.int, ms: c.int, ticks: c.int) -> c.int --- Volume :: proc(channel: c.int, volume: c.int) -> c.int --- VolumeChunk :: proc(chunk: ^Chunk, volume: c.int) -> c.int --- VolumeMusic :: proc(volume: c.int) -> c.int --- GetMusicVolume :: proc(music: ^Music) -> c.int --- HaltChannel :: proc(channel: c.int) -> c.int --- HaltGroup :: proc(tag: c.int) -> c.int --- HaltMusic :: proc() -> c.int --- ExpireChannel :: proc(channel: c.int, ticks: c.int) -> c.int --- FadeOutChannel :: proc(which: c.int, ms: c.int) -> c.int --- FadeOutGroup :: proc(tag: c.int, ms: c.int) -> c.int --- FadeOutMusic :: proc(ms: c.int) -> c.int --- FadingMusic :: proc() -> Fading --- FadingChannel :: proc(which: c.int) -> Fading --- Pause :: proc(channel: c.int) --- Resume :: proc(channel: c.int) --- Paused :: proc(channel: c.int) -> c.int --- PauseMusic :: proc() --- ResumeMusic :: proc() --- RewindMusic :: proc() --- PausedMusic :: proc() -> c.int --- ModMusicJumpToOrder :: proc(order: c.int) -> c.int --- SetMusicPosition :: proc(position: f64) -> c.int --- GetMusicPosition :: proc(music: ^Music) -> f64 --- MusicDuration :: proc(music: ^Music) -> f64 --- GetMusicLoopStartTime :: proc(music: ^Music) -> f64 --- GetMusicLoopEndTime :: proc(music: ^Music) -> f64 --- GetMusicLoopLengthTime:: proc(music: ^Music) -> f64 --- Playing :: proc(channel: c.int) -> c.int --- PlayingMusic :: proc() -> c.int --- SetMusicCMD :: proc(command: cstring) -> c.int --- SetSynchroValue :: proc(value: c.int) -> c.int --- GetSynchroValue :: proc() -> c.int --- SetSoundFonts :: proc(paths: cstring) -> c.int --- GetSoundFonts :: proc() -> cstring --- EachSoundFont :: proc(function : proc "c" (cstring, rawptr) -> c.int, data: rawptr) -> c.int --- SetTimidityCfg :: proc(path: cstring) -> c.int --- GetTimidityCfg :: proc() -> cstring --- GetChunk :: proc(channel: c.int) -> ^Chunk --- CloseAudio :: proc() --- }