miniaudio - 音频播放和采样库
miniaudio 使用 C 语言编写,除了标准库之外没有任何依赖项,可以在所有主流编译器上顺利编译,无需安装任何其他开发包。它支持所有主流桌面和移动平台。
特性
- 简单的构建系统,没有外部依赖。
- 简单灵活的 API。
- 用于直接访问原始音频数据的低级 API。
- 用于声音管理、混合、效果和可选 3D 空间化的高级 API。
- 灵活的节点图系统,用于高级混合和效果处理。
- 用于加载声音文件的资源管理。
- 解码,内置对 WAV、FLAC 和 MP3 的支持,此外还能够插入自定义解码器。
- 编码(仅限 WAV)。
- 数据转换。
- 重采样,包括自定义重采样器。
- 通道映射。
- 波形和噪声的基本生成。
- 基本效果和过滤器。
有关 miniaudio 中可用功能的更完整描述,参阅编程手册。
示例
此示例展示了使用高级 API 播放声音的一种方法。
#include "miniaudio/miniaudio.h"
#include <stdio.h>
int main()
{
ma_result result;
ma_engine engine;
result = ma_engine_init(NULL, &engine);
if (result != MA_SUCCESS) {
return -1;
}
ma_engine_play_sound(&engine, "sound.wav", NULL);
printf("Press Enter to quit...");
getchar();
ma_engine_uninit(&engine);
return 0;
}
此示例展示了如何使用低级 API 解码和播放声音。
#include "miniaudio/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, NULL);
(void)pInput;
}
int main(int argc, char** argv)
{
ma_result result;
ma_decoder decoder;
ma_device_config deviceConfig;
ma_device device;
if (argc < 2) {
printf("No input file.\n");
return -1;
}
result = ma_decoder_init_file(argv[1], NULL, &decoder);
if (result != MA_SUCCESS) {
return -2;
}
deviceConfig = ma_device_config_init(ma_device_type_playback);
deviceConfig.playback.format = decoder.outputFormat;
deviceConfig.playback.channels = decoder.outputChannels;
deviceConfig.sampleRate = decoder.outputSampleRate;
deviceConfig.dataCallback = data_callback;
deviceConfig.pUserData = &decoder;
if (ma_device_init(NULL, &deviceConfig, &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;
}
更多示例可以在示例文件夹或在线此处找到: https://miniaud.io/docs/examples/