我正在尝试在播放多个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
答案 0 :(得分:2)
要了解此处的实际情况,可以在每次删除后记录曲目的内容。例如:
for (i, track) in sequencer.tracks.enumerated() {
print("track: \(i)")
print(track.getMIDINoteData())
}
一种可能性是,当删除轨道0时,轨道会自行重新编制索引,这意味着第二个删除调用将无效。
也许更安全,更可预测的方法是使用track.clear()
而不是delete
。您可以在开始时创建所需的轨道,并在设置阶段仅将其输出分配给AKCallbackInstrument
。然后,您可以安全地向轨道添加注释,或根据需要清除轨道中的事件。同样,使用track.getMIDINoteData()
记录曲目内容将有助于调试。
此外,我不建议您过多停止和启动AudioKit。初始化应用程序时启动AudioKit,除非有充分理由停止它,否则请保持打开状态。
答案 1 :(得分:2)
这是不断将播放器添加到越来越多的混音器通道中而不删除先前播放器的症状。如果您实际上想在启动时重新连接它,那么您还想做的是在停止时使用player.disconnectOutput()。
我不知道这与您的音序器有什么关系。
也就是说,我不明白为什么在开始时就完全重新添加了播放器。最好在init上建立音频链,并在完全完成后将其拆除。