Использование тумблера (вкл / выкл) на AKPlayer

Я пытаюсь внедрить выключатель в игру нескольких AKPlayers. Во-первых, я позвонил двум AKPlayers, вызваны AKCallbackInstruments в AKSequencer,

Когда я включаю переключатель, 1) два AKPlayer назначаются на AKMixer, 2) Audiokit запускается, 3) два трека добавляются в AKSequencer, 4) Sequencer запускается.

А при выключении 1) два AKPlayers.stop(), 2) sequencer.stop() 3) sequencer.deleteTrack(trackIndex: 0), sequencer.deleteTrack(trackIndex:1) 4) AudioKit.stop(),

Сначала включается и выключается успешно. Но когда я включаю переключатель во второй раз, музыка становится все громче и громче, возможно, потому, что некоторые треки миди / секвенсора не удаляются полностью. Кто-нибудь может сказать мне, что мне здесь не хватает? Очень признателен. <3

2 ответа

Решение

Чтобы узнать, что на самом деле здесь происходит, вы можете регистрировать содержимое треков после каждого удаления. Например:

for (i, track) in sequencer.tracks.enumerated() {
    print("track: \(i)")
    print(track.getMIDINoteData())
}

Одна возможность состоит в том, что при удалении дорожки 0 дорожки переиндексируются, что означает, что второй вызов удаления не будет иметь никакого эффекта.

Возможно, более безопасный и предсказуемый способ справиться с этим будет использовать track.clear() скорее, чем delete, Вы можете создать треки, которые вам понадобятся в начале, и назначить их вывод AKCallbackInstrument только один раз на этапе настройки. Затем вы можете безопасно добавлять заметки к трекам или удалять события из треков по мере необходимости. Опять регистрируем содержимое трека с помощью track.getMIDINoteData() будет полезно для отладки.

Кроме того, я бы не рекомендовал останавливать и запускать AudioKit чаще, чем нужно. Запустите AudioKit при инициализации приложения и оставьте его включенным, если у вас нет веских причин для его остановки.

Это признак того, что вы продолжаете добавлять игрока во все новые и новые каналы микшера, не удаляя предыдущих игроков. То, что вы также хотите сделать, это player.disconnectOutput() при остановке, если вы действительно хотите повторно подключить его при запуске.

Я не знаю, какое это имеет отношение к вашему секвенсору.

Тем не менее, я не понимаю, почему вы заново добавляете плеер на старте. Было бы лучше установить звуковую цепочку на init и разорвать, когда вы закончите.

Другие вопросы по тегам