AudioKit 5 - 播放器在断开连接状态下启动

AudioKit 5 - player started when in a disconnected state

尝试使用 AudioKit 5 动态创建带有混音器的播放器,并将其附加到主混音器。我希望生成的链看起来像:

AudioPlayer -> Mixer(for player) -> Mixer(for output) -> AudioEngine.output

我的示例存储库在这里:https://github.com/hoopes/AK5Test1

您可以在此处的主文件中看到 (https://github.com/hoopes/AK5Test1/blob/main/AK5Test1/AK5Test1App.swift),其中包含三个函数。

第一个作品,在创建控制器 class 时创建的 Mixer 上播放 mp3。

第二个作品,新创建的 AudioPlayer 直接挂接到 outputMixer

然而,第三个,我尝试在上面设置链,没有,并且崩溃并出现“播放器在断开连接状态下启动”错误。我在这里复制了函数:

/** Try to add a mixer with a player to the main mixer */
func doesNotWork() {
    let p2 = AudioPlayer()
    let localMixer = Mixer()
        
    localMixer.addInput(p2)
    outputMixer.addInput(localMixer)
        
    playMp3(p: p2)
}

其中 playMp3 只是在 AudioPlayer 上播放示例 mp3。

我不确定我是如何滥用混音器的。在我的实际应用程序中,我有一个更长的 mixers/boosters/etc 链,并且出现相同的错误,这导致我创建了简单的测试应用程序。

如果有人可以提供建议,我很想听听。非常感谢!

在你的情况下,你可以交换 outputMixer.addInput(localMixer) 和 localMixer.addInput(p2) 然后就可以了

启动引擎后:使用音频链连接从输出向后工作。所以,您的问题是您将播放器连接到与输出断开连接的调音台。您需要先将输出连接到混音器,然后将该混音器连接到播放器。

我最后从 AudioKit 贡献者那里得到的建议是尽一切可能预先创建您需要的所有音频对象,并动态地将它们的音量更改为“连接”和“断开连接”,可以这么说。

假设您有一个钢琴应用程序(一个人为的示例,但希望能够理解重点)- 而不是在按下键时创建一个播放器,连接它,然后 disconnecting/disposing 当音符完成时,在启动时为每个键创建一个播放器,并动态处理它们 - 这可以防止出现“断开连接状态”等任何怪异现象。

从那以后,这对我来说一直很完美。