音频
September 7, 2026 · View on GitHub
EUI-NEO 提供基于 miniaudio 的轻量音频播放,用于界面提示音、媒体时间轴、配乐同步和宣传片等场景。
项目内置的单头文件依赖位于 3rd/miniaudio.h。CMake 会优先使用仓库内版本,再根据 EUI_DEPS_MODE(auto、bundled 或 fetch)处理依赖。
公共 API
#include "eui/audio.h"
#include <iostream>
eui::audio::Player player;
if (!player.load("assets/music/theme.mp3")) {
std::cerr << player.error() << '\\n';
return;
}
player.play();
// player.pause(); // unavailable时返回 false,并可通过 error() 获取原因
// player.seek(12.5);
// player.stop(); // stops and rewinds to zero
// player.unload();
Player 只能移动不能复制,方法应在 UI 线程调用。播放器通过 miniaudio 引擎流式读取音频,支持当前构建启用的 MP3、WAV、FLAC、OGG 等格式。
play()、pause()、stop() 和 seek() 均返回 bool;返回 false 时通过 error() 获取原因。pause() 会保留当前播放位置,stop() 会停止并回到开头。
状态和时间接口:
loaded():音频源已成功打开。playing():当前正在播放。finished():已经播放到结尾。positionSeconds():当前播放位置,单位为秒。durationSeconds():音频总时长,单位为秒。error():最近一次操作的错误信息。
资源路径
const std::string path = eui::platform::resolveResourcePath(
"assets/music/theme.mp3");
player.load(path.empty() ? "assets/music/theme.mp3" : path);
eui_neo_configure_app() 会把顶层 assets/ 目录部署到可执行文件旁边。加载前应解析资源路径,使程序从仓库目录、构建目录和安装目录启动时都能工作。
配乐同步动画
使用 positionSeconds() 作为唯一时间轴,不要再维护第二套计时器,也不要在每帧重置动画阶段:
const float t = static_cast<float>(player.positionSeconds());
const float intro = smoothStep(0.0f, 0.6f, t);
如果需要卡点,先分析配乐并把拍点时间映射到动画 cue。apps/promo 示例从开始按钮启动音频,所有分镜时间都读取播放器游标。
错误处理与释放
load() 在路径为空、输出设备不可用、文件不存在或格式损坏/不支持时返回 false,失败后应立即检查 error()。销毁 Player 会释放 miniaudio 声音对象和引擎;替换曲目时也可以先显式调用 unload()。