AUv3 Swift: как правильно создавать MIDI-данные из взаимодействия с пользователем - PullRequest
0 голосов
/ 05 мая 2020

Я делаю простое приложение для аудиоустройства 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)
  }
}

Хотя вроде все работает нормально, я знаю, что ссылаться на себя в блоке рендеринга - плохая практика. Так что мне интересно, каков правильный путь?

...