Je m'efforce de me connecter en streaming à Spotify et de modifier la sortie avec un synthétiseur personnalisé. Ce serait génial d'utiliser l'incroyable AudioKit. Afin de modifier la sortie du flux Spotify, je dois implémenter cette méthode, qui me donne accès au AUGraph de Spotify. Je peux alors ajouter des AUNodes qui seront connectés à l'entrée et à la sortie du graphique de Spotify (c'est très bien décrit ici).
Je comprends qu'AudioKit utilise CoreAudio en interne mais je n'ai pas trouvé de moyen d'accéder aux AUNodes sous-jacents pour les AKNodes (s'il y en a). Ou s'il existe une autre manière de connecter un AKNode AudioKit à un AUGraph existant.
Maintenant je vois qu'AudioKit utilise AVAudioEngine (au lieu de AUGraph qui était utilisé dans EZAudio) et je peux facilement obtenir les nodes de sortie et d'entrée. Donc la vraie question est de savoir si je peux connecter un AVAudioNode au AUGraph ou s'il y a une autre manière de convertir un AVAudioNode en AUNode.
MODIFICATION : J'ai essayé d'implémenter la suggestion de Dmitrii avec une configuration simple comme ceci, en essayant de modifier la vitesse de lecture :
var moteur: AVAudioEngine = AVAudioEngine()
var lecture = AVAudioUnitVarispeed()
func connect(outputBus sourceOutputBusNumber: UInt32, ofNode sourceNode: AUNode, toInputBus destinationInputBusNumber: UInt32, ofNode destinationNode: AUNode, inGraph graph: AUGraph, error: NSError?) {
lecture.rate = 0.5
moteur.attach(lecture)
// Connect
moteur.connect(lecture, to: moteur.mainMixerNode, format: nil)
try! moteur.start()
var playbackCD = lecture.auAudioUnit.componentDescription
var avPlaybackNode = AUNode()
try! AUGraphAddNode(graph, &playbackCD, &avPlaybackNode).checkError(message: "Failed to add playback node")
//Connecter la source à l'entrée du mixeur
AUGraphConnectNodeInput(graph, sourceNode, sourceOutputBusNumber, avPlaybackNode, 0)
//Connecter la sortie du mixeur à la sortie du dispositif
AUGraphConnectNodeInput(graph, avPlaybackNode, 0, destinationNode, destinationInputBusNumber)
}
Mais cela n'a aucun effet sur la sortie audio. Elle continue à passer à travers comme avant.
Y a-t-il un cycle de vie spécifique à suivre lors de la combinaison d'un AUGraph et de l'AVAudioEngine? Ou est-ce que j'oublie quelque chose d'important?
MODIFICATION 2 : Je n'ai pas eu de chance en ajoutant le node comme cela a été suggéré, je ne suis même pas sûr que cela puisse fonctionner. J'ai eu un peu plus de chance en connectant les nodes avec la propriété 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.size)).checkError(message: "Failed to make connection")
try! moteur.start()
Cela connectera le node de sortie de l'AVAudioEngine à la sortie de Spotify. Cependant, si j'ajoute des nodes intermédiaires, cela échoue à jouer quoi que ce soit. On dirait que les AVAudioNodes ne sont pas connectés du tout :
moteur.attach(varispeed)
moteur.connect(varispeed, to: moteur.mainMixerNode, format: nil)
var connection = AudioUnitConnection(sourceAudioUnit: destinationUnit, sourceOutputNumber: 0, destInputNumber: 0)
try! AudioUnitSetProperty(varispeed.audioUnit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, &connection, UInt32(MemoryLayout.size)).checkError(message: "Failed to make connection")
try! moteur.start()
Avez-vous une idée de pourquoi cela se produit? Je m'attendrais à ce que l'unité de sortie du moteur soit connectée au mixer principal qui est connecté au varispeed qui est ensuite connecté à la sortie de Spotify. Toute aide serait grandement appréciée.
Un grand merci
Tomas