[Top] [Contents] [Index] [ ? ]

SDL_mixer 1.2.5

1. Overview  The README from the SDL_mixer distribution

2. Getting Started  Using SDL_mixer

3. Conflicts  Conflicts with SDL Audio functions

4. Functions  Functions supported by the SDL_mixer API
5. Types  Types used with the SDL_mixer API
6. Defines  Defined values/macros in the SDL_mixer API

7. Glossary  Terms used in this document

Index  Index of selected words

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1. Overview

A Little Bit About Me

I am currently, as I write this document, a programmer for Raytheon. There I do all sorts of communications, network, GUI, and other general programming tasks in C/C++ on the Solaris and sometimes Linux Operating Systems. I have been programming sound code in my free time for only a little while now. Sound is an integral part to any game. The human senses are mostly starved during video game play. there's only some tactile feedback on some controlers, and of course the eyes are in use but only for about 30% of their viewing area. So to add more we do need sound to help the game player feel more in the action, and to set certain moods as the game progresses. Sound ends up accounting for perhaps 50% or more of a gamers experience. Music and sound effects are all integral parts of the gaming experience. While this document doesn't explain how to get music and samples to use, it will explain how to use them with SDL_mixer.

Feel free to contact me: jcatki@jcatki.no-ip.org

I am also usually on IRC at irc.freenode.net in the #SDL channel as LIM

This is the README in the SDL_mixer source archive.

SDL_mixer 1.2

The latest version of this library is available from:
SDL_mixer Homepage

Due to popular demand, here is a simple multi-channel audio mixer. It supports 8 channels of 16 bit stereo audio, plus a single channel of music, mixed by the popular MikMod MOD, Timidity MIDI and SMPEG MP3 libraries.

See the header file SDL_mixer.h and the examples playwave.c and playmus.c for documentation on this mixer library.

The mixer can currently load Microsoft WAVE files and Creative Labs VOC files as audio samples, and can load MIDI files via Timidity and the following music formats via MikMod: .MOD .S3M .IT .XM. It can load Ogg Vorbis streams as music if built with the Ogg Vorbis libraries, and finally it can load MP3 music using the SMPEG library.

The process of mixing MIDI files to wave output is very CPU intensive, so if playing regular WAVE files sound great, but playing MIDI files sound choppy, try using 8-bit audio, mono audio, or lower frequencies.

To play MIDI files, you'll need to get a complete set of GUS patches from: Timidity GUS Patches and unpack them in /usr/local/lib under UNIX, and C:\ under Win32.

This library is available under the GNU Library General Public License, see the file "COPYING" for details.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2. Getting Started

This assumes you have gotten SDL_mixer and installed it on your system. SDL_mixer has an INSTALL document in the source distribution to help you get it compiled and installed.

Generally, installation consists of:

 
./configure
make
make install

SDL_mixer supports playing music and sound samples from the following formats:
- WAVE/RIFF (.wav)
- AIFF (.aiff)
- VOC (.voc)
- MOD (.mod .xm .s3m .669 .it .med and more) using included mikmod
- MIDI (.mid) using timidity or native midi hardware
- OggVorbis (.ogg) requiring ogg/vorbis libraries on system
- MP3 (.mp3) requiring SMPEG library on system
- also any command-line player, which is not mixed by SDL_mixer...

You may also want to look at some demonstration code which may be downloaded from:
http://jcatki.no-ip.org/SDL_mixer/

2.1 Includes  The include files to use for SDL_mixer
2.2 Compiling  Using the SDL_mixer library and header file.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 Includes

To use SDL_mixer functions in a C/C++ source code file, you must use the SDL_mixer.h include file:

#include "SDL_mixer.h"


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 Compiling

To link with SDL_mixer you should use sdl-config to get the required SDL compilation options. After that, compiling with SDL_mixer is quite easy.
Note: Some systems may not have the SDL_mixer library and include file in the same place as the SDL library and includes are located, in that case you will need to add more -I and -L paths to these command lines.

Simple Example for compiling an object file:

cc -c `sdl-config --cflags` mysource.c

Simple Example for compiling an object file:

cc -o myprogram mysource.o `sdl-config --libs` -lSDL_mixer

Now myprogram is ready to run.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3. Conflicts

When using SDL_mixer functions you need to avoid the following functions from SDL:

SDL_OpenAudio
Use Mix_OpenAudio instead.
SDL_CloseAudio
Use Mix_CloseAudio instead.
SDL_PauseAudio
Use Mix_Pause(-1) and Mix_PauseMusic instead, to pause.
Use Mix_Resume(-1) and Mix_ResumeMusic instead, to unpause.
SDL_LockAudio
This is just not needed since SDL_mixer handles this for you.
Using it may cause problems as well.
SDL_UnlockAudio
This is just not needed since SDL_mixer handles this for you.
Using it may cause problems as well.

You may call the following functions freely:

SDL_AudioDriverName
This will still work as usual.
SDL_GetAudioStatus
This will still work, though it will likely return SDL_AUDIO_PLAYING even though SDL_mixer is just playing silence.

It is also a BAD idea to call SDL_mixer and SDL audio functions from a callback. Callbacks include Effects functions and other SDL_mixer audio hooks.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. Functions

These are the functions in the SDL_mixer API.

4.1 General  API activation
4.2 Samples  Loading sounds from files or memory
4.3 Channels  Sound effect channels
4.4 Groups  Sound effect channel grouping
4.5 Music  Music playing
4.6 Effects  Special effects processing


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 General

