【问题标题】:Why corrupt sound?为什么会损坏声音?
【发布时间】:2015-03-14 16:07:50
【问题描述】:

对于此代码:

while (1) {
    generate_noise(frames, period_size);
    snd_pcm_writei(dev, frames, period_size);
}

效果很好..

但是对于这个:

generate_noise(frames, period_size);
while (1) {
    snd_pcm_writei(dev, frames, period_size);
}

声音坏了。每次迭代都有一个可听见的破裂声! 这会导致总是更新缓冲区。 为什么?

更新:

typedef struct {
    int16_t left;
    int16_t right;
} pcm_frame;

...

void
generate_noise(pcm_frame *frames, const size_t size)
{
    size_t pos = 0;

    while (pos < size) {
        frames[pos].left  = rand() % 200;
        frames[pos].right = rand() % 200;
        pos += 1;
    }
}

【问题讨论】:

  • generate_noise 是否每次生成不同的样本? ,如果没有,snd_pcm_writei 是否有足够的延迟来确保写入完成(处理器的运行速度可能比 PCM 块快)?
  • @bare_metal 我正在更新帖子以获取更多信息。
  • 在第一种情况下,您每次都会生成新样本,而在第二种情况下,您会一次又一次地使用相同的样本。

标签: c buffer alsa circular-buffer


【解决方案1】:

这会产生非周期性白噪声。

while (1) {
    generate_noise(frames, period_size);
    snd_pcm_writei(dev, frames, period_size);
}

这会产生周期性波形...不是噪音!人耳是一台了不起的机器,它实际上可以告诉你你在一遍又一遍地重复使用相同的噪音。

generate_noise(frames, period_size);
while (1) {
    snd_pcm_writei(dev, frames, period_size);
}

在 48 kHz 时,周期为 1024 个样本,它将产生一个 46.9 Hz 的音符,这接近于中间 C 以下的第三个 G。该音符将有很多可识别的泛音,并且听起来不像白色噪音。

如果你想要白噪声,你不能让它循环得这么快......因为让它循环使它成为周期性的,这意味着它是一个可识别的音符。如果您希望它循环,则必须使循环更长。

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2015-01-01
    • 2010-10-31
    • 2019-11-07
    相关资源
    最近更新 更多