Simple SDL2 Audio
- 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)
src/audio.hin your project
src/test.cshows all the functionality possible:
Basic use case:
// Initialize SDL2 Audio only SDL_Init(SDL_INIT_AUDIO); // Initialize Simple-SDL2-Audio initAudio(); // Play music and a sound playMusic("music/highlands.wav", SDL_MIX_MAXVOLUME); playSound("sounds/door1.wav", SDL_MIX_MAXVOLUME / 2); // Let play for 1 second SDL_Delay(1000); // End Simple-SDL2-Audio endAudio(); // End SDL2 SDL_Quit();
// Initialize Simple-SDL2-Audio on default audio device void initAudio(void); // Play many Sounds or single Musics void playSound(const char * filename, int volume); void playMusic(const char * filename, int volume); // Clean up Simple-SDL2-Audio void endAudio(void); // Pause or Unpause running audio void pauseAudio(void); void unpauseAudio(void); // Advanced functions used for caching WAV files in memory, create, play many times, free Audio * createAudio(const char * filename, uint8_t loop, int volume); void playSoundFromMemory(Audio * audio, int volume); void playMusicFromMemory(Audio * audio, int volume); void freeAudio(Audio * audio);
Difference between Music vs Sound
Only one music can play at a time, and it loops (to close music you can just run
endAudio(), or use
- 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
src/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
src/audio.c, see the top of
src/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 the
createAudio(); playSoundFromMemory(); freeAudio();functions (recommend storing the Audio* object in a dictionary / hashmap)
Features to add
- Pause / unpause only music, only sound or
- Current implementation uses callback method, however in SDL 2.0.4 there exists
Windows 7 Compatability
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