These functions are useful, as they are the only/best ways to work with SDL_mixer.

Info
4.1.1 Mix_Linked_Version  Get version number
Activation
4.1.2 Mix_OpenAudio  Open sound mixer
4.1.3 Mix_CloseAudio  Close sound mixer
Errors
4.1.4 Mix_SetError  Set the current error string
4.1.5 Mix_GetError  Get the current error string
Settings
4.1.6 Mix_QuerySpec  Get output format


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1.1 Mix_Linked_Version

const SDL_version *Mix_Linked_Version()
void MIX_VERSION(SDL_version *compile_version)

This works similar to SDL_Linked_Version and SDL_VERSION.
Using these you can compare the runtime version to the version that you compiled with.

 
SDL_version compile_version, *link_version;
MIX_VERSION(&compile_version);
printf("compiled with SDL_mixer version: %d.%d.%d\n", 
        compile_version.major,
        compile_version.minor,
        compile_version.patch);
link_version=Mix_Linked_Version();
printf("running with SDL_mixer version: %d.%d.%d\n", 
        link_version->major,
        link_version->minor,
        link_version->patch);

See Also:
4.1.2 Mix_OpenAudio, 4.1.6 Mix_QuerySpec


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1.2 Mix_OpenAudio

int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)

frequency
Output sampling frequency in samples per second (Hz).
you might use MIX_DEFAULT_FREQUENCY(22050) since that is a good value for most games.
format
Output sample format.
channels
Number of sound channels in output.
Set to 2 for stereo, 1 for mono. This has nothing to do with mixing channels.
chunksize
Bytes used per output sample.

Initialize the mixer API.
This must be called before using other functions in this library.
SDL must be initialized with SDL_INIT_AUDIO before this call. frequency would be 44100 for 44.1KHz, which is CD audio rate. Most games use 22050, because 44100 requires too much CPU power on older computers. chunksize is the size of each mixed sample. The smaller this is the more your hooks will be called. If make this too small on a slow system, sound may skip. If made to large, sound effects will lag behind the action more. You want a happy medium for your target computer. You also may make this 4096, or larger, if you are just playing music. MIX_CHANNELS(8) mixing channels will be allocated by default. You may call this function multiple times, however you will have to call Mix_CloseAudio just as many times for the device to actually close. The format will not changed on subsequent calls. So you will have to close all the way before trying to open with different format parameters.

format is based on SDL audio support, see SDL_audio.h. Here are the values listed there:

AUDIO_U8
Unsigned 8-bit samples
AUDIO_S8
Signed 8-bit samples
AUDIO_U16LSB
Unsigned 16-bit samples, in little-endian byte order
AUDIO_S16LSB
Signed 16-bit samples, in little-endian byte order
AUDIO_U16MSB
Unsigned 16-bit samples, in big-endian byte order
AUDIO_S16MSB
Signed 16-bit samples, in big-endian byte order
AUDIO_U16
same as AUDIO_U16LSB (for backwards compatability probably)
AUDIO_S16
same as AUDIO_S16LSB (for backwards compatability probably)
AUDIO_U16SYS
Unsigned 16-bit samples, in system byte order
AUDIO_S16SYS
Signed 16-bit samples, in system byte order

MIX_DEFAULT_FORMAT is the same as AUDIO_S16SYS.

Returns: 0 on success, -1 on errors

 
// start SDL with audio support
if(SDL_Init(SDL_INIT_AUDIO)==-1) {
    printf("SDL_Init: %s\n", SDL_GetError());
    exit(1);
}
// open 44.1KHz, signed 16bit, system byte order,
//      stereo audio, using 1024 byte chunks
if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
    printf("Mix_OpenAudio: %s\n", Mix_GetError());
    exit(2);
}

See Also:
4.1.3 Mix_CloseAudio, 4.1.6 Mix_QuerySpec, 4.3.1 Mix_AllocateChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1.3 Mix_CloseAudio

void Mix_CloseAudio()

Shutdown and cleanup the mixer API.
After calling this all audio is stopped, the device is closed, and the SDL_mixer functions should not be used. You may, of course, use Mix_OpenAudio to start the functionality again.
Note: This function doesn't do anything until you have called it the same number of times that you called Mix_OpenAudio. You may use Mix_QuerySpec to find out how many times Mix_CloseAudio needs to be called before the device is actually closed.

 
Mix_CloseAudio();
// you could SDL_Quit(); here...or not.

See Also:
4.1.2 Mix_OpenAudio, 4.1.6 Mix_QuerySpec


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1.4 Mix_SetError

void Mix_SetError(const char *fmt, ...)

This is the same as SDL_SetError, which sets the error string which may be fetched with Mix_GetError (or SDL_GetError). This functions acts like printf, except that it is limited to SDL_ERRBUFIZE(1024) chars in length. It only accepts the following format types: %s, %d, %f, %p. No variations are supported, like %.2f would not work. For any more specifics read the SDL docs.

 
int mymixfunc(int i) {
    Mix_SetError("mymixfunc is not implemented! %d was passed in.",i);
    return(-1);
}

See Also:
4.1.5 Mix_GetError


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1.5 Mix_GetError

char *Mix_GetError()

This is the same as SDL_GetError, which returns the last error set as a string which you may use to tell the user what happened when an error status has been returned from an SDL_mixer function call.

Returns: a char pointer (string) containing a humam readble version or the reason for the last error that occured.

 
printf("Oh My Goodness, an error : %s", Mix_GetError());

See Also:
4.1.4 Mix_SetError


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1.6 Mix_QuerySpec

