Я делаю простое приложение для аудиоустройства midi-клавиатуры на Swift и не знаю, как лучше передать список событий в блок internalRender из ViewController.
Теперь я делаю это, вероятно, неправильно:
У меня есть член events
класса AudioUnit, который имеет тип Queue
(основанный на связанном списке объектов Node
), а в контроллере представления я ставлю в очередь такие события, как «Note on», с помощью
audioUnit?.events.enqueue(.noteOn, channel, note, velocity)
. В internalRenderBlock я извлекаю события из очереди и передаю их кэшированной функции midiOutputEvents следующим образом:
let now = AUEventSampleTimeImmediate;
while !self.events.isEmpty {
let data = self.events.dequeue()
if data != nil {
_ = out?(now, 0, 3, data)
}
}
Хотя вроде все работает нормально, я знаю, что ссылаться на себя в блоке рендеринга - плохая практика. Так что мне интересно, каков правильный путь?