C SDL2音频回调限制为8比特?

C SDL2音频回调限制为8比特?,c,audio,sdl,sdl-2,C,Audio,Sdl,Sdl 2,通读了SDL2音频文档(有点糟糕),我发现有多种音频格式可用——包括无符号和有符号8位、16位、32位浮点。到现在为止,一直都还不错。 在这个项目中我一直在使用SDL,我想用16位做一些简单的音频合成。因此,我在SDL_AudioSpec结构中将格式设置为AUDIO_U16SYS,如下页所示 但是,当我在同一页上查看回调文档时(事实上,在我在web上查看的其他地方),回调中的音频缓冲区是*Uint8: void SDL_AudioCallback(void* userdata,

通读了SDL2音频文档(有点糟糕),我发现有多种音频格式可用——包括无符号和有符号8位、16位、32位浮点。到现在为止,一直都还不错。 在这个项目中我一直在使用SDL,我想用16位做一些简单的音频合成。因此,我在SDL_AudioSpec结构中将格式设置为AUDIO_U16SYS,如下页所示

但是,当我在同一页上查看回调文档时(事实上,在我在web上查看的其他地方),回调中的音频缓冲区是*Uint8:

void SDL_AudioCallback(void*  userdata,
                       Uint8* stream,
                       int    len)

在这种情况下,我不知道如何将16位音频传递给SDL。看起来它总是以8比特的速度接收音频,而该库只是将采样增加到所需的比特率。但这听起来很疯狂。是这样,还是我遗漏了什么。例如,是否(以某种方式)存在对应于例如AUDIO_U16SYS的备用回调原型,或者我是否必须使用其他方法来获得更高的比特率?

虽然
流实际上是指向8位整数的指针,但您可以将其转换为正确的类型。它只是一个指向字节流的通用指针,如何解释这些字节(例如,将每两个字节组合成一个16位字)取决于您

因此,在回调函数中,只需执行

Uint16 *stream16 = (Uint16 *) stream;

啊,太好了。谢谢你的快速回答。当你指出这一点时,我的大脑反应迟钝,这一点很明显。事实上,这似乎并不是全部——再说一次,在我能找到的文档中没有任何内容涵盖这一点。如果我切换到AUDIO_U16SYS,将我的音频范围从(0-255)更改为(0-65535),并使用上面的强制转换指针方法,我会得到失真的音频。也许我需要发布更多的代码,也许最好在这一点上开始一个新的问题。无论如何,谢谢你的帮助——它确实回答了我最初的问题。我只是比我想象的还要困惑:)啊!好的,所以我忽略了len参数是缓冲区的字节长度。因此,除了更改格式、更改音频范围并将流强制转换为16位整数外,我还需要将缓冲区的长度除以sizeof(Uint16)/sizeof(Uint8)。(事实上,len是以字节为单位的,这一点在文档中已经提到了——我只是错过了)