int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)

frequency
A pointer to an int where the frequency actually used by the opened audio device will be stored.
format
A pointer to a Uint16 where the output format actually being used by the audio device will be stored.
channels
A pointer to an int where the number of audio channels will be stored.
2 will mean stereo, 1 will mean mono.

Get the actual audio format in use by the opened audio device. This may or may not match the parameters you passed to Mix_OpenAudio.

Returns: 0 on error. If the device was open the number of times it was opened will be returned. The values of the arguments variables are not set on an error.

 
// get and print the audio format in use
int numtimesopened, frequency, channels;
Uint16 format;
numtimesopened=Mix_QuerySpec(&frequency, &format, &channels);
if(!numtimesopened) {
    printf("Mix_QuerySpec: %s\n",Mix_GetError());
}
else {
    char *format_str="Unknown";
    switch(format) {
        case AUDIO_U8: format_str="U8"; break;
        case AUDIO_S8: format_str="S8"; break;
        case AUDIO_U16LSB: format_str="U16LSB"; break;
        case AUDIO_S16LSB: format_str="S16LSB"; break;
        case AUDIO_U16MSB: format_str="U16MSB"; break;
        case AUDIO_S16MSB: format_str="S16MSB"; break;
    }
    printf("opened=%d times  frequency=%dHz  format=%s  channels=%d",
            numtimesopened, frequency, format_str, channels);
}

See Also:
4.1.2 Mix_OpenAudio


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 Samples

These functions work with Mix_Chunk samples.

Loading
4.2.1 Mix_LoadWAV  From a file
4.2.2 Mix_LoadWAV_RW  Using RWops
4.2.3 Mix_QuickLoad_WAV  From memory, in output format already
4.2.4 Mix_QuickLoad_RAW  From memory, in output format already
Settings
4.2.5 Mix_VolumeChunk  Set mix volume
Freeing
4.2.6 Mix_FreeChunk  Free sample


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2.1 Mix_LoadWAV

Mix_Chunk *Mix_LoadWAV(char *file)

file
File name to load sample from.

Load file for use as a sample. This is actually Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1). This can load WAVE, AIFF, RIFF, OGG, and VOC files.
Note: You must call SDL_OpenAudio before this. It must know the output characteristics so it can convert the sample for playback, it does this conversion at load time.

Returns: a pointer to the sample as a Mix_Chunk. NULL is returned on errors.

 
// load sample.wav in to sample
Mix_Chunk *sample;
sample=Mix_LoadWAV("sample.wav");
if(!sample) {
    printf("Mix_LoadWAV: %s\n", Mix_GetError());
    // handle error
}

See Also:
4.2.2 Mix_LoadWAV_RW, 4.2.3 Mix_QuickLoad_WAV, 4.2.6 Mix_FreeChunk


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2.2 Mix_LoadWAV_RW

Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)

src
The source SDL_RWops as a pointer. The sample is loaded from this.
freesrc
A non-zero value mean is will automatically close/free the src for you.

Load src for use as a sample. This can load WAVE, AIFF, RIFF, OGG, and VOC formats. Using SDL_RWops is not covered here, but they enable you to load from almost any source. Note: You must call SDL_OpenAudio before this. It must know the output characteristics so it can convert the sample for playback, it does this conversion at load time.

Returns: a pointer to the sample as a Mix_Chunk. NULL is returned on errors.

 
// load sample.wav in to sample
Mix_Chunk *sample;
sample=Mix_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1);
if(!sample) {
    printf("Mix_LoadWAV_RW: %s\n", Mix_GetError());
    // handle error
}

See Also:
4.2.1 Mix_LoadWAV, 4.2.3 Mix_QuickLoad_WAV, 4.2.6 Mix_FreeChunk


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2.3 Mix_QuickLoad_WAV

Mix_Chunk *Mix_QuickLoad_WAV(Uint8 *mem)

mem
Memory buffer containing a WAVE file in output format.

Load mem as a WAVE/RIFF file into a new sample. The WAVE in mem must be already in the output format. It would be better to use Mix_LoadWAV_RW if you aren't sure.
Note: This function does very little checking. If the format mismatches the output format, or if the buffer is not a WAVE, it will not return an error. This is probably a dangerous function to use.

Returns: a pointer to the sample as a Mix_Chunk. NULL is returned on errors.

 
// quick-load a wave from memory
// Uint8 *wave; // I assume you have the wave loaded raw,
                // or compiled in the program...
Mix_Chunk *wave_chunk;
if(!(wave_chunk=Mix_QuickLoad_WAV(wave))) {
    printf("Mix_QuickLoad_WAV: %s\n", Mix_GetError());
    // handle error
}

See Also:
4.2.1 Mix_LoadWAV, 4.2.4 Mix_QuickLoad_RAW, 4.2.6 Mix_FreeChunk


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2.4 Mix_QuickLoad_RAW

Mix_Chunk *Mix_QuickLoad_RAW(Uint8 *mem)

mem
Memory buffer containing a WAVE file in output format.

Load mem as a raw sample. The data in mem must be already in the output format. If you aren't sure what you are doing, this is not a good function for you!
Note: This function does very little checking. If the format mismatches the output format it will not return an error. This is probably a dangerous function to use.

Returns: a pointer to the sample as a Mix_Chunk. NULL is returned on errors, such as when out of memory.

 
// quick-load a raw sample from memory
// Uint8 *raw; // I assume you have the raw data here,
                // or compiled in the program...
