我目前正在开发一个非常基本的波表合成器。我将尽力给出一个可以理解的概述。
我有一个具有4096点的查找波形,该波形由音频线程采样。但是,通常,单个振荡器具有多个波形,可以通过position
参数进行变形。例如,让我们采取两个正弦波,其中第二个正弦波的周期是第一个正弦波的一半。当我们以frequency = 440Hz
和position = 0.5
播放这些声音时,我们会听到440Hz和880Hz处两个同样响亮的音调。这是a link to the audio(请参阅旁注2)。
由于性能原因,只要位置参数发生更改,我都会在另一个线程上生成查找表。这就是我的问题。即使当我不更改表的位置而只是定期生成查询表时,也会出现奇怪的,不可预测的故障。由于表中的音频数据在这种情况下不会改变,因此我只能通过撕裂的读取来解释这一点。那是对的吗?如果是这样,我该如何解决?完成生成数据后,我是否将双缓冲区与原子指针交换一起使用?
再次,这是the audio for this recording(请参阅旁注2)。
另外,一些示波器数据:
旁注1 :填充我的查找表时需要使用未经优化的~50,000ns
和经过优化的~10,000ns
。但是故障似乎以相同的概率发生。
旁注2 :我上载音频的网站似乎引入了一些奇怪的谐波,这些谐波在我的视频中听不到。请注意。
最佳答案
找到了!生成查询表后,我不小心设置了旧的扫描仪位置。如果后者花费的时间太长,则我的位置基本上会早些恢复到几微秒,这可以解释示波器的视觉挫折。
关于multithreading - 多线程波表合成器单击。这是由于阅读中断造成的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60743123/