- A simple native SDL2 Audio library that has 2 files, and an easy to use interface.
- This library works without SDL2 Mixer, and plays a single music file at a time, and unlimited sounds (Mixes audio natively without Mixer)
- Include
src/audio.candsrc/audio.hin your project
src/test.cshows all the functionality possible:
Basic use case:
// Initialize SDL2 Audio onlySDL_Init(SDL_INIT_AUDIO);
// Initialize Simple-SDL2-AudioinitAudio();
// Play music and a soundplayMusic("music/highlands.wav", SDL_MIX_MAXVOLUME);
playSound("sounds/door1.wav", SDL_MIX_MAXVOLUME / 2);
// Let play for 1 secondSDL_Delay(1000);
// End Simple-SDL2-AudioendAudio();
// End SDL2SDL_Quit();// Initialize Simple-SDL2-Audio on default audio devicevoidinitAudio(void);
// Play many Sounds or single MusicsvoidplaySound(constchar*filename, intvolume);
voidplayMusic(constchar*filename, intvolume);
// Clean up Simple-SDL2-AudiovoidendAudio(void);
// Pause or Unpause running audiovoidpauseAudio(void);
voidunpauseAudio(void);
// Advanced functions used for caching WAV files in memory, create, play many times, freeAudio*createAudio(constchar*filename, uint8_tloop, intvolume);
voidplaySoundFromMemory(Audio*audio, intvolume);
voidplayMusicFromMemory(Audio*audio, intvolume);
voidfreeAudio(Audio*audio);Only one music can play at a time, and it loops (to close music you can just run
endAudio(), or usepauseAudio()andunpauseAudio()).- If you add another music when one is playing, the first one fades out before ending, and then playing the second.
- If you play more than 2 music at once, the first fades as expected, only the last music queued before the first fade out is used
Any number of sounds can be played at once, but obviously the more, can become distorted
- Can change
AUDIO_MAX_SOUNDSinsrc/audio.cto limit how many sounds can be played at once to reduce distortion from too many playing
- Can change
- This implementation uses SDL_MixAudioFormat for mixing for simplicity. It's noted "Do not use this function for mixing together more than two streams of sample data". While only playing 1 music removes a lot of these issues, if you need something more powerful you should write your own mixing function.
- This implementation ONLY plays WAV files, and they should all be the same format, but can have differing formats if you play around with
SDL_AUDIO_ALLOW_CHANGESinsrc/audio.c, see the top ofsrc/audio.cto set the format, stereo vs mono etc... No conversion - Caching: Using the standard
playMusic()functions makes a disk read each call. To only make one disk read, cache, and play the audio from memory, use thecreateAudio(); playSoundFromMemory(); freeAudio();functions (recommend storing the Audio* object in a dictionary / hashmap)
- Pause / unpause only music, only sound or
both - Current implementation uses callback method, however in SDL 2.0.4 there exists
SDL_QueueAudio()(no callback)
SDL2.0.6 updated how audio was handled, for Windows 7 using a later release of SDL2, you need to set #define SDL_AUDIO_ALLOW_CHANGES SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE which is a flag near the top of the file.
- I made this project as a more modern version of https://gist.github.com/armornick/3447121
- https://davidgow.net/handmadepenguin/ch7.html
- http://rerwarwar.weebly.com/sdl2-audio.html