Mix_Chunk *raw_chunk;
if(!(raw_chunk=Mix_QuickLoad_RAW(raw))) {
    printf("Mix_QuickLoad_RAW: %s\n", Mix_GetError());
    // handle error
}

See Also:
4.2.1 Mix_LoadWAV, 4.2.3 Mix_QuickLoad_WAV, 4.2.6 Mix_FreeChunk


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2.5 Mix_VolumeChunk

int Mix_VolumeChunk(Mix_Chunk *chunk, int volume)

chunk
Pointer to the Mix_Chunk to set the volume in.
volume
The volume to use from 0 to MIX_MAX_VOLUME(128).
If greater than MIX_MAX_VOLUME,
then it will be set to MIX_MAX_VOLUME.
If less than 0 then chunk->volume will not be set.

Set chunk->volume to volume.
The volume setting will take effect when the chunk is used on a channel, being mixed into the output.

Returns: previous chunk->volume setting. if you passed a negative value for volume then this volume is still the current volume for the chunk.

 
// set the sample's volume to 1/2
// Mix_Chunk *sample;
int previous_volume;
previous_volume=Mix_VolumeChunk(sample, MIX_MAX_VOLUME/2);
printf("previous_volume: %d\n", previous_volume);

See Also:
5.1 Mix_Chunk


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2.6 Mix_FreeChunk

void Mix_FreeChunk(Mix_Chunk *chunk)

chunk
Pointer to the Mix_Chunk to free.

Free the memory used in chunk, and free chunk itself as well. Do not use chunk after this without loading a new sample to it. Note: It's a bad idea to free a chunk that is still being played...

 
// free the sample
// Mix_Chunk *sample;
Mix_FreeChunk(sample);
sample=NULL; // to be safe...

See Also:
4.2.1 Mix_LoadWAV, 4.2.2 Mix_LoadWAV_RW, 4.2.3 Mix_QuickLoad_WAV,


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 Channels

These functions work with sound effect mixer channels. Music is not affected by these functions.

Setup
4.3.1 Mix_AllocateChannels  Set the number of channels to mix
4.3.2 Mix_Volume  Set the mix volume of a channel
Playing
4.3.3 Mix_PlayChannel  Play loop
4.3.4 Mix_PlayChannelTimed  Play loop and limit by time
4.3.5 Mix_FadeInChannel  Play loop with fade in
4.3.6 Mix_FadeInChannelTimed  Play loop with fade in and limit by time
Pausing
4.3.7 Mix_Pause  Pause a channel
4.3.8 Mix_Resume  Resume a paused channel
Stopping
4.3.9 Mix_HaltChannel  Stop playing on a channel
4.3.10 Mix_ExpireChannel  Change the timed stoppage of a channel
4.3.11 Mix_FadeOutChannel  Stop playing channel after timed fade out
4.3.12 Mix_ChannelFinished  Set callback for when channel finishes playing
Info
4.3.13 Mix_Playing  Get the active playing status of a channel
4.3.14 Mix_Paused  Get the pause status of a channel
4.3.15 Mix_FadingChannel  Get the fade status of a channel
4.3.16 Mix_GetChunk  Get the sample playing on a channel


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.1 Mix_AllocateChannels

int Mix_AllocateChannels(int numchans)

numchans
Number of channels to allocate for mixing.
A negative number will not do anything, it will tell you how many channels are currently allocated.

Set the number of channels being mixed. This can be called multiple times, even with sounds playing. If numchans is less than the current number of channels, then the higher channels will be stopped, freed, and therefore not mixed any longer. It's probably not a good idea to change the size 1000 times a second though.
If any channels are deallocated, any callback set by Mix_ChannelFinished will be called when each channel is halted to be freed. Note: passing in zero WILL free all mixing channels, however music will still play.

Returns: The number of channels allocated. Never fails...but a high number of channels can segfault if you run out of memory. We're talking REALLY high!

 
// allocate 16 mixing channels
Mix_AllocateChannels(16);

See Also:
4.1.2 Mix_OpenAudio


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.2 Mix_Volume

int Mix_Volume(int channel, int volume)

channel
Channel to set mix volume for.
-1 will set the volume for all allocated channels.
volume
The volume to use from 0 to MIX_MAX_VOLUME(128).
If greater than MIX_MAX_VOLUME,
then it will be set to MIX_MAX_VOLUME.
If less than 0 then the volume will not be set.

Set the volume for any allocated channel. If channel is -1 then all channels at are set at once. The volume is applied during the final mix, along with the sample volume. So setting this volume to 64 will halve the output of all samples played on the specified channel. All channels default to a volume of 128, which is the max. Newly allocated channels will have the max volume set, so setting all channels volumes does not affect subsequent channel allocations.

Returns: current volume of the channel. If channel is -1, the average volume is returned.

 
// set channel 1 to half volume
Mix_Volume(1,MIX_MAX_VOLUME/2);

// print the average volume
printf("Average volume is %d\n",Mix_Volume(-1,-1));

See Also:
4.2.5 Mix_VolumeChunk, 4.5.7 Mix_VolumeMusic


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.3 Mix_PlayChannel

int Mix_PlayChannel(int channel, Mix_Chunk *chunk, int loops)

channel
Channel to play on, or -1 for the first free unreserved channel.
chunk
Sample to play.
loops
Number of loops, -1 is infinite loops.
Passing one here plays the sample twice (1 loop).

Play chunk on channel, or if channel is -1, pick the first free unreserved channel. The sample will play for loops+1 number of times, unless stopped by halt, or fade out, or setting a new expiration time of less time than it would have originally taken to play the loops, or closing the mixer.
Note: this just calls Mix_PlayChannelTimed() with ticks set to -1.

