2 votes

AudioKit accès aux nœuds CoreAudio sous-jacents (intégration Spotify)

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

1voto

Dmitrii Points 60

AVAudioNode a une propriété d'instance AUAudioUnit. De plus, vous pouvez obtenir AudioComponentDescription

Vous pouvez ajouter votre nœud au graphe et obtenir AUNode:

AUGraphAddNode(graph,
               yourAudioComponentDescription,
               outAUNode);

EDIT: Tout d'abord, attachez les nœuds, connectez-les et ensuite démarrez le moteur. Affichez vos journaux après CAShow(graph) pour vérifier votre graphe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X