2016-01-20 49 views
1

通过阅读SDL2音频文档(这是一种令人悲哀的),我可以看到有各种音频格式可用 - 包括未签名的& signed 8bit,16bit,32bitfloat。到现在为止还挺好。 我被困在这个项目中使用SDL,我想在16bit中做一些简单的音频合成。所以,我给自己定的我SDL_AudioSpec结构中的格式AUDIO_U16SYS按本页面 https://wiki.libsdl.org/SDL_AudioSpecSDL2音频回拨限制为8位?

然而,当我在看同一页上的回调文件(实际上其他地方我看了网络上)在回调音频缓冲区* UINT8:

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

这是我看不到我怎么会实际上传递的16位音频SDL的情况。它看起来总是会以8bit的速度接收音频,并且库只是上传到所需的比特率。但这听起来很疯狂。这是正确的,还是我错过了一些东西。例如,是否有(不知何故)一个替代回调原型对应于例如。 AUDIO_U16SYS,还是我必须使用其他方法来获得更高的比特率?

回答

1

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

所以在回调函数中,

Uint16 *stream16 = (Uint16 *) stream; 
+0

啊,太好了。感谢你及时的答复。 当你指出,但我的大脑速度缓慢时,这一点相当明显。 – DanBennett

+1

其实这似乎并不是整个故事 - 再一次,我可以找到的文档中没有任何内容涵盖它。如果我切换到AUDIO_U16SYS,请将音频范围从(0-255)更改为(0-65535),并使用上面的投影指针方法,我会听到失真的音频。也许我需要发布更多的代码,也许最好在这一点上提出一个新问题。无论如何感谢您的帮助 - 它确实回答了我原来的问题。我只是比我想象的更困惑:) – DanBennett

+1

啊!好的,所以我错过了len参数是缓冲区的长度*(以字节为单位)。因此,除了更改格式,更改音频范围并将流转换为16位整数,我还需要通过sizeof(Uint16)/ sizeof(Uint8)来划分缓冲区的长度。 (以及len以字节为单位的事实在文档中已经涵盖 - 我只是错过了它) – DanBennett