I've called it miniaudio, and you can find it on GitHub: https://github.com/dr-soft/miniaudio. From the readme:
Features
- A simple build system.
- It should Just Work out of the box, without the need to download and install any dependencies.
- A simple API.
- Supports playback, capture and full-duplex.
- Data conversion.
- Sample format conversion, with optional dithering.
- Sample rate conversion.
- Channel mapping and channel conversion (stereo to 5.1, etc.)
- MP3, Vorbis, FLAC and WAV decoding.
- This depends on external single file libraries which can be found in the "extras" folder.
Supported Platforms
- Windows (XP+), UWP
- macOS, iOS
- Linux
- BSD
- Android
- Raspberry Pi
- Emscripten / HTML5
Backends
- WASAPI
- DirectSound
- WinMM
- Core Audio (Apple)
- ALSA
- PulseAudio
- JACK
- sndio (OpenBSD)
- audio(4) (NetBSD and OpenBSD)
- OSS (FreeBSD)
- AAudio (Android 8+)
- OpenSL|ES (Android only)
- WebAudio (Emscripten)
- Null (Silence)
Building
Do the following in one source file:
1 2 | #define MINIAUDIO_IMPLEMENTATION #include "miniaudio.h" |
Then just compile. There's no need to install any dependencies. On Windows and macOS there's no need to link to anything. On Linux and BSD, just link to -lpthread, -lm and -ldl.
Simple Playback Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #define DR_FLAC_IMPLEMENTATION #include "../extras/dr_flac.h" // Enables FLAC decoding. #define DR_MP3_IMPLEMENTATION #include "../extras/dr_mp3.h" // Enables MP3 decoding. #define DR_WAV_IMPLEMENTATION #include "../extras/dr_wav.h" // Enables WAV decoding. #define MINIAUDIO_IMPLEMENTATION #include "../miniaudio.h" #include <stdio.h> void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) { ma_decoder* pDecoder = (ma_decoder*)pDevice->pUserData; if (pDecoder == NULL) { return; } ma_decoder_read_pcm_frames(pDecoder, pOutput, frameCount); (void)pInput; } int main(int argc, char** argv) { if (argc < 2) { printf("No input file.\n"); return -1; } ma_decoder decoder; ma_result result = ma_decoder_init_file(argv[1], NULL, &decoder); if (result != MA_SUCCESS) { return -2; } ma_device_config config = ma_device_config_init(ma_device_type_playback); config.playback.format = decoder.outputFormat; config.playback.channels = decoder.outputChannels; config.sampleRate = decoder.outputSampleRate; config.dataCallback = data_callback; config.pUserData = &decoder; ma_device device; if (ma_device_init(NULL, &config, &device) != MA_SUCCESS) { printf("Failed to open playback device.\n"); ma_decoder_uninit(&decoder); return -3; } if (ma_device_start(&device) != MA_SUCCESS) { printf("Failed to start playback device.\n"); ma_device_uninit(&device); ma_decoder_uninit(&decoder); return -4; } printf("Press Enter to quit..."); getchar(); ma_device_uninit(&device); ma_decoder_uninit(&decoder); return 0; } |