2

我試圖連接到Spotify流並使用自定義合成器修改輸出。這將是很好的使用真棒AudioKit。爲了改變輸出Spotify流,我必須實現這個method,它使我能夠訪問spotify的AUGraph。然後,我可以添加將連接到spotify圖形的輸入和輸出的AUNodes(它非常好地描述爲here)。AudioKit訪問底層CoreAudio節點(Spotify集成)

據我所知,AudioKit在內部使用CoreAudio,但我還沒有找到任何方式如何訪問底層AUNodes的AKNodes(如果有這樣的事情)。或者是否有另一種方法來將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的輸出。任何幫助將不勝感激。

非常感謝

托馬斯

回答

1

AVAudioNode有實例的屬性AUAudioUnit。此外,您還可以得到AudioComponentDescription

您可以添加節點,以圖形的方式得到AUNode:

AUGraphAddNode(graph, 
       yourAudioComponentDescription, 
       outAUNode); 

編輯:一是高度的節點,將它們連接起來,並且開始後發動機。在CAShow(graph)之後顯示您的日誌以檢查您的圖表。

+0

感謝您的建議,我編輯了這個問題。 –

+0

再次編輯,謝謝。 –