Returns: the channel the sample is played on. On any errors, -1 is returned.

 
// play sample on first free unreserved channel
// play it exactly once through
// Mix_Chunk *sample; //previously loaded
if(Mix_PlayChannel(-1, sample, 0)==-1) {
    printf("Mix_PlayChannel: %s\n",Mix_GetError());
    // may be critical error, or maybe just no channels were free.
    // you could allocated another channel in that case...
}

See Also:
4.3.4 Mix_PlayChannelTimed, 4.3.5 Mix_FadeInChannel, 4.3.9 Mix_HaltChannel, 4.3.10 Mix_ExpireChannel, 4.4.1 Mix_ReserveChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.4 Mix_PlayChannelTimed

int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks)

channel
Channel to play on, or -1 for the first free unreserved channel.
chunk
Sample to play.
loops
Number of loops, -1 is infinite loops.
Passing one here plays the sample twice (1 loop).
ticks
Millisecond limit to play sample, at most.
If not enough loops or the sample chunk is not long enough, then the sample may stop before this timeout occurs.
-1 means play forever.

If the sample is long enough and has enough loops then the sample will stop after ticks milliseconds. Otherwise this function is the same as 4.3.3 Mix_PlayChannel.

Returns: the channel the sample is played on. On any errors, -1 is returned.

 
// play sample on first free unreserved channel
// play it for half a second
// Mix_Chunk *sample; //previously loaded
if(Mix_PlayChannelTimed(-1, sample, -1 , 500)==-1) {
    printf("Mix_PlayChannel: %s\n",Mix_GetError());
    // may be critical error, or maybe just no channels were free.
    // you could allocated another channel in that case...
}

See Also:
4.3.3 Mix_PlayChannel, 4.3.6 Mix_FadeInChannelTimed, 4.3.11 Mix_FadeOutChannel, 4.4.1 Mix_ReserveChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.5 Mix_FadeInChannel

int Mix_FadeInChannel(int channel, Mix_Chunk *chunk, int loops, int ms)

channel
Channel to play on, or -1 for the first free unreserved channel.
chunk
Sample to play.
loops
Number of loops, -1 is infinite loops.
Passing one here plays the sample twice (1 loop).
ms
Milliseconds of time that the fade-in effect should take to go from silence to full volume.

Play chunk on channel, or if channel is -1, pick the first free unreserved channel.
The channel volume starts at 0 and fades up to full volume over ms milliseconds of time. The sample may end before the fade-in is complete if it is too short or doesn't have enough loops. The sample will play for loops+1 number of times, unless stopped by halt, or fade out, or setting a new expiration time of less time than it would have originally taken to play the loops, or closing the mixer.
Note: this just calls Mix_FadeInChannelTimed() with ticks set to -1.

Returns: the channel the sample is played on. On any errors, -1 is returned.

 
// play sample on first free unreserved channel
// play it exactly 3 times through
// fade in over one second
// Mix_Chunk *sample; //previously loaded
if(Mix_FadeInChannel(-1, sample, 2, 1000)==-1) {
    printf("Mix_FadeInChannel: %s\n",Mix_GetError());
    // may be critical error, or maybe just no channels were free.
    // you could allocated another channel in that case...
}

See Also:
4.3.3 Mix_PlayChannel, 4.3.6 Mix_FadeInChannelTimed, 4.3.15 Mix_FadingChannel, 4.3.11 Mix_FadeOutChannel, 4.4.1 Mix_ReserveChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.6 Mix_FadeInChannelTimed

 
int Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk,
                           int loops, int ms, int ticks)

channel
Channel to play on, or -1 for the first free unreserved channel.
chunk
Sample to play.
loops
Number of loops, -1 is infinite loops.
Passing one here plays the sample twice (1 loop).
ms
Milliseconds of time that the fade-in effect should take to go from silence to full volume.
ticks
Millisecond limit to play sample, at most.
If not enough loops or the sample chunk is not long enough, then the sample may stop before this timeout occurs.
-1 means play forever.

If the sample is long enough and has enough loops then the sample will stop after ticks milliseconds. Otherwise this function is the same as 4.3.5 Mix_FadeInChannel.

Returns: the channel the sample is played on. On any errors, -1 is returned.

 
// play sample on first free unreserved channel
// play it for half a second
// Mix_Chunk *sample; //previously loaded
if(Mix_PlayChannelTimed(-1, sample, -1 , 500)==-1) {
    printf("Mix_PlayChannel: %s\n",Mix_GetError());
    // may be critical error, or maybe just no channels were free.
    // you could allocated another channel in that case...
}

See Also:
4.3.4 Mix_PlayChannelTimed, 4.3.5 Mix_FadeInChannel, 4.3.15 Mix_FadingChannel, 4.3.9 Mix_HaltChannel, 4.3.10 Mix_ExpireChannel, 4.4.1 Mix_ReserveChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.7 Mix_Pause

void Mix_Pause(int channel)

channel
Channel to pause on, or -1 for all channels.

Pause channel, or all playing channels if -1 is passed in. You may still halt a paused channel.
Note: Only channels which are actively playing will be paused.

 
// pause all sample playback
Mix_Pause(-1);

See Also:
4.3.8 Mix_Resume, 4.3.14 Mix_Paused, 4.3.9 Mix_HaltChannel


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.8 Mix_Resume

void Mix_Resume(int channel)

channel
Channel to resume playing, or -1 for all channels.

Unpause channel, or all playing and paused channels if -1 is passed in.

 
// resume playback on all previously active channels
Mix_Resume(-1);

See Also:
4.3.7 Mix_Pause, 4.3.14 Mix_Paused


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.9 Mix_HaltChannel

int Mix_HaltChannel(int channel)

channel
Channel to stop playing, or -1 for all channels.

Halt channel playback, or all channels if -1 is passed in.
Any callback set by Mix_ChannelFinished will be called.

Returns: always returns zero. (kinda silly)

 
// halt playback on all channels
Mix_HaltChannel(-1);

See Also:
4.3.10 Mix_ExpireChannel, 4.3.11 Mix_FadeOutChannel, 4.3.12 Mix_ChannelFinished


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.10 Mix_ExpireChannel

int Mix_ExpireChannel(int channel, int ticks)

channel
Channel to stop playing, or -1 for all channels.
ticks
Millisecons until channel(s) halt playback.

Halt channel playback, or all channels if -1 is passed in, after ticks milliseconds. Any callback set by Mix_ChannelFinished will be called when the channel expires.

Returns: Number of channels set to expire. Whether or not they are active.

 
// halt playback on all channels in 2 seconds
Mix_ExpireChannel(-1, 2000);

See Also:
4.3.9 Mix_HaltChannel, 4.3.11 Mix_FadeOutChannel, 4.3.12 Mix_ChannelFinished


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.11 Mix_FadeOutChannel

int Mix_FadeOutChannel(int channel, int ms)

channel
Channel to fade out, or -1 to fade all channels out.
ms
Milliseconds of time that the fade-out effect should take to go to silence, starting now.

Gradually fade out which channel over ms milliseconds starting from now. The channel will be halted after the fade out is completed. Only channels that are playing are set to fade out, including paused channels. Any callback set by Mix_ChannelFinished will be called when the channel finishes fading out.

Returns: The number of channels set to fade out.

 
// fade out all channels to finish 3 seconds from now
printf("starting fade out of %d channels\n", Mix_FadeOutChannel(-1, 3000));

See Also:
4.3.5 Mix_FadeInChannel, 4.3.6 Mix_FadeInChannelTimed, 4.3.15 Mix_FadingChannel, 4.3.12 Mix_ChannelFinished


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.12 Mix_ChannelFinished

void Mix_ChannelFinished(void (*channel_finished)(int channel))

channel_finished
Function to call when any channel finishes playback.

When channel playback is halted, then the specified channel_finished function is called. The channel parameter will contain the channel number that has finished.
NOTE: NEVER call SDL_Mixer functions, nor SDL_LockAudio, from a callback function.

 
// a simple channel_finished function
void channelDone(int channel) {
    printf("channel %d finished playback.\n",channel);
}

 
// make a channelDone function
void channelDone(int channel)
{
    printf("channel %d finished playing.\n", channel);
}
...
// set the callback for when a channel stops playing
Mix_ChannelFinished(channelDone);

See Also:
4.3.9 Mix_HaltChannel, 4.3.10 Mix_ExpireChannel


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.13 Mix_Playing

int Mix_Playing(int channel)

channel
Channel to test whether it is playing or not.
-1 will tell you how many channels are playing.

Tells you if channel is playing, or not.
Note: Does not check if the channel has been paused.

Returns: Zero if the channel is not playing. Otherwise if you passed in -1, the number of channels playing is returned. If you passed in a specific channel, then 1 is returned if it is playing.

 
// check how many channels are playing samples
printf("%d channels are playing\n", Mix_Playing(-1));

See Also:
4.3.14 Mix_Paused, 5.4 Mix_Fading, 4.3.3 Mix_PlayChannel, 4.3.7 Mix_Pause,


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.14 Mix_Paused

int Mix_Paused(int channel)

channel
Channel to test whether it is paused or not.
-1 will tell you how many channels are paused.

Tells you if channel is paused, or not.
Note: Does not check if the channel has been halted after it was paused, which may seem a little weird.

Returns: Zero if the channel is not paused. Otherwise if you passed in -1, the number of paused channels is returned. If you passed in a specific channel, then 1 is returned if it is paused.

 
// check the pause status on all channels
printf("%d channels are paused\n", Mix_Paused(-1));

See Also:
4.3.13 Mix_Playing, 4.3.7 Mix_Pause, 4.3.8 Mix_Resume


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.15 Mix_FadingChannel

Mix_Fading Mix_FadingChannel(int which)

which
Channel to get the fade activity status from.
-1 is not valid, and will probably crash the program.

Tells you if which channel is fading in, out, or not. Does not tell you if the channel is playing anything, or paused, so you'd need to test that separately.

Returns: the fading status. Never returns an error.

 
// check the fade status on channel 0
switch(Mix_FadingChannel(0)) {
    case MIX_NO_FADING:
        printf("Not fading.\n");
        break;
    case MIX_FADING_OUT:
        printf("Fading out.\n");
        break;
    case MIX_FADING_IN:
        printf("Fading in.\n");
        break;
}

See Also:
5.4 Mix_Fading, 4.3.13 Mix_Playing, 4.3.14 Mix_Paused, 4.3.5 Mix_FadeInChannel, 4.3.6 Mix_FadeInChannelTimed, 4.3.11 Mix_FadeOutChannel


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3.16 Mix_GetChunk

Mix_Chunk *Mix_GetChunk(int channel)

channel
Channel to get the current Mix_Chunk playing.
-1 is not valid, but will not crash the program.

