📄 sdl_mixer.h
字号:
/* SDL_mixer: An audio mixer library based on the SDL library Copyright (C) 1997-2004 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Sam Lantinga slouken@libsdl.org*//* $Id: SDL_mixer.h,v 1.30 2004/01/04 17:37:04 slouken Exp $ */#ifndef _SDL_MIXER_H#define _SDL_MIXER_H#include "SDL_types.h"#include "SDL_rwops.h"#include "SDL_audio.h"#include "SDL_byteorder.h"#include "SDL_version.h"#include "begin_code.h"/* Set up for C function definitions, even when using C++ */#ifdef __cplusplusextern "C" {#endif/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL*/#define SDL_MIXER_MAJOR_VERSION 1#define SDL_MIXER_MINOR_VERSION 2#define SDL_MIXER_PATCHLEVEL 6/* This macro can be used to fill a version structure with the compile-time * version of the SDL_mixer library. */#define SDL_MIXER_VERSION(X) \{ \ (X)->major = SDL_MIXER_MAJOR_VERSION; \ (X)->minor = SDL_MIXER_MINOR_VERSION; \ (X)->patch = SDL_MIXER_PATCHLEVEL; \}/* Backwards compatibility */#define MIX_MAJOR_VERSION SDL_MIXER_MAJOR_VERSION#define MIX_MINOR_VERSION SDL_MIXER_MINOR_VERSION#define MIX_PATCHLEVEL SDL_MIXER_PATCHLEVEL#define MIX_VERSION(X) SDL_MIXER_VERSION(X)/* This function gets the version of the dynamically linked SDL_mixer library. it should NOT be used to fill a version structure, instead you should use the SDL_MIXER_VERSION() macro. */extern DECLSPEC const SDL_version * SDLCALL Mix_Linked_Version(void);/* The default mixer has 8 simultaneous mixing channels */#ifndef MIX_CHANNELS#define MIX_CHANNELS 8#endif/* Good default values for a PC soundcard */#define MIX_DEFAULT_FREQUENCY 22050#if SDL_BYTEORDER == SDL_LIL_ENDIAN#define MIX_DEFAULT_FORMAT AUDIO_S16LSB#else#define MIX_DEFAULT_FORMAT AUDIO_S16MSB#endif#define MIX_DEFAULT_CHANNELS 2#define MIX_MAX_VOLUME 128 /* Volume of a chunk *//* The internal format for an audio chunk */typedef struct { int allocated; Uint8 *abuf; Uint32 alen; Uint8 volume; /* Per-sample volume, 0-128 */} Mix_Chunk;/* The different fading types supported */typedef enum { MIX_NO_FADING, MIX_FADING_OUT, MIX_FADING_IN} Mix_Fading;typedef enum { MUS_NONE, MUS_CMD, MUS_WAV, MUS_MOD, MUS_MID, MUS_OGG, MUS_MP3} Mix_MusicType;/* The internal format for a music chunk interpreted via mikmod */typedef struct _Mix_Music Mix_Music;/* Open the mixer with a certain audio format */extern DECLSPEC int SDLCALL Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize);/* Dynamically change the number of channels managed by the mixer. If decreasing the number of channels, the upper channels are stopped. This function returns the new number of allocated channels. */extern DECLSPEC int SDLCALL Mix_AllocateChannels(int numchans);/* Find out what the actual audio device parameters are. This function returns 1 if the audio has been opened, 0 otherwise. */extern DECLSPEC int SDLCALL Mix_QuerySpec(int *frequency,Uint16 *format,int *channels);/* Load a wave file or a music (.mod .s3m .it .xm) file */extern DECLSPEC Mix_Chunk * SDLCALL Mix_LoadWAV_RW(SDL_RWops *src, int freesrc);#define Mix_LoadWAV(file) Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1)extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS(const char *file);#ifdef USE_RWOPS /* This hasn't been hooked into music.c yet *//* Load a music file from an SDL_RWop object (MikMod-specific currently) Matt Campbell (matt@campbellhome.dhs.org) April 2000 */extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS_RW(SDL_RWops *rw);#endif/* Load a wave file of the mixer format from a memory buffer */extern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_WAV(Uint8 *mem);/* Load raw audio data of the mixer format from a memory buffer */extern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len);/* Free an audio chunk previously loaded */extern DECLSPEC void SDLCALL Mix_FreeChunk(Mix_Chunk *chunk);extern DECLSPEC void SDLCALL Mix_FreeMusic(Mix_Music *music);/* Find out the music format of a mixer music, or the currently playing music, if 'music' is NULL.*/extern DECLSPEC Mix_MusicType SDLCALL Mix_GetMusicType(const Mix_Music *music);/* Set a function that is called after all mixing is performed. This can be used to provide real-time visual display of the audio stream or add a custom mixer filter for the stream data.*/extern DECLSPEC void SDLCALL Mix_SetPostMix(void (*mix_func) (void *udata, Uint8 *stream, int len), void *arg);/* Add your own music player or additional mixer function. If 'mix_func' is NULL, the default music player is re-enabled. */extern DECLSPEC void SDLCALL Mix_HookMusic(void (*mix_func) (void *udata, Uint8 *stream, int len), void *arg);/* Add your own callback when the music has finished playing. This callback is only called if the music finishes naturally. */extern DECLSPEC void SDLCALL Mix_HookMusicFinished(void (*music_finished)(void));/* Get a pointer to the user data for the current music hook */extern DECLSPEC void * SDLCALL Mix_GetMusicHookData(void);/* * Add your own callback when a channel has finished playing. NULL * to disable callback. The callback may be called from the mixer's audio * callback or it could be called as a result of Mix_HaltChannel(), etc. * do not call SDL_LockAudio() from this callback; you will either be * inside the audio callback, or SDL_mixer will explicitly lock the audio * before calling your callback. */extern DECLSPEC void SDLCALL Mix_ChannelFinished(void (*channel_finished)(int channel));/* Special Effects API by ryan c. gordon. (icculus@linuxgames.com) */#define MIX_CHANNEL_POST -2/* This is the format of a special effect callback: * * myeffect(int chan, void *stream, int len, void *udata); * * (chan) is the channel number that your effect is affecting. (stream) is * the buffer of data to work upon. (len) is the size of (stream), and * (udata) is a user-defined bit of data, which you pass as the last arg of * Mix_RegisterEffect(), and is passed back unmolested to your callback. * Your effect changes the contents of (stream) based on whatever parameters * are significant, or just leaves it be, if you prefer. You can do whatever * you like to the buffer, though, and it will continue in its changed state * down the mixing pipeline, through any other effect functions, then finally * to be mixed with the rest of the channels and music for the final output * stream. * * DO NOT EVER call SDL_LockAudio() from your callback function! */typedef void (*Mix_EffectFunc_t)(int chan, void *stream, int len, void *udata);/* * This is a callback that signifies that a channel has finished all its * loops and has completed playback. This gets called if the buffer * plays out normally, or if you call Mix_HaltChannel(), implicitly stop * a channel via Mix_AllocateChannels(), or unregister a callback while * it's still playing. * * DO NOT EVER call SDL_LockAudio() from your callback function! */typedef void (*Mix_EffectDone_t)(int chan, void *udata);/* Register a special effect function. At mixing time, the channel data is * copied into a buffer and passed through each registered effect function. * After it passes through all the functions, it is mixed into the final * output stream. The copy to buffer is performed once, then each effect * function performs on the output of the previous effect. Understand that * this extra copy to a buffer is not performed if there are no effects * registered for a given chunk, which saves CPU cycles, and any given * effect will be extra cycles, too, so it is crucial that your code run * fast. Also note that the data that your function is given is in the * format of the sound device, and not the format you gave to Mix_OpenAudio(), * although they may in reality be the same. This is an unfortunate but * necessary speed concern. Use Mix_QuerySpec() to determine if you can * handle the data before you register your effect, and take appropriate * actions. * You may also specify a callback (Mix_EffectDone_t) that is called when * the channel finishes playing. This gives you a more fine-grained control * than Mix_ChannelFinished(), in case you need to free effect-specific * resources, etc. If you don't need this, you can specify NULL. * You may set the callbacks before or after calling Mix_PlayChannel(). * Things like Mix_SetPanning() are just internal special effect functions, * so if you are using that, you've already incurred the overhead of a copy * to a separate buffer, and that these effects will be in the queue with * any functions you've registered. The list of registered effects for a * channel is reset when a chunk finishes playing, so you need to explicitly * set them with each call to Mix_PlayChannel*(). * You may also register a special effect function that is to be run after * final mixing occurs. The rules for these callbacks are identical to those * in Mix_RegisterEffect, but they are run after all the channels and the * music have been mixed into a single stream, whereas channel-specific * effects run on a given channel before any other mixing occurs. These * global effect callbacks are call "posteffects". Posteffects only have * their Mix_EffectDone_t function called when they are unregistered (since * the main output stream is never "done" in the same sense as a channel). * You must unregister them manually when you've had enough. Your callback * will be told that the channel being mixed is (MIX_CHANNEL_POST) if the * processing is considered a posteffect. * * After all these effects have finished processing, the callback registered * through Mix_SetPostMix() runs, and then the stream goes to the audio * device. * * DO NOT EVER call SDL_LockAudio() from your callback function! * * returns zero if error (no such channel), nonzero if added. * Error messages can be retrieved from Mix_GetError(). */extern DECLSPEC int SDLCALL Mix_RegisterEffect(int chan, Mix_EffectFunc_t f, Mix_EffectDone_t d, void *arg);/* You may not need to call this explicitly, unless you need to stop an * effect from processing in the middle of a chunk's playback. * Posteffects are never implicitly unregistered as they are for channels, * but they may be explicitly unregistered through this function by * specifying MIX_CHANNEL_POST for a channel. * returns zero if error (no such channel or effect), nonzero if removed. * Error messages can be retrieved from Mix_GetError(). */extern DECLSPEC int SDLCALL Mix_UnregisterEffect(int channel, Mix_EffectFunc_t f);/* You may not need to call this explicitly, unless you need to stop all * effects from processing in the middle of a chunk's playback. Note that * this will also shut off some internal effect processing, since * Mix_SetPanning() and others may use this API under the hood. This is * called internally when a channel completes playback. * Posteffects are never implicitly unregistered as they are for channels, * but they may be explicitly unregistered through this function by * specifying MIX_CHANNEL_POST for a channel. * returns zero if error (no such channel), nonzero if all effects removed. * Error messages can be retrieved from Mix_GetError(). */extern DECLSPEC int SDLCALL Mix_UnregisterAllEffects(int channel);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -