我正在尝试使用 SFML 用于图形、libao 用于声音和 Qt 框架的某些部分在 C++ 中创建一个小型 libretro 前端。
逻辑如下:使用 SFML 的内置时钟系统,我以给定的节奏在每一帧刷新 libretro 核心。然后核心首先轮询输入,并为我提供生成帧的视频和音频输出。
问题在于音频:每一帧,核心都给我足够的音频来匹配它的采样率(例如,对于 SNES,它是每秒 32000 个样本)。所以,每次我收到音频回调时,我只是ao_play
用来播放所有需要的东西。
这是在每一帧运行的代码;我已经使用核心给出的参数初始化了 libao:有符号的 16 位整数、良好的采样率和 2 个通道。
size_t RetroCore::processAudioSampleBatch(const int16_t *data, size_t frames)
{
ao_play(&aoDevice, (char*)data, frames*4);
return frames; //just to inform the core
}
但结果非常不稳定,就像每帧之间存在一些延迟一样。声音很准确,但听起来质量很差,输出很差。我被告知我需要一个更强大的声音实现,这是什么意思?我需要重新采样声音,还是制作外螺纹?
谢谢 !