Get the most recent sample chunk pointer played on channel. This pointer may be currently playing, or just the last used.
Note: The actual chunk may have been freed, so this pointer may not be valid anymore.

Returns: Pointer to the Mix_Chunk. NULL is returned if the channel is not allocated, or if the channel has not played any samples yet.

 
// get the last chunk used by channel 0
printf("Mix_Chunk* last in use on channel 0 was: %08p\n", Mix_GetChunk(0));

See Also:
5.1 Mix_Chunk, 4.3.13 Mix_Playing


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 Groups

These functions work with groupings of mixer channels.

The default group tag number of -1, which refers to ALL channels.

Setup
4.4.1 Mix_ReserveChannels  Prevent channels from being used in default group
TODO
4.4.2 Mix_GroupChannel  Add/remove channel to/from group
4.4.3 Mix_GroupChannels  Add/remove segment of channels to/from group
Info
4.4.4 Mix_GroupCount  Get number of channels in group
4.4.5 Mix_GroupAvailable  Get first inactive channel in group
4.4.6 Mix_GroupOldest  Get oldest busy channel in group
4.4.7 Mix_GroupNewer  Get youngest busy channel in group
Stopping
4.4.8 Mix_FadeOutGroup  Fade out a group over time
4.4.9 Mix_HaltGroup  Stop a group


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.1 Mix_ReserveChannels

int Mix_ReserveChannels(int num)

num
Number of channels to reserve from default mixing.
Zero removes all reservations.

Reserve num channels from being used when playing samples when passing in -1 as a channel number to playback functions. The channels are reserved starting from channel 0 to num-1. Passing in zero will unreserve all channels. Normally SDL_mixer starts without any channels reserved.

The following functions are affected by this setting:
4.3.3 Mix_PlayChannel
4.3.4 Mix_PlayChannelTimed
4.3.5 Mix_FadeInChannel
4.3.6 Mix_FadeInChannelTimed

Returns: The number of channels reserved. Never fails, but may return less channels than you ask for, depending on the number of channels previously allocated.

 
// reserve the first 8 mixing channels
int reserved_count;
reserved_count=Mix_ReserveChannels(8);
if(reserved_count!=8) {
    printf("reserved %d channels from default mixing.\n",reserved_count);
    printf("8 channels were not reserved!\n");
    // this might be a critical error...
}

See Also:
4.3.1 Mix_AllocateChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.2 Mix_GroupChannel

int Mix_GroupChannel(int which, int tag)

which
Channel number of channels to assign tag to.
tag
A group number Any positive numbers (including zero).
-1 is the default group. Use -1 to remove a group tag essentially.

Add which channel to group tag, or reset it's group to the default group tag (-1).

Returns: True(1) on success. False(0) is returned when the channel specified is invalid.

 
// add channel 0 to group 1
if(!Mix_GroupChannel(0,1)) {
    // bad channel, apparently channel 1 isn't allocated
}

See Also:
4.4.3 Mix_GroupChannels, 4.3.1 Mix_AllocateChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.3 Mix_GroupChannels

int Mix_GroupChannels(int from, int to, int tag)

from
First Channel number of channels to assign tag to. Must be less or equal to to.
to
Last Channel number of channels to assign tag to. Must be greater or equal to from.
tag
A group number. Any positive numbers (including zero).
-1 is the default group. Use -1 to remove a group tag essentially.

Add channels starting at from up through to to group tag, or reset it's group to the default group tag (-1).

Returns: The number of tagged channels on success. If that number is less than to-from+1 then some channels were no tagged because they didn't exist.

 
// add channels 0 through 7 to group 1
if(Mix_GroupChannels(0,7,1)!=8) {
    // some bad channels, apparently some channels aren't allocated
}

See Also:
4.4.2 Mix_GroupChannel, 4.3.1 Mix_AllocateChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.4 Mix_GroupCount

int Mix_GroupCount(int tag)

tag
A group number Any positive numbers (including zero).
-1 will count ALL channels.

Count the number of channels in group tag.

Returns: The number of channels found in the group. This function never fails.

 
// count the number of channels in group 1
printf("There are %d channels in group 1\n", Mix_GroupCount(1));

See Also:
4.4.2 Mix_GroupChannel, 4.4.3 Mix_GroupChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.5 Mix_GroupAvailable

int Mix_GroupAvailable(int tag)

tag
A group number Any positive numbers (including zero).
-1 will search ALL channels.

Find the first available (not playing) channel in group tag.

Returns: The channel found on success. -1 is returned when no channels in the group are available.

 
// find the first available channel in group 1
int channel;
channel=Mix_GroupAvailable(1);
if (channel==-1) {
    // no channel available...
    // perhaps search for oldest or newest channel in use...
}

See Also:
4.4.6 Mix_GroupOldest, 4.4.7 Mix_GroupNewer, 4.4.2 Mix_GroupChannel, 4.4.3 Mix_GroupChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.6 Mix_GroupOldest

int Mix_GroupOldest(int tag)

tag
A group number Any positive numbers (including zero).
-1 will search ALL channels.

Find the oldest actively playing channel in group tag.

Returns: The channel found on success. -1 is returned when no channels in the group are playing or the group is empty.

 
// find the oldest playing channel in group 1
int channel;
channel=Mix_GroupOldest(1);
if (channel==-1) {
    // no channel playing or allocated...
    // perhaps just search for an available channel...
}

