miniaudio

一个用于音频播放和捕获的单文件库。

discord mastodon reddit

示例 - 文档 - 支持的平台 - 后端 - 主要特性 - 构建

示例

此示例展示了使用高级 API 播放声音的一种方法。

#define MINIAUDIO_IMPLEMENTATION
#include "../miniaudio.h"

#include <stdio.h>

int main(int argc, char** argv)
{
    ma_result result;
    ma_engine engine;

    if (argc < 2) {
        printf("No input file.");
        return -1;
    }

    result = ma_engine_init(NULL, &engine);
    if (result != MA_SUCCESS) {
        printf("Failed to initialize audio engine.");
        return -1;
    }

    ma_engine_play_sound(&engine, argv[1], NULL);

    printf("Press Enter to quit...");
    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("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;
}

更多示例可以在 examples 文件夹或在线此处找到: https://miniaud.io/docs/examples/

文档

在线文档可以在此处找到: https://miniaud.io/docs/

文档也可以在 miniaudio.h 的顶部找到,它始终是关于如何使用 miniaudio 的最新和权威的信息来源。所有其他文档都由此代码内文档生成。

支持的平台

后端

主要特性

有关 miniaudio 中可用功能的更完整描述,请参阅编程手册

构建

在一个源文件中执行以下操作

#define MINIAUDIO_IMPLEMENTATION
#include "miniaudio.h"

然后只需编译即可。无需安装任何依赖项。在 Windows 和 macOS 上,无需链接任何内容。在 Linux 上,只需链接到 -lpthread、-lm 和 -ldl。在 BSD 上,只需链接到 -lpthread 和 -lm。在 iOS 上,您需要编译为 Objective-C。

如果您更喜欢单独的 .h 和 .c 文件,您可以在 extras/miniaudio_split 文件夹中找到 miniaudio 的拆分版本。从这里,您可以像传统的 .c 和 .h 库一样使用 miniaudio - 只需将 miniaudio.c 添加到您的源代码树中,就像任何其他源文件一样,并包含 miniaudio.h,就像普通的头文件一样。如果您喜欢编译为单个翻译单元(又名 Unity 构建),您可以直接在您的主源文件中 #include .c 文件

#include "miniaudio.c"

请注意,拆分版本是使用工具自动生成的,并且基于根目录中的主文件。如果您想贡献代码,请在主文件中进行更改。

Vorbis 解码

Vorbis 解码通过 stb_vorbis 启用。要使用它,您需要在 miniaudio 的实现之前包含 stb_vorbis 的头文件部分。您可以通过执行以下操作来启用 Vorbis

#define STB_VORBIS_HEADER_ONLY
#include "extras/stb_vorbis.c"    /* Enables Vorbis decoding. */

#define MINIAUDIO_IMPLEMENTATION
#include "miniaudio.h"

/* stb_vorbis implementation must come after the implementation of miniaudio. */
#undef STB_VORBIS_HEADER_ONLY
#include "extras/stb_vorbis.c"