Время не надежно при воспроизведении звука с использованием sdl2 / mixer в nim - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь создать простой метроном для изучения языка программирования 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 всего один канал и длиной 0,2 секунды)

1 Ответ

0 голосов
/ 28 ноября 2018

Вызов 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.

Таким образом, вам нужно найти другой более надежный метод ожидания или просто удалить эту задержку и записать циклы ЦП в надеждебыть более точным (ваша программа все равно может быть прервана ОС).

...