为啥 SDL2 为音频样本提供的缓冲区不够大?

Posted

技术标签:

【中文标题】为啥 SDL2 为音频样本提供的缓冲区不够大?【英文标题】:Why the buffer provided by SDL2, for audio samples, is not big enough?为什么 SDL2 为音频样本提供的缓冲区不够大? 【发布时间】:2019-04-20 04:29:03 【问题描述】:

我使用 SDL2 创建具有格式的声音:

freq = 32 * 1500;
format = AUDIO_F32SYS;
channels = 1;
samples = 1500;

我希望回调中的长度参数为 6000 (1 * sizeof(float) * 1500) 但它是 3000。

我尝试减少样本计数,使用 2 个通道,但始终提供的缓冲区是所需大小的一半。

这是我打开音频设备的方式:

SDL_Audiospec want, have;
SDL_zero(want);
want.freq = 32 * 1500;
want.format = AUDIO_F32SYS;
want.channels = 1;
want.samples = 1500;
want.callback = ::PlayDing;
want.userdata = this;
m_Audio = SDL_OpenAudioDevice(nullptr, 0, &want, &have, SDL_AUDIO_ALLOW_ANY_CHANGE);
// want == have here

wanthave 的所有字段都相等。

我在同一台笔记本电脑上从 Ubuntu 切换到 Debian 后开始出现此问题。

【问题讨论】:

【参考方案1】:

我有一个错误的假设,即每次调用回调时,它都应该填充samples 的音频数据量。

callback需要提供的样本数量,应该在callback内部根据length / sizeof(float)计算。

【讨论】:

以上是关于为啥 SDL2 为音频样本提供的缓冲区不够大?的主要内容,如果未能解决你的问题,请参考以下文章

如何从音频队列缓冲区中提取整数样本并将修改后的样本写回?

OpenGL / SDL2:模板缓冲区位在 PC 上始终为 0

如何获得 3sn 的音频缓冲区 ios

更改音频缓冲区的音高

为啥缓冲区大小会影响音频数据?

iOS,音频队列:缓冲区大小不是恒定的