import os from ctypes import Structure, POINTER, CFUNCTYPE, c_int, c_char_p, c_void_p, \ c_double from .dll import DLL from .version import SDL_version from .audio import AUDIO_S16LSB, AUDIO_S16MSB from .stdinc import Uint8, Uint16, Uint32, Sint16 from .endian import SDL_LIL_ENDIAN, SDL_BYTEORDER from .rwops import SDL_RWops, SDL_RWFromFile from .error import SDL_SetError, SDL_GetError __all__ = ["get_dll_file", "SDL_MIXER_MAJOR_VERSION", "SDL_MIXER_MINOR_VERSION", "SDL_MIXER_PATCHLEVEL", "SDL_MIXER_VERSION", "MIX_MAJOR_VERSION", "MIX_MINOR_VERSION", "MIX_PATCHLEVEL", "MIX_VERSION", "Mix_Linked_Version", "MIX_InitFlags", "MIX_INIT_FLAC", "MIX_INIT_MOD", "MIX_INIT_MP3", "MIX_INIT_OGG", "MIX_INIT_FLUIDSYNTH", "Mix_Init", "Mix_Quit", "MIX_CHANNELS", "MIX_DEFAULT_FREQUENCY" , "MIX_DEFAULT_FORMAT", "MIX_DEFAULT_CHANNELS", "MIX_MAX_VOLUME", "Mix_Chunk", "Mix_Fading", "MIX_NO_FADING", "MIX_FADING_OUT", "MIX_FADING_IN", "Mix_MusicType", "MUS_NONE", "MUS_CMD", "MUS_WAV", "MUS_MOD", "MUS_MID", "MUS_OGG", "MUS_MP3", "MUS_MP3_MAD", "MUS_FLAC", "MUS_MODPLUG", "Mix_Music", "Mix_OpenAudio", "Mix_AllocateChannels", "Mix_QuerySpec", "Mix_LoadWAV_RW", "Mix_LoadWAV", "Mix_LoadMUS", "Mix_LoadMUS_RW", "Mix_LoadMUSType_RW", "Mix_QuickLoad_WAV", "Mix_QuickLoad_RAW", "Mix_FreeChunk", "Mix_FreeMusic", "Mix_GetNumChunkDecoders", "Mix_GetChunkDecoder", "Mix_GetNumMusicDecoders", "Mix_GetMusicDecoder", "Mix_GetMusicType", "mix_func", "Mix_SetPostMix", "Mix_HookMusic", "music_finished", "Mix_HookMusicFinished", "Mix_GetMusicHookData", "channel_finished", "Mix_ChannelFinished", "MIX_CHANNEL_POST", "Mix_EffectFunc_t", "Mix_EffectDone_t", "Mix_RegisterEffect", "Mix_UnregisterEffect", "Mix_UnregisterAllEffects", "MIX_EFFECTSMAXSPEED", "Mix_SetPanning", "Mix_SetPosition", "Mix_SetDistance", "Mix_SetReverseStereo", "Mix_ReserveChannels", "Mix_GroupChannel", "Mix_GroupChannels", "Mix_GroupAvailable", "Mix_GroupCount", "Mix_GroupOldest", "Mix_GroupNewer", "Mix_PlayChannel", "Mix_PlayChannelTimed", "Mix_PlayMusic", "Mix_FadeInMusic", "Mix_FadeInMusicPos", "Mix_FadeInChannel", "Mix_FadeInChannelTimed", "Mix_Volume", "Mix_VolumeChunk", "Mix_VolumeMusic", "Mix_HaltChannel", "Mix_HaltGroup", "Mix_HaltMusic", "Mix_ExpireChannel", "Mix_FadeOutChannel", "Mix_FadeOutGroup", "Mix_FadeOutMusic", "Mix_FadingMusic", "Mix_FadingChannel", "Mix_Pause", "Mix_Resume", "Mix_Paused", "Mix_PauseMusic", "Mix_ResumeMusic", "Mix_RewindMusic", "Mix_PausedMusic", "Mix_SetMusicPosition", "Mix_Playing", "Mix_PlayingMusic", "Mix_SetMusicCMD", "Mix_SetSynchroValue", "Mix_GetSynchroValue", "Mix_SetSoundFonts", "Mix_GetSoundFonts", "soundfont_function", "Mix_EachSoundFont", "Mix_GetChunk", "Mix_CloseAudio", "Mix_SetError", "Mix_GetError" ] try: dll = DLL("SDL2_mixer", ["SDL2_mixer", "SDL2_mixer-2.0"], os.getenv("PYSDL2_DLL_PATH")) except RuntimeError as exc: raise ImportError(exc) def get_dll_file(): """Gets the file name of the loaded SDL2_mixer library.""" return dll.libfile _bind = dll.bind_function SDL_MIXER_MAJOR_VERSION = 2 SDL_MIXER_MINOR_VERSION = 0 SDL_MIXER_PATCHLEVEL = 0 def SDL_MIXER_VERSION(x): x.major = SDL_MIXER_MAJOR_VERSION x.minor = SDL_MIXER_MINOR_VERSION x.patch = SDL_MIXER_PATCHLEVEL MIX_MAJOR_VERSION = SDL_MIXER_MAJOR_VERSION MIX_MINOR_VERSION = SDL_MIXER_MINOR_VERSION MIX_PATCHLEVEL = SDL_MIXER_PATCHLEVEL MIX_VERSION = SDL_MIXER_VERSION Mix_Linked_Version = _bind("Mix_Linked_Version", None, POINTER(SDL_version)) MIX_InitFlags = c_int MIX_INIT_FLAC = 0x00000001 MIX_INIT_MOD = 0x00000002 MIX_INIT_MODPLUG = 0x00000004 MIX_INIT_MP3 = 0x00000008 MIX_INIT_OGG = 0x000000010 MIX_INIT_FLUIDSYNTH = 0x00000020 Mix_Init = _bind("Mix_Init", [c_int], c_int) Mix_Quit = _bind("Mix_Quit") MIX_CHANNELS = 8 MIX_DEFAULT_FREQUENCY = 22050 if SDL_BYTEORDER == SDL_LIL_ENDIAN: MIX_DEFAULT_FORMAT = AUDIO_S16LSB else: MIX_DEFAULT_FORMAT = AUDIO_S16MSB MIX_DEFAULT_CHANNELS = 2 MIX_MAX_VOLUME = 128 class Mix_Chunk(Structure): _fields_ = [("allocated", c_int), ("abuf", POINTER(Uint8)), ("alen", Uint32), ("volume", Uint8)] Mix_Fading = c_int MIX_NO_FADING = 0 MIX_FADING_OUT = 1 MIX_FADING_IN = 2 Mix_MusicType = c_int MUS_NONE = 0 MUS_CMD = 1 MUS_WAV = 2 MUS_MOD = 3 MUS_MID = 4 MUS_OGG = 5 MUS_MP3 = 6 MUS_MP3_MAD = 7 MUS_FLAC = 8 MUS_MODPLUG = 9 class Mix_Music(Structure): pass Mix_OpenAudio = _bind("Mix_OpenAudio", [c_int, Uint16, c_int, c_int], c_int) Mix_AllocateChannels = _bind("Mix_AllocateChannels", [c_int], c_int) Mix_QuerySpec = _bind("Mix_QuerySpec", [POINTER(c_int), POINTER(Uint16), POINTER(c_int)], c_int) Mix_LoadWAV_RW = _bind("Mix_LoadWAV_RW", [POINTER(SDL_RWops), c_int], POINTER(Mix_Chunk)) Mix_LoadWAV = lambda fname: Mix_LoadWAV_RW(SDL_RWFromFile(fname, b"rb"), 1) Mix_LoadMUS = _bind("Mix_LoadMUS", [c_char_p], POINTER(Mix_Music)) Mix_LoadMUS_RW = _bind("Mix_LoadMUS_RW", [POINTER(SDL_RWops)], POINTER(Mix_Music)) Mix_LoadMUSType_RW = _bind("Mix_LoadMUSType_RW", [POINTER(SDL_RWops), Mix_MusicType, c_int], POINTER(Mix_Music)) Mix_QuickLoad_WAV = _bind("Mix_QuickLoad_WAV", [POINTER(Uint8)], POINTER(Mix_Chunk)) Mix_QuickLoad_RAW = _bind("Mix_QuickLoad_RAW", [POINTER(Uint8), Uint32], POINTER(Mix_Chunk)) Mix_FreeChunk = _bind("Mix_FreeChunk", [POINTER(Mix_Chunk)]) Mix_FreeMusic = _bind("Mix_FreeMusic", [POINTER(Mix_Music)]) Mix_GetNumChunkDecoders = _bind("Mix_GetNumChunkDecoders", None, c_int) Mix_GetChunkDecoder = _bind("Mix_GetChunkDecoder", [c_int], c_char_p) Mix_GetNumMusicDecoders = _bind("Mix_GetNumMusicDecoders", None, c_int) Mix_GetMusicDecoder = _bind("Mix_GetMusicDecoder", [c_int], c_char_p) Mix_GetMusicType = _bind("Mix_GetMusicType", [POINTER(Mix_Music)], Mix_MusicType) mix_func = CFUNCTYPE(None, c_void_p, POINTER(Uint8), c_int) Mix_SetPostMix = _bind("Mix_SetPostMix", [mix_func, c_void_p]) Mix_HookMusic = _bind("Mix_HookMusic", [mix_func, c_void_p]) music_finished = CFUNCTYPE(None) Mix_HookMusicFinished = _bind("Mix_HookMusicFinished", [music_finished]) Mix_GetMusicHookData = _bind("Mix_GetMusicHookData", None, c_void_p) channel_finished = CFUNCTYPE(None, c_int) Mix_ChannelFinished = _bind("Mix_ChannelFinished", [channel_finished]) MIX_CHANNEL_POST = -2 Mix_EffectFunc_t = CFUNCTYPE(None, c_int, c_void_p, c_int, c_void_p) Mix_EffectDone_t = CFUNCTYPE(None, c_int, c_void_p) Mix_RegisterEffect = _bind("Mix_RegisterEffect", [c_int, Mix_EffectFunc_t, Mix_EffectDone_t, c_void_p], c_int) Mix_UnregisterEffect = _bind("Mix_UnregisterEffect", [c_int, Mix_EffectFunc_t], c_int) Mix_UnregisterAllEffects = _bind("Mix_UnregisterAllEffects", [c_int]) MIX_EFFECTSMAXSPEED = "MIX_EFFECTSMAXSPEED" Mix_SetPanning = _bind("Mix_SetPanning", [c_int, Uint8, Uint8], c_int) Mix_SetPosition = _bind("Mix_SetPosition", [c_int, Sint16, Uint8], c_int) Mix_SetDistance = _bind("Mix_SetDistance", [c_int, Uint8]) Mix_SetReverseStereo = _bind("Mix_SetReverseStereo", [c_int, c_int], c_int) Mix_ReserveChannels = _bind("Mix_ReserveChannels", [c_int], c_int) Mix_GroupChannel = _bind("Mix_GroupChannel", [c_int, c_int], c_int) Mix_GroupChannels = _bind("Mix_GroupChannels", [c_int, c_int, c_int], c_int) Mix_GroupAvailable = _bind("Mix_GroupAvailable", [c_int], c_int) Mix_GroupCount = _bind("Mix_GroupCount", [c_int], c_int) Mix_GroupOldest = _bind("Mix_GroupOldest", [c_int], c_int) Mix_GroupNewer = _bind("Mix_GroupNewer", [c_int], c_int) Mix_PlayChannel = lambda channel, chunk, loops: Mix_PlayChannelTimed(channel, chunk, loops, -1) Mix_PlayChannelTimed = _bind("Mix_PlayChannelTimed", [c_int, POINTER(Mix_Chunk), c_int, c_int], c_int) Mix_PlayMusic = _bind("Mix_PlayMusic", [POINTER(Mix_Music), c_int], c_int) Mix_FadeInMusic = _bind("Mix_FadeInMusic", [POINTER(Mix_Music), c_int, c_int], c_int) Mix_FadeInMusicPos = _bind("Mix_FadeInMusicPos", [POINTER(Mix_Music), c_int, c_int, c_double], c_int) Mix_FadeInChannel = lambda channel, chunk, loops, ms: Mix_FadeInChannelTimed(channel, chunk, loops, ms, -1) Mix_FadeInChannelTimed = _bind("Mix_FadeInChannelTimed", [c_int, POINTER(Mix_Chunk), c_int, c_int, c_int], c_int) Mix_Volume = _bind("Mix_Volume", [c_int, c_int], c_int) Mix_VolumeChunk = _bind("Mix_VolumeChunk", [POINTER(Mix_Chunk), c_int], c_int) Mix_VolumeMusic = _bind("Mix_VolumeMusic", [c_int], c_int) Mix_HaltChannel = _bind("Mix_HaltChannel", [c_int], c_int) Mix_HaltGroup = _bind("Mix_HaltGroup", [c_int], c_int) Mix_HaltMusic = _bind("Mix_HaltMusic", None, c_int) Mix_ExpireChannel = _bind("Mix_ExpireChannel", [c_int, c_int], c_int) Mix_FadeOutChannel = _bind("Mix_FadeOutChannel", [c_int, c_int], c_int) Mix_FadeOutGroup = _bind("Mix_FadeOutGroup", [c_int, c_int], c_int) Mix_FadeOutMusic = _bind("Mix_FadeOutMusic", [c_int], c_int) Mix_FadingMusic = _bind("Mix_FadingMusic", None, Mix_Fading) Mix_FadingChannel = _bind("Mix_FadingChannel", [c_int], Mix_Fading) Mix_Pause = _bind("Mix_Pause", [c_int]) Mix_Resume = _bind("Mix_Resume", [c_int]) Mix_Paused = _bind("Mix_Paused", [c_int], c_int) Mix_PauseMusic = _bind("Mix_PauseMusic") Mix_ResumeMusic = _bind("Mix_ResumeMusic") Mix_RewindMusic = _bind("Mix_RewindMusic") Mix_PausedMusic = _bind("Mix_PauseMusic", None, c_int) Mix_SetMusicPosition = _bind("Mix_SetMusicPosition", [c_double], c_int) Mix_Playing = _bind("Mix_Playing", [c_int], c_int) Mix_PlayingMusic = _bind("Mix_PlayingMusic", None, c_int) Mix_SetMusicCMD = _bind("Mix_SetMusicCMD", [c_char_p], c_int) Mix_SetSynchroValue = _bind("Mix_SetSynchroValue", [c_int], c_int) Mix_GetSynchroValue = _bind("Mix_GetSynchroValue", None, c_int) Mix_SetSoundFonts = _bind("Mix_SetSoundFonts", [c_char_p], c_int) Mix_GetSoundFonts = _bind("Mix_GetSoundFonts", None, c_char_p) soundfont_function = CFUNCTYPE(c_int, c_char_p, c_void_p) Mix_EachSoundFont = _bind("Mix_EachSoundFont", [soundfont_function, c_void_p], c_int) Mix_GetChunk = _bind("Mix_GetChunk", [c_int], POINTER(Mix_Chunk)) Mix_CloseAudio = _bind("Mix_CloseAudio") Mix_SetError = SDL_SetError Mix_GetError = SDL_GetError