SDL2 音频回调限制为 8 位?
SDL2 Audio Callback restricted to 8bit?
通读了 SDL2 音频文档(有点可悲),我可以看到有多种可用的音频格式 - 包括未签名和已签名的 8 位、16 位、32 位浮动。到目前为止,一切都很好。
我一直在为这个项目使用 SDL,我想用 16 位做一些简单的音频合成。所以我根据此页面将 SDL_AudioSpec 结构中的格式设置为 AUDIO_U16SYS
https://wiki.libsdl.org/SDL_AudioSpec
然而,当我查看同一页面上的回调文档时(实际上我在网上查看的其他任何地方),回调中的音频缓冲区是 *Uint8:
void SDL_AudioCallback(void* userdata,
Uint8* stream,
int len)
既然如此,我看不出如何将 16 位音频实际传递给 SDL。看起来它总是会接收 8 位的音频,而库只是将采样率提高到所需的比特率。但这听起来很疯狂。那是正确的,还是我遗漏了什么。例如,是否有(以某种方式)对应于例如的替代回调原型。 AUDIO_U16SYS,还是我必须使用其他方法来获得更高的比特率?
虽然 stream
确实是一个指向 8 位整数的指针,但您可以将其转换为正确的类型。它只是指向字节流的通用指针,应如何解释这些字节(例如将每两个字节组合成一个 16 位字)取决于您。
所以在回调函数中,例如
Uint16 *stream16 = (Uint16 *) stream;
通读了 SDL2 音频文档(有点可悲),我可以看到有多种可用的音频格式 - 包括未签名和已签名的 8 位、16 位、32 位浮动。到目前为止,一切都很好。 我一直在为这个项目使用 SDL,我想用 16 位做一些简单的音频合成。所以我根据此页面将 SDL_AudioSpec 结构中的格式设置为 AUDIO_U16SYS https://wiki.libsdl.org/SDL_AudioSpec
然而,当我查看同一页面上的回调文档时(实际上我在网上查看的其他任何地方),回调中的音频缓冲区是 *Uint8:
void SDL_AudioCallback(void* userdata,
Uint8* stream,
int len)
既然如此,我看不出如何将 16 位音频实际传递给 SDL。看起来它总是会接收 8 位的音频,而库只是将采样率提高到所需的比特率。但这听起来很疯狂。那是正确的,还是我遗漏了什么。例如,是否有(以某种方式)对应于例如的替代回调原型。 AUDIO_U16SYS,还是我必须使用其他方法来获得更高的比特率?
虽然 stream
确实是一个指向 8 位整数的指针,但您可以将其转换为正确的类型。它只是指向字节流的通用指针,应如何解释这些字节(例如将每两个字节组合成一个 16 位字)取决于您。
所以在回调函数中,例如
Uint16 *stream16 = (Uint16 *) stream;