gpt4 book ai didi

audio - 在 nim 中使用 sdl2/mixer 播放音频的时间不可靠

转载 作者:行者123 更新时间:2023-12-02 23:03:15 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的节拍器来学习 nim 编程语言,虽然我可以播放音频,但计时不起作用。我在 Mac OSX 上运行它,每三次或第四次“点击”总是有一个延迟

这是我的代码:

# nim code to create a metronome
import times, os
import sdl2, sdl2/mixer

sdl2.init(INIT_AUDIO)

var click : ChunkPtr
var channel : cint
var audio_rate : cint
var audio_format : uint16
var audio_buffers : cint = 4096
var audio_channels : cint = 2

if mixer.openAudio(audio_rate, audio_format, audio_channels, audio_buffers) != 0:
quit("There was a problem")

click = mixer.loadWAV("click.wav")

var bpm = 120
var next_click = getTime()
let dur = initDuration(milliseconds = toInt(60000 / bpm))
var last_click = getTime()
while true:
var now = getTime()
if now >= next_click:
next_click = next_click + dur
# discard mixer.playChannelTimed(0, click, 0, cint(500)
discard mixer.playChannel(0, click, 0)
os.sleep(1)

知道为什么会滞后吗?

(顺便说一下,click.wav文件只有一个 channel ,0.2秒长)

最佳答案

调用 os.sleep(1)作为高精度时序控制不可靠。在 MacOSX 上它调用 nanosleep ,其中指出:

   If the interval specified in req is not an exact multiple of the
granularity underlying clock (see time(7)), then the interval will be
rounded up to the next multiple. Furthermore, after the sleep
completes, there may still be a delay before the CPU becomes free to
once again execute the calling thread.

因此,您需要找到一种不同的更可靠的等待方法,或者简单地消除该延迟并烧毁 CPU 循环以希望更精确(您的程序仍然可能被操作系统抢占)。

关于audio - 在 nim 中使用 sdl2/mixer 播放音频的时间不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53513547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com