2

Spotify 스트림에 연결하고 사용자 지정 합성기를 사용하여 출력을 수정하려고합니다. 굉장한 AudioKit을 사용하는 것이 좋을 것입니다. 출력 Spotify 스트림을 변경하려면이 method을 구현해야하는데, 이는 spotify의 AUGraph에 대한 액세스를 제공합니다. 그런 다음 spotify의 그래프의 입력과 출력에 연결될 AUNode를 추가 할 수 있습니다 (매우 잘 설명 된 것은 here입니다).기본 CoreAudio 노드에 대한 AudioKit 액세스 (Spotify 통합)

AudioKit은 CoreAudio를 내부적으로 사용하지만 AKNode의 기본 AUNode에 액세스하는 방법을 찾지 못했습니다. 또는 기존 AUGraph에 AudioKit AKNode를 연결하는 다른 방법이 있는지 여부.

이제 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을 결합 할 때 따라야 할 특정 라이프 사이클이 있습니까? 아니면 중요한 것을 잊어 버렸습니까?

EDIT 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의 출력 노드를 연결합니다. 그러나 중간 노드를 추가하면 아무것도 재생되지 않습니다. 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

다시 수정되었습니다. 감사합니다. –