ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

miniaudio 测试套件构建指南:C89 命令行设备测试与 Emscripten 浏览器测试的编译、运行与调试

miniaudio 测试套件构建指南:C89 命令行设备测试与 Emscripten 浏览器测试的编译、运行与调试 音频处理【免费下载链接】miniaudioAudio playback and capture library written in C, in a single source file.项目地址https://gitcode.com/gh_mirrors/mi/miniaudio点击查看免费下载本文以仓库 tests/_build/README.md 为核心系统讲解 miniaudio 项目自带的测试套件如何从tests/_build目录统一构建与运行既包括使用 GCC 以 C89 标准编译设备输入输出deviceio命令行测试也包括使用 Emscripten 将音频测试编译为 WebAssembly 并在浏览器中运行。读完本文你将掌握该测试目录的布局、核心测试程序的命令行参数与交互方式、输出文件的存放位置以及 Emscripten 环境配置、编译命令与emrun调试手段并能在仓库源码层面印证每一步行为。一、tests/_build目录的定位与整体布局miniaudio 是一个以单源码文件single source file形式分发的 C 音频播放/采集库其完整实现位于 miniaudio.c 与 miniaudio.h。仓库在 tests 目录下按功能组织了多组测试源码例如tests/deviceio/deviceio.c设备输入/输出综合测试tests/emscripten/emscripten.cEmscripten 浏览器音频测试tests/common/common.c测试注册与统一入口框架其余如 tests/conversion/conversion.c、tests/filtering、tests/generation 等按模块划分。按照 tests/_build/README.md 的说明所有构建与运行都统一在tests/_build目录下进行Build and run from this directory编译产物如bin/下的可执行文件与运行输出均相对于该目录组织。tests/_build目录下还预置了res/benchmarks/一组 PCM 格式转换基准的原始音频数据如pcm_f32_to_s16__mono_8000.raw用于转换与生成类测试的基准比对见 tests/_build/res/benchmarksres/output/测试输出文件的目标目录内含DO_NOT_DELETE占位文件res/sine_s16_mono_48000.wav48 kHz、16 位单声道正弦波的参考音频文件见 tests/_build/res/sine_s16_mono_48000.wavdjgpp/DOS 环境下 DJGPP 工具链的环境配置脚本见 tests/_build/djgpp/djgpp_env.bat。测试程序运行时产生的输出文件如采集、双工模式写入的 WAV 文件会被放置到 res/output 文件夹中详见第三节的机制说明。二、用 GCC 构建并运行 deviceio 设备测试2.1 构建命令详解原文档给出了从tests/_build目录构建设备测试的标准命令gcc ../test_deviceio/ma_test_deviceio.c -o bin/test_deviceio -ldl -lm -lpthread -Wall -Wextra -Wpedantic -stdc89 ./bin/test_deviceio需要说明的是在当前仓库中该测试源码实际位于 tests/deviceio/deviceio.c原文档中的ma_test_deviceio.c为历史命名。因此在实际仓库中构建时应改为# 在 tests/_build 目录下执行 gcc ../deviceio/deviceio.c -o bin/test_deviceio -ldl -lm -lpthread -Wall -Wextra -Wpedantic -stdc89 ./bin/test_deviceio命令中的编译参数含义如下参数作用-ldl链接动态装载库miniaudio 支持运行时动态链接后端runtime linking时依赖它-lm链接数学库波形/噪声生成等需要-lpthread链接 POSIX 线程库设备 I/O 的线程与同步依赖它-Wall -Wextra -Wpedantic开启严格告警用于暴露跨平台/标准兼容问题-stdc89以 ISO C89 标准编译验证 miniaudio 对老标准 C 的兼容性C89 兼容并不是随意为之测试公共框架 tests/common/common.c 开头就注释说明必须先引入 external/fs/fs.c文件系统辅助实现以规避某些-stdc89下的编译错误。deviceio 测试通过#include ../common/common.c复用该框架见 tests/deviceio/deviceio.c 第 44 行。2.2 deviceio 测试的命令行参数deviceio 测试是一个典型的设备全能测试其用法注释完整写在源码头部tests/deviceio/deviceio.c 第 1-43 行USAGE: ma_test_deviceio [input/output file] [mode] [backend] [waveform] [noise] [--auto]mode设备模式对应源码中的try_parse_mode()解析第 90-113 行playback播放模式。输入文件可省略省略时使用波形或噪声源capture采集模式必须指定输出文件参数写入 WAVduplex双工模式同时播放与采集输出文件参数可选提供则把采集到的音频写入文件loopback环回模式采集播放设备正在输出的内容必须指定输出文件参数。backend音频后端对应try_parse_backend()解析第 115-192 行支持wasapi、dsound/directsound、winmm、coreaudio、sndio、audio4、oss、pulseaudio/pulse、alsa、jack、aaudio、opensl、webaudio、null。多个后端可同时指定优先级按命令行中出现的先后顺序排列null后端可用于无声运行验证。waveform波形对应try_parse_waveform()第 194-217 行sine、square、triangle、sawtooth。当播放模式未给文件且未给噪声时使用默认正弦波源码第 419-421 行默认waveformType ma_waveform_type_sinesourceType source_type_waveform。noise噪声对应try_parse_noise()第 219-238 行white、pink、brownian/brown。若同时指定多个波形或噪声类型命令行中最后出现的类型生效。--auto自动模式。程序在数据回调累计运行超过AUTO_CLOSE_TIME_IN_MILLISECONDS默认 5000 毫秒见第 46-48 行后自动退出适合脚本化、无人值守的 CI 场景不带该参数时程序进入交互模式。2.3 运行行为从源码看测试在做什么main()的执行流程tests/deviceio/deviceio.c 第 398-658 行依次完成解析命令行 → 打印编译进库的可用后端列表ma_get_enabled_backends→ 初始化ma_context→ 枚举并打印播放/采集设备含默认设备标记、原生格式列表见enumerate_devices()第 270-303 行→ 初始化ma_device→ 按模式初始化解码器ma_decoder_init_file、波形ma_waveform_init、噪声ma_noise_init或编码器ma_encoder_init_file输出格式固定为 WAV见第 563 行→ 启动设备。数据回调on_data()第 347-396 行展示了四种模式的底层处理playback统一走数据源抽象ma_data_source_read_pcm_frames()无论源是解码器、波形还是噪声都通过同一接口读取capture / loopback把采集到的 PCM 帧直接写入编码器文件duplex在格式与通道数一致的假设下用MA_COPY_MEMORY将输入帧直接搬移到输出缓冲若指定了输出文件也同时写入编码器。交互模式下程序会打印当前使用的后端与模式并要求按键控制Q退出P暂停/恢复第 597-639 行。设备生命周期事件启动、停止、重路由、中断开始/结束通过通知回调on_notification()第 312-345 行打印到终端。实用命令示例在tests/_build目录下# 用 ALSA 后端播放自带数据文件仓库提供 flac/ogg/opus 样例见 data/ 目录 ./bin/test_deviceio ../data/16-44100-stereo.flac playback alsa # 采集 5 秒写入 WAV输出到 res/output 目录 mkdir -p res/output ./bin/test_deviceio res/output/capture.wav capture alsa --auto # 双工模式指定输出文件则把采集内容落盘 ./bin/test_deviceio res/output/duplex.wav duplex pulseaudio # 用默认后端播放正弦波不指定文件 ./bin/test_deviceio playback # 仅枚举设备不启动实际传输随后按 Q 退出 ./bin/test_deviceio三、测试输出目录与公共测试框架原文档明确Output files will be placed in the res/output folder即相对tests/_build的res/output目录对应仓库 tests/_build/res/output。这一约定与公共框架 tests/common/common.c 相互印证common.c定义了TEST_OUTPUT_DIR output并在ma_run_tests()中通过fs_mkdir(NULL, TEST_OUTPUT_DIR, FS_IGNORE_MOUNTS)自动创建输出目录第 7 行、第 46 行测试程序运行后生成的音频/基准文件都会落到该目录。因此务必保留res/output/DO_NOT_DELETE占位文件避免空目录被版本管理工具清理而破坏输出约定。common.c同时提供了测试注册机制ma_register_test()将测试名与入口函数注册进最多 64 个槽位的测试表ma_run_tests()顺序执行并在每个测试前后打印 BEGIN/END 名称: PASSED/FAILED 标记任一测试失败整体返回非零便于 shell/CI 判断。当前各模块测试tests/conversion、tests/filtering、tests/generation 等均基于该框架组织。四、Emscripten把音频测试编译进浏览器deviceio 之外tests/_build还承担 EmscriptenWebAssembly测试的构建职责。Emscripten 测试源码为 tests/emscripten/emscripten.c配套页面为 tests/emscripten/emscripten.html。该测试有意关闭了解码/编码功能#define MA_NO_DECODING、#define MA_NO_ENCODING只保留设备 I/O 与波形生成用于验证 miniaudio 的 Web Audio 后端。4.1 环境准备原文档要求先在终端加载 Emscripten 环境Linux编译前执行source ~/emsdk/emsdk_env.sh路径按你的 emsdk 安装位置调整把emcc、emrun等工具加入 PATHWindows需在tests/_build下从命令提示符cmd用绝对路径运行C:\emsdk\emsdk_env.bat。注意原文档特别指出PowerShell 不适用必须使用传统命令提示符可能与脚本的set/环境变量传播机制有关。4.2 编译命令与参数解析emcc ../test_emscripten/ma_test_emscripten.c -o bin/test_emscripten.html \ -sAUDIO_WORKLET1 -sWASM_WORKERS1 -sASYNCIFY \ -DMA_ENABLE_AUDIO_WORKLETS -Wall -Wextra在当前仓库中该测试源码实际位于 tests/emscripten/emscripten.c原文档中的ma_test_emscripten.c为历史命名对应命令应为emcc ../emscripten/emscripten.c -o bin/test_emscripten.html \ -sAUDIO_WORKLET1 -sWASM_WORKERS1 -sASYNCIFY \ -DMA_ENABLE_AUDIO_WORKLETS -Wall -Wextra各参数作用参数作用-sAUDIO_WORKLET1启用 Audio Worklet 音频线程使音频回调运行在专用工作线程而非主线程-sWASM_WORKERS1允许在 Worker 线程中使用 WASM配合设备 I/O 线程模型-sASYNCIFY异步化改造让阻塞式音频初始化/启动能够融入浏览器事件模型-DMA_ENABLE_AUDIO_WORKLETS在 miniaudio 侧显式启用 Audio Worklet 后端路径-Wall -Wextra开启告警检查这些宏与后端开关可以从 tests/emscripten/emscripten.c 顶部第 1-4 行与 miniaudio.h 的编译期宏体系对应起来库层面的后端开关如MINIAUDIO_NO_WEBAUDIO也可在根目录 CMakeLists.txt 的选项列表中看到。4.3 测试程序的行为设计与命令行测试不同Emscripten 测试是事件驱动的。源码main()tests/emscripten/emscripten.c 第 123-137 行打印操作提示后通过emscripten_set_mouseup_callback(canvas, ...)注册鼠标回调并调用emscripten_set_main_loop(main_loop__em, 0, 1)启动主循环。点击画布的行为第 96-118 行左键单击执行do_playback()以 48 kHz、双通道、f32 格式初始化播放设备并用ma_waveform生成 220 Hz 正弦波ma_waveform_config_init(..., ma_waveform_type_sine, 0.2, 220)右键单击执行do_duplex()以共享模式ma_share_mode_shared打开双工设备在回调中直接memcpy完成输入到输出的透传再次点击在启动/停止之间切换设备ma_device_get_state/ma_device_stop/ma_device_start。配套页面 tests/emscripten/emscripten.html 提供了画布、全屏/指针锁定按钮、以及用于显示printf输出的textarea#output文本区——程序的Module.print会把 stdout 逐行追加到该区域并自动滚动到底部第 78-93 行。这也是验证音频是否正常工作的观察窗口。4.4 本地运行与调试WASM 输出在直接双击打开本地 HTML 时可能无法工作涉及跨源与 Web Worker/Worklet 的加载限制原文档给出的做法是emrun ./bin/test_emscripten.htmlemrun会以正确的本地 HTTP 服务方式托管页面并自动打开浏览器。若希望printf的日志同时显示在终端命令行而不是只出现在页面文本区则编译时追加--emrun标志emcc ../emscripten/emscripten.c -o bin/test_emscripten.html \ -sAUDIO_WORKLET1 -sWASM_WORKERS1 -sASYNCIFY \ -DMA_ENABLE_AUDIO_WORKLETS -Wall -Wextra --emrun加上该标志后经emrun启动的程序会把 stdout 转发回终端便于在开发期定位初始化失败、设备枚举异常等问题。五、与 CMake 测试选项的衔接除手动 GCC/emcc 命令行构建外仓库根目录的 CMakeLists.txt 也提供了可选的测试构建开关MINIAUDIO_BUILD_TESTS默认OFF用于构建测试套件同时可用MINIAUDIO_FORCE_C89强制 C89 编译、用MINIAUDIO_NO_DEVICEIO、MINIAUDIO_NO_GENERATION等开关裁剪功能模块见第 16-73 行。这与tests/_build/README.md强调的 C89 严格模式相互印证测试不仅用于功能验证还承担着跨标准、跨后端兼容性的回归职责。批量测试输出同样遵循common.c的output目录约定可作为 CI 断言依据。六、常见问题与注意事项C89 告警若编译测试出现大量-stdc89报错请确认common.c中最先引入的是 external/fs/fs.c该文件内含规避老标准编译问题的兼容处理PowerShell 无法加载 Emscripten 环境Windows 下务必使用 cmd并给emsdk_env.bat传绝对路径WASM 页面本地打开无声/无法启动改用emrun托管设备启动必须由浏览器输入事件触发如画布点击这是浏览器自动播放策略的要求也正是测试程序把ma_device_start放进鼠标回调的原因输出文件去向从tests/_build运行测试时生成文件按文档约定落在res/output请勿删除DO_NOT_DELETE占位文件若直接在其它目录运行测试程序则按common.c的TEST_OUTPUT_DIR在当前目录创建output。通过本文的步骤你可以从 tests/_build/README.md 这份简短的构建说明出发完整掌握 miniaudio 测试套件在原生C89 各平台后端与 WebEmscripten Audio Worklet两条编译链路上的构建、运行与调试方法并借助源码中命令行解析、数据回调与页面事件绑定的细节将测试程序改造成适合自己平台与场景的音频验证工具。赞分享音频处理【免费下载链接】miniaudioAudio playback and capture library written in C, in a single source file.项目地址https://gitcode.com/gh_mirrors/mi/miniaudio点击查看免费下载相关推荐CoffeeScript 浏览器端测试指南在 Node 与浏览器中运行语言测试套件CoffeeScript 浏览器端测试指南在 Node 与浏览器中运行语言测试套件 CoffeeScript 仓库自带一整套覆盖语法、编译输出与运行时行为的测编程语言编译器SciPy 本地测试实战指南基于 spin 命令行工具运行与调试测试套件SciPy 本地测试实战指南基于 spin 命令行工具运行与调试测试套件 本篇指南围绕 SciPy 仓库中 Running SciPy Tests Local科学计算数据科学高性能计算.NET runtime CoreCLR WebAssembly 构建与调试指南从 emscripten 编译到 Node.js/浏览器运行.NET runtime CoreCLR WebAssembly 构建与调试指南从 emscripten 编译到 Node.js/浏览器运行 本篇指南基于 .语言运行时标准库JIT编译编译器上一篇MetaBMC安全机制详解保护服务器管理控制器的5层防护体系下一篇mysql_sysbench在openEuler/service_trainning中的应用性能测试实战教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表