1 回答

TA贡献1831条经验 获得超10个赞
没有实际的方法来确定应用于扬声器的相位何时通过0。最好放弃它。
这是一个“不同”的解决方案,我认为您会发现它的工作原理要好得多:
切换到 。要获得最低的延迟,请使用最小的可用缓冲区大小 ()。
MODE_STREAM
getMinBufferSize()
使用专用线程向 提供波形。该线程有一项工作:根据当前频率将小段波形写入 ,(您也可以使用主线程,并不断用非阻塞写入来填充,但在我看来,使用单独的线程更优雅。线程将花费大部分时间在阻塞调用中,这意味着缓冲区以最少的工作量保持最大填充。
AudioTrack
AudioTrack
AudioTrack
write()
摆脱 和 .从头开始音频播放,并且在离开应用之前不要停止它。
startSinus()
stopSinus()
进行更改,以便它只是将当前频率值传达给步骤 2 中描述的线程。使用任何标准的线程间通信机制。
setSinus()
当需要离开应用程序时,请使用标准的线程间通信机制来通知它应该终止的线程,然后它,清理等。
join()
其他详细信息:
让你的小。也许一次只有100个样本。这有助于最大限度地减少延迟,同时仍保持所需的阻塞行为,并且无需担心 中有多少可用空间。
write()s
AudioTrack
在工作线程中,使用 a 来跟踪阶段(就像您现在正在做的一样)。根据频率增加相位,但不要让它变得太大!通过让它包裹,使其保持在0到2 * PI之间(否则,由于量化,较大的相位误差会悄悄进入,并且频率会意外变化)。显然,在填充每个微小的100个样品缓冲液后,您不会重置。你只是让它滚来滚去。
float
phase
添加回答
举报