通过addAudio函数,可以获得一个yumo::audioInstance对象,它代表一个独立的播放实例。通过该对象,您可以对单个音频进行精细控制。
播放实例的获取
从addAudio获得
yumo::audioInstance inst = yumo::addAudio(preloadId, 0.8f);
通过 ID 重新获取
如果你的audioInstance对象因为某些原因丢失了,但是ID被保存了下来,比如一些只能按值传递整数的场景,可以使用regain函数通过实例ID重新获取:
yumo::audioInstance inst = yumo::regain(instanceId);
Note
目前的版本中,如果当实例已被移除或播放完毕,regain将返回一个instanceId为0的无效对象,如果传入的ID正好就是0则可能会有问题,具体的修复请关注后续版本的文档
控制播放
audioInstance提供了几个代理成员,您可以像操作普通变量一样读写它们,每个操作都会自动同步到播放引擎。
| 成员 | 类型 | 说明 |
|---|---|---|
position |
proxy<size_t> |
当前播放位置(样本索引)。读取获得当前位置,写入可跳转。 |
volume |
proxy<float> |
音量(0.0 ~ 1.0)。修改立即生效。 |
stopped |
proxy<bool> |
暂停/恢复:设为true暂停(位置不推进),false 恢复。 |
muted |
proxy<bool> |
静音:设为true静音(位置继续推进),false 取消。 |
示例:暂停与恢复
inst.stopped = true; // 暂停
bool isStopped = inst.stopped
inst.stopped = false; // 从暂停处继续
示例:静音控制
inst.muted = true; // 静音,但位置继续推进
inst.muted = false; // 取消静音
示例:调节音量
inst.volume = 0.5f; // 设置为 50%
float vol = inst.volume; // 读取当前音量
示例:跳转播放位置
inst.position = 44100 * 10; // 跳转到第 10 秒(44.1kHz 采样率)
size_t current = inst.position; // 获取当前位置
注意:
position的单位是采样点(样本数),对于立体声 16 位格式,每个采样点对应一个int16_t值(左声道和右声道交替存储)。调整位置时请确保不超过音频总长度,否则音频会提前结束。
检查播放状态
audioInstance提供了isPlaying方法,通过这个方法可以检查音频是否正在播放
bool playing = inst.isPlaying();
移除播放实例
手动从播放池中移除一个实例,释放资源:
bool remove(size_t instanceId);
返回 true 表示移除成功,false 表示 ID 无效。
if (yumo::remove(inst.instanceId)) {
std::cout << "已移除" << std::endl;
}
重置所有实例
将当前所有播放实例的位置重置到开头,相当于重新播放所有音频:
void resetAll();
yumo::resetAll(); // 所有音频从头开始
监听播放完成
您可以为库注册一个回调函数,当某个播放实例自然播放结束并被自动回收时,该回调会被触发,通知您该实例的ID。
void registerPlaybackFinishedCallback(PlaybackFinishedCallback callback);
void unregisterPlaybackFinishedCallback();
PlaybackFinishedCallback 定义:
using PlaybackFinishedCallback = std::function<void(size_t instanceId)>;
示例:
const int AUDIO_COUNT = 10;
int playCount = 0;
void myCallback(size_t id) {
std::cout << "实例 " << id << " 播放完毕" << std::endl;
playCount++;
}
yumo::registerPlaybackFinishedCallback(myCallback);
// 播放若干音频
while (playCount != AUDIO_COUNT)
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
// 注销回调
yumo::unregisterPlaybackFinishedCallback();
// 无回调的播放若干音频
Important
回调在库的内部线程中执行,请勿在回调中执行耗时操作或调用可能阻塞的库函数。
注意事项
- 所有
audioInstance的代理成员操作都是线程安全的,您可以在任何线程中读写它们。 - 当实例被移除或播放结束后,再操作其代理成员可能无效(但不会崩溃)。
- 建议不要试图手动构造
proxy对象(详见proxy类说明)。
小狄同学呀
Yumo-sama