在 AKPlayer 上使用切换(开-关)开关

Using toggle (on-off) switch on AKPlayer

我正在尝试在播放多个 AKPlayer 时实现开关。首先,我调用了两个 AKPlayers,由 AKCallbackInstrumentsAKSequencer 中触发。

当我打开开关时,1) 两个 AKPlayer 分配给 AKMixer,2) Audiokit 启动,3) 两个音轨添加到 AKSequencer,4) 音序器启动。

而关闭时,1) 两个AKPlayers.stop(), 2) sequencer.stop() 3) sequencer.deleteTrack(trackIndex: 0), sequencer.deleteTrack(trackIndex:1) 4) AudioKit.stop().

第一次开机和关机成功。但是当我第二次打开开关时,音乐越来越大声,可能是因为一些midi tracks/sequencer 曲目没有完全删除。谁能告诉我我在这里缺少什么?非常感激。 <3

要了解此处真正发生的情况,您可以在每次删除后记录曲目内容。例如:

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

一种可能是,当您删除轨道 0 时,轨道会自行重新编制索引,这意味着第二次删除调用将无效。

也许更安全、更可预测的处理方法是使用 track.clear() 而不是 delete。您可以在开始时创建您需要的曲目,并在设置阶段仅将它们的输出分配给 AKCallbackInstrument 一次。然后,您可以根据需要安全地向轨道添加注释或清除轨道中的事件。同样,使用 track.getMIDINoteData() 记录轨道内容将有助于调试。

此外,我不建议您停止和启动 AudioKit 的次数超过您的需要。初始化应用程序时启动 AudioKit,并保持打开状态,除非您有令人信服的理由停止它。

这是不断将玩家添加到越来越多的混音器频道而不删除以前的玩家的症状。如果您实际上想在开始时重新连接它,您还想做的是 player.disconnectOutput() 停止。

不知道跟你的音序器有什么关系

就是说,我完全不明白您为什么要在开始时重新添加播放器。最好在初始化时建立音频链,并在完全完成后拆除。