mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-03 14:18:47 +00:00
222 lines
8.0 KiB
Odin
222 lines
8.0 KiB
Odin
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() ---
|
|
}
|
|
|