一个单文件实现的音频播放和录制库。
特性 - 示例 - 构建 - 文档 - 支持的平台 - 许可证
miniaudio 使用 C 语言编写,除标准库外没有其他依赖,可在所有主流编译器上干净编译,无需安装任何额外的开发包。支持所有主要的桌面和移动平台。
特性
- 简单的构建系统,无外部依赖。
- 简单灵活的 API。
- 用于直接访问原始音频数据的低级 API。
- 用于声音管理、混音、效果和可选 3D 空间化的高级 API。
- 灵活的节点图系统,用于高级混音和效果处理。
- 用于加载音频文件的资源管理。
- 解码,内置支持 WAV、FLAC 和 MP3,还可以插入自定义解码器。
- 编码(仅限 WAV)。
- 数据转换。
- 重采样,包括自定义重采样器。
- 通道映射。
- 基本的波形和噪声生成。
- 基本效果和滤波器。
请参阅编程手册以获取 miniaudio 可用特性的更完整描述。
示例
这个示例展示了使用高级 API 播放声音的一种方法。
#define MINIAUDIO_IMPLEMENTATION
#include "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("按回车键退出...");
getchar();
ma_engine_uninit(&engine);
return 0;
}
这个示例展示了如何使用低级 API 解码和播放声音。
#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, 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("没有输入文件。\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;
如果初始化播放设备失败(ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS),则打印错误信息"无法打开播放设备。",关闭解码器,并返回-3。
如果启动播放设备失败(ma_device_start(&device) != MA_SUCCESS),则打印错误信息"无法启动播放设备。",清理设备和解码器,并返回-4。
打印"按回车键退出...",并等待用户输入。
清理设备和解码器。
返回0。
更多示例可以在examples文件夹或在线文档https://miniaud.io/docs/examples/中找到。
构建
========
在一个源文件中执行以下操作:
```c
#define MINIAUDIO_IMPLEMENTATION
#include "miniaudio.h"
然后直接编译。无需安装任何依赖项。在Windows和macOS上无需链接任何库。在Linux上只需链接-lpthread、-lm和-ldl。在BSD上只需链接-lpthread和-lm。在iOS上需要以Objective-C方式编译。
如果出现未定义引用__sync_val_compare_and_swap_8、__atomic_load_8等错误,需要链接-latomic。
如果更喜欢单独的.h和.c文件,可以在extras/miniaudio_split文件夹中找到miniaudio的分离版本。这样可以像传统的.c和.h库一样使用miniaudio - 只需将miniaudio.c添加到源代码树中,并像普通头文件一样包含miniaudio.h。如果更喜欢编译为单个翻译单元(又称unity构建),可以在主源文件中#include .c文件:
#include "miniaudio.c"
请注意,分离版本是使用工具自动生成的,基于根目录中的主文件。如果要贡献,请在主文件中进行更改。
不保证版本之间的ABI兼容性,因此在编译为DLL/SO时要小心。建议直接将miniaudio添加到源代码树中。
文档
在线文档可在此处找到:https://miniaud.io/docs/
文档也可以在miniaudio.h顶部找到,这始终是有关如何使用miniaudio的最新和权威信息来源。所有其他文档都是从此代码内文档生成的。
支持的平台
- Windows
- macOS, iOS
- Linux
- FreeBSD / OpenBSD / NetBSD
- Android
- Raspberry Pi
- Emscripten / HTML5
miniaudio应该可以在其他平台上干净编译,但默认情况下不会包含任何播放或捕获支持。要支持这些功能,需要实现自定义后端。无需修改miniaudio源代码即可实现。请参阅custom_backend示例。
后端
- WASAPI
- DirectSound
- WinMM
- Core Audio (Apple)
- ALSA
- PulseAudio
- JACK
- sndio (OpenBSD)
- audio(4) (NetBSD和OpenBSD)
- OSS (FreeBSD)
- AAudio (Android 8.0+)
- OpenSL|ES (仅限Android)
- Web Audio (Emscripten)
- Null (静音)
- 自定义
许可证
您可以选择公共领域或MIT No Attribution许可。