我正在尝试连接到Spotify流并使用自定义合成器修改输出。使用真棒AudioKit会很棒。为了改变输出Spotify流,我必须实现这个method,这使我可以访问spotify的AUGraph。然后我可以添加AUNodes,它将连接到spotify图形的输入和输出(它非常好地描述了here)。
据我所知,AudioKit内部使用了CoreAudio,但我没有找到任何方法来访问AKNode的底层AUNode(如果有这样的话)。或者是否有另一种方法如何将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()
知道为什么会这样吗?我希望发动机输出单元连接到主混频器,主混频器连接到varispeed,然后连接到spotify的输出。任何帮助将不胜感激。
非常感谢
托马斯
答案 0 :(得分:1)
AVAudioNode包含实例属性AUAudioUnit。此外,您可以获得AudioComponentDescription
您可以将节点添加到图表并获取AUNode:
AUGraphAddNode(graph,
yourAudioComponentDescription,
outAUNode);
编辑:首先,连接节点,连接它们,然后启动引擎。在CAShow(graph)
之后显示您的日志以检查您的图表。