doompanning/linuxdoom-1.10/ib_sound/miniaudio.c

76 lines
1.9 KiB
C
Raw Normal View History

#include "../ib_sound.h"
#include <stddef.h>
#define MINIAUDIO_IMPLEMENTATION
#define MA_NO_DECODING
#define MA_NO_ENCODING
#define MA_NO_GENERATION
#include "miniaudio.h"
// The function that actually produces the output audio
static void (*audio_callback)(short* output_buffer, size_t frames_to_do, void *user_data);
// miniaudio context
static ma_context context;
// miniaudio context
static ma_mutex mutex;
// The actual output device.
static ma_device audio_device;
static void Callback(ma_device* device, void* output_buffer, const void* input_buffer, ma_uint32 frames_to_do)
{
(void)input_buffer;
ma_mutex_lock(&mutex);
audio_callback((short*)output_buffer, (size_t)frames_to_do, device->pUserData);
ma_mutex_unlock(&mutex);
}
int IB_StartupSound(void (*initial_callback)(unsigned int output_sample_rate, void *user_data), void (*_audio_callback)(short* output_buffer, size_t frames_to_do, void *user_data), void *user_data)
{
audio_callback = _audio_callback;
ma_context_init(NULL, 0, NULL, &context);
ma_mutex_init(&mutex);
ma_device_config config = ma_device_config_init(ma_device_type_playback);
config.playback.pDeviceID = NULL;
config.playback.format = ma_format_s16;
config.playback.channels = 2;
config.sampleRate = 0; // Let miniaudio decide what sample rate to use
config.dataCallback = Callback;
config.pUserData = user_data;
config.noPreZeroedOutputBuffer = ma_true;
ma_device_init(&context, &config, &audio_device);
initial_callback(audio_device.sampleRate, user_data);
ma_device_start(&audio_device);
return 1;
}
void IB_ShutdownSound(void)
{
ma_device_uninit(&audio_device);
ma_mutex_uninit(&mutex);
ma_context_uninit(&context);
}
void IB_LockSound(void)
{
ma_mutex_lock(&mutex);
}
void IB_UnlockSound(void)
{
ma_mutex_unlock(&mutex);
}