多线程波表合成器点击。这是由读取撕裂引起的吗?

Multi-Threaded Wavetable Synthesizer clicks. Is this caused by torn reads?

我目前正在研究一个非常基本的 wavetable 合成器。我会尽力给出一个易于理解的概述。

我有一个 查找波形,有 4096 个点,由音频线程采样。然而,一般来说,单个振荡器有多个波形,可以通过 position 参数变形。例如,让我们以两个正弦波为例,其中第二个正弦波的周期是第一个的一半。当我们在 frequency = 440Hzposition = 0.5 播放它们时,我们会在 440Hz 和 880Hz 听到两个同样响亮的音调。这是 a link to the audio(参见旁注 2)。

由于性能原因,每当位置参数发生变化时,我都会在另一个线程上生成查找 table。这就是我的问题。即使我不更改 table 位置,只是定期生成我的查找 table,我也会遇到奇怪的、不可预测的 table 故障。由于 table 中的音频数据在这种情况下没有改变,我只能通过撕裂读取来解释这一点。那是对的吗?如果是这样,我该如何解决?完成数据生成后是否使用带有原子指针交换的双缓冲区?

同样,这里是 the audio for this recording(参见旁注 2)。 另外,一些示波器数据:

旁注 1:填充我的查找 table 需要 ~50,000ns 没有优化和 ~10,000ns 有优化。但是故障似乎以相同的概率发生。

旁注 2:我上传音频的网站似乎引入了一些奇怪的谐波,这些谐波在我的视频中听不到。只是让你知道。

找到了!在生成查找 table 后,我不小心设置了一个旧的扫描仪位置。如果后者花费的时间太长,我的位置基本上会重置为早几微秒,这解释了示波器中的视觉挫折。