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