See Also:
4.4.7 Mix_GroupNewer, 4.4.5 Mix_GroupAvailable, 4.4.2 Mix_GroupChannel, 4.4.3 Mix_GroupChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.7 Mix_GroupNewer

int Mix_GroupNewer(int tag)

tag
A group number Any positive numbers (including zero).
-1 will search ALL channels.

Find the newest, most recently started, actively playing channel in group tag.

Returns: The channel found on success. -1 is returned when no channels in the group are playing or the group is empty.

 
// find the newest playing channel in group 1
int channel;
channel=Mix_GroupNewer(1);
if (channel==-1) {
    // no channel playing or allocated...
    // perhaps just search for an available channel...
}

See Also:
4.4.6 Mix_GroupOldest, 4.4.5 Mix_GroupAvailable, 4.4.2 Mix_GroupChannel, 4.4.3 Mix_GroupChannels


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.8 Mix_FadeOutGroup

int Mix_FadeOutGroup(int tag, int ms)

tag
Group to fade out.
NOTE: -1 will NOT fade all channels out. Use Mix_FadeOutChannel(-1) for that instead.
ms
Milliseconds of time that the fade-out effect should take to go to silence, starting now.

Gradually fade out channels in group tag over ms milliseconds starting from now. The channels will be halted after the fade out is completed. Only channels that are playing are set to fade out, including paused channels. Any callback set by Mix_ChannelFinished will be called when each channel finishes fading out.

Returns: The number of channels set to fade out.

 
// fade out all channels in group 1 to finish 3 seconds from now
printf("starting fade out of %d channels\n", Mix_FadeOutGroup(1, 3000));

See Also:
4.4.9 Mix_HaltGroup, 4.3.11 Mix_FadeOutChannel, 4.3.15 Mix_FadingChannel, 4.3.12 Mix_ChannelFinished


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4.9 Mix_HaltGroup

int Mix_HaltGroup(int tag)

tag
Group to fade out.
NOTE: -1 will NOT halt all channels. Use Mix_HaltChannel(-1) for that instead.

Halt playback on all channels in group tag.
Any callback set by Mix_ChannelFinished will be called once for each channel that stops.

Returns: always returns zero. (more silly than Mix_HaltChannel)

 
// halt playback on all channels in group 1
Mix_HaltGroup(1);

See Also:
4.4.8 Mix_FadeOutGroup, 4.3.9 Mix_HaltChannel, 4.3.12 Mix_ChannelFinished


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 Music

These functions work with music. Music is not played on a normal mixer channel. Music is therefore manipulated separately, except in post-processing hooks.

Load
4.5.1 Mix_LoadMUS  Load a music file into a Mix_Music
Free
4.5.2 Mix_FreeMusic  Free a Mix_Music
Playing
4.5.3 Mix_PlayMusic  Play music, with looping
4.5.4 Mix_FadeInMusic  Play music, with looping, and fade in
4.5.5 Mix_FadeInMusicPos  Play music from a start point, with looping, and fade in
4.5.6 Mix_HookMusic  Hook for a custom music player
Settings
4.5.7 Mix_VolumeMusic  Set music volume
4.5.8 Mix_PauseMusic  Pause music
4.5.9 Mix_ResumeMusic  Resume paused music
4.5.10 Mix_RewindMusic  Rewind music to beginning
4.5.11 Mix_SetMusicPosition  Set position of playback in stream
4.5.12 Mix_SetMusicCMD  Use external program for music playback
Stopping
4.5.13 Mix_HaltMusic  Stop music playback
4.5.14 Mix_FadeOutMusic  Stop music, with fade out
4.5.15 Mix_HookMusicFinished  Set a callback for when music stops
Info
4.5.16 Mix_GetMusicType  Get the music encoding type
4.5.17 Mix_PlayingMusic  Test whether music is playing
4.5.18 Mix_PausedMusic  Test whether music is paused
4.5.19 Mix_FadingMusic  Get status of current music fade activity
4.5.20 Mix_GetMusicHookData  Retrieve the Mix_HookMusic arg


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5.1 Mix_LoadMUS

Mix_Music *Mix_LoadMUS(const char *file)

file
Name of music file to use.

Load music file to use. This can load WAVE, MOD, MIDI, OGG, MP3, and any file that you use a command to play with.
If you are using an external command to play the music, you must call Mix_SetMusicCMD before this, otherwise the internal players will be used. Alternatively, if you have set an external command up and don't want to use it, you must call Mix_SetMusicCMD(NULL) to use the built-in players again.

Returns: A pointer to a Mix_Music. NULL is returned on errors.

 
// load the MP3 file "music.mp3" to play as music
Mix_Music *music;
music=Mix_LoadMUS("music.mp3");
if(!music) {
    printf("Mix_LoadMUS(\"music.mp3\"): %s\n", Mix_GetError());
    // this might be a critical error...
}

See Also:
5.2 Mix_Music, 4.5.12 Mix_SetMusicCMD, 4.5.3 Mix_PlayMusic, 4.5.4 Mix_FadeInMusic, 4.5.5 Mix_FadeInMusicPos


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5.2 Mix_FreeMusic

void Mix_FreeMusic(Mix_Music *music)

music
Pointer to Mix_Music to free.

Free the loaded music. If music is playing it will be halted. If music is fading out, then this function will wait (blocking) until the fade out is complete.

 
// free music
Mix_Music *music;
Mix_FreeMusic(music);
music=NULL; // so we know we freed it...

See Also:
4.5.1 Mix_LoadMUS


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5.3 Mix_PlayMusic

int Mix_PlayMusic(Mix_Music *music<