为什么会损坏声音?

Why corrupt sound?

对于此代码:

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;
    }
}

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

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。音符将有很多可识别的泛音,并且不会发声像白噪音。

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