David Reid dd0554be0e Don't omit backend-specific attributes in structures.
The rationale behind this commit is to ensure the size of each data
structure remains consistent regardless of which backends are enabled
and disabled. This is important for mini_al because it publicly exposes
every struct.
2016-12-29 21:57:54 +10:00
2016-12-29 20:43:31 +10:00
2016-11-22 11:20:20 +10:00
2016-11-14 20:03:59 +10:00

mini_al

mini_al is a simple library for playing and recording audio. It's focused on simplicity and has a very small number of APIs. This is not a full-featured audio library, nor will it ever be. It is intended to be used as a quick and easy way to connect to an audio device and deliver and capture audio data from speakers and microphones.

C/C++, single file, public domain.

Features

  • Public domain
  • Single file
  • A very simple API

Simple Playback Example

#define MAL_IMPLEMENTATION
#include "../mini_al.h"

#define DR_WAV_IMPLEMENTATION
#include "dr_wav.h"

#include <stdio.h>

// This is the function that's used for sending more data to the device for playback.
mal_uint32 on_send_frames_to_device(mal_device* pDevice, mal_uint32 frameCount, void* pSamples)
{
    drwav* pWav = (drwav*)pDevice->pUserData;
    if (pWav == NULL) {
        return 0;
    }
    
    return (mal_uint32)drwav_read_f32(pWav, frameCount * pDevice->channels, (float*)pSamples) / pDevice->channels;
}

int main(int argc, char** argv)
{
    if (argc < 2) {
        printf("No input file.");
        return -1;
    }

    drwav wav;
    if (!drwav_init_file(&wav, argv[1])) {
        printf("Not a valid WAV file.");
        return -2;
    }

    mal_context context;
    if (mal_context_init(NULL, 0, &context) != MAL_SUCCESS) {
        printf("Failed to initialize context.");
        return -3;
    }
    
    // In this example we use the default playback device with a default buffer size and period count.
	mal_device_config config;
	config.format = mal_format_f32;
	config.channels = wav.channels;
	config.sampleRate = wav.sampleRate;
	config.bufferSizeInFrames = 0;	// Use default.
	config.periods = 0;				// Use default.
	config.onRecvCallback = NULL;	// Not used for playback.
	config.onSendCallback = on_send_frames_to_device;
	config.onStopCallback = NULL;
    config.onLogCallback  = NULL;
	
    mal_device device;
    if (mal_device_init(&context, mal_device_type_playback, NULL, &config, &wav, &device) != MAL_SUCCESS) {
        printf("Failed to open playback device.");
        mal_context_uninit(&context);
        drwav_uninit(&wav);
        return -4;
    }
    mal_device_start(&device);
    
    printf("Press Enter to quit...");
    getchar();
    
    mal_device_uninit(&device);
    mal_context_uninit(&context);
    drwav_uninit(&wav);
    
    return 0;
}
Languages
C 90.4%
C++ 8.2%
CMake 0.8%
HTML 0.5%