0

我正在尝试使用 Windows API 中的 PlaySound() 在 C 中创建一个命令行节拍器应用程序。我正在使用下面的代码来生成一个 120 bmp 速度的节拍器。声音与我的本地 .wav 文件完美播放,但速度不一致。有时匆忙有时延迟。关于如何使其保持一致的任何解决方案?

#include <stdio.h>
#include <windows.h>

int main() {
    while (1) {
        PlaySound("lib\\tick.wav", NULL, SND_FILENAME | SND_NODEFAULT | SND_ASYNC);
        Sleep(500);
        for (int i = 0;i < 3;i++) {
            PlaySound("lib\\click.wav", NULL, SND_FILENAME | SND_NODEFAULT | SND_ASYNC);
            Sleep(500);
        }
    }
    return 0;
}
4

1 回答 1

0

当我设法让一个非常好的节拍器在 Java 中工作时,我并没有依赖这种Thread.sleep()方法。正如其他人在评论中指出的那样,应用程序并没有像这样提供非常精确的实时保证。

IDK 与 C 等价的是什么,但最终对我有用的是有一个持续流式传输的音频信号(静音),我在其中计算各个帧,因为它们被发送到输出,并混合在“点击”PCM 中在计算帧。

例如,如果您每分钟有 120 次节拍,格式为 44100 fps,那么在每 22050 帧,您将在传出线路中混入咔哒声。

我在 Java 中使用的类是SourceDataLine,如果它有助于了解它的结构。C甚至有等价物吗?也许这取决于用于声音输出的库?当我考虑用 C 语言进行音频编码时,我感到非常困惑。

关于SourceDataLine(如果你能找到一个等价物)的好处是它使用了一个阻塞队列,所以写操作被迫等到系统准备好下一次缓冲区加载,因此与数据消耗率密切相关对于干净的播放,它保持非常稳定。

于 2021-10-17T22:30:56.170 回答