我正在尝试使用SFML创建C ++中的小型libretro前端,使用声音的libao和Qt框架的某些部分。
这是逻辑:使用SFML的内置时钟系统,我在每个帧刷新libretro核心,在给定的cadency。然后核心首先轮询输入,并为生成的帧提供视频和音频输出。
问题在于音频:每一帧,核心都给我足够的音频以匹配其采样率(例如,对于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
}
但结果非常不稳定,就好像每帧之间有一些延迟。声音准确,但听起来质量很差,输出很差。我被告知我需要更强大的声音实现,这是什么意思?我是否需要重新取样声音,或制作外部线程?
谢谢!