AudioKit访问底层CoreAudio节点(Spotify集成)



我正在尝试连接到Spotify流,并使用自定义合成器修改输出。如果能使用很棒的AudioKit,那就太好了。为了改变Spotify流的输出,我必须实现这个方法,这让我可以访问Spotify的AUGraph。然后,我可以添加将连接到spotify图形的输入和输出的AUNodes(这里描述得很好)。

我知道AudioKit在内部使用CoreAudio,但我还没有找到任何方法来访问AKNodes的底层AUNodes(如果有的话)。或者是否有其他方法可以将AudioKit AKNode连接到现有的AUGraph

现在我看到AudioKit使用AVAudioEngine(而不是EZAudio中使用的AUGraph),我可以很容易地获得输出和输入节点。因此,真正的问题是我是否可以将AVAudioNode连接到AUGraph,或者是否有其他方法可以将AVAudioNode转换为AUNode。

编辑:我试图用这样的简单设置来实现Dmitrii的建议,试图修改播放速度:

var engine: AVAudioEngine = AVAudioEngine()
var playback = AVAudioUnitVarispeed()

func connect(outputBus sourceOutputBusNumber: UInt32, ofNode sourceNode: AUNode, toInputBus destinationInputBusNumber: UInt32, ofNode destinationNode: AUNode, inGraph graph: AUGraph, error: NSError?) {
playback.rate = 0.5
engine.attach(playback)
// Connect
engine.connect(playback, to: engine.mainMixerNode, format: nil)
try! engine.start()
var playbackCD = playback.auAudioUnit.componentDescription
var avPlaybackNode = AUNode()
try! AUGraphAddNode(graph, &playbackCD, &avPlaybackNode).checkError(message: "Failed to add playback node")
//Conect source to the mixer input
AUGraphConnectNodeInput(graph, sourceNode, sourceOutputBusNumber, avPlaybackNode, 0)
//Connect mixer output to the device output
AUGraphConnectNodeInput(graph, avPlaybackNode, 0, destinationNode, destinationInputBusNumber)
}

但它对音频输出没有任何影响。尽管如此,它仍在通过。

在组合AUGraph和AVAudioEngine时,我是否应该遵循一些特定的生命周期?还是我忘记了一些重要的事情?

编辑2:所以我没有按照建议添加节点,我甚至不确定这是否可行。我有点运气,用kAudioUnitProperty_MakeConnection属性连接节点:

AUGraphNodeInfo(graph, destinationNode, nil, &destinationUnit)
var connection = AudioUnitConnection(sourceAudioUnit: destinationUnit, sourceOutputNumber: 0, destInputNumber: 0)
try! AudioUnitSetProperty(engine.outputNode.audioUnit!, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, &connection, UInt32(MemoryLayout<AudioUnitConnection>.size)).checkError(message: "Failed to make connection")
try! engine.start()

这将连接AVAudioEngine的输出节点和Spotify的输出。然而,如果我添加任何中间节点,它将无法播放任何内容。就好像AVAudioNodes根本无法连接一样:

engine.attach(varispeed)
engine.connect(varispeed, to: engine.mainMixerNode, format: nil)
var connection = AudioUnitConnection(sourceAudioUnit: destinationUnit, sourceOutputNumber: 0, destInputNumber: 0)
try! AudioUnitSetProperty(varispeed.audioUnit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, &connection, UInt32(MemoryLayout<AudioUnitConnection>.size)).checkError(message: "Failed to make connection")
try! engine.start()

知道为什么会发生这种事吗?我希望发动机输出单元连接到主混合器,主混合器连接到变速器,然后变速器连接到spotify的输出。如有任何帮助,我们将不胜感激。

非常感谢

托马斯

AVAudioNode具有实例属性AUAudioUnit。此外,您可以获得AudioComponentDescription

您可以将您的节点添加到图中,并获得AUNode:

AUGraphAddNode(graph,
yourAudioComponentDescription,
outAUNode);

编辑:首先,连接节点,然后启动引擎。在CAShow(graph)之后显示日志以检查图形。

相关内容

  • 没有找到相关文章

最新更新