⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_mixer.h

📁 上面上传的autotools一文(也就是《使用GNU autotools 改造一个软件项目》)配套的示例程序源代码。
💻 H
📖 第 1 页 / 共 2 页
字号:
/*    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 + -