Toque na entrada do microfone usando o AVAudioEngine no Swift

Estou realmente empolgado com o novo AVAudioEngine. Parece um bom wrapper de API em torno da unidade de áudio. Infelizmente, a documentação é inexistente até agora, e estou tendo problemas para conseguir um gráfico simples para funcionar.

Usando o seguinte código simples para configurar um gráfico de mecanismo de áudio, o bloco de derivação nunca é chamado. Ele imita parte do código de amostra flutuando na Web, embora eles também não funcionem.

let inputNode = audioEngine.inputNode
var error: NSError?
let bus = 0

inputNode.installTapOnBus(bus, bufferSize: 2048, format: inputNode.inputFormatForBus(bus)) { 
    (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
    println("sfdljk")
}

audioEngine.prepare()
if audioEngine.startAndReturnError(&error) {
    println("started audio")
} else {
    if let engineStartError = error {
        println("error starting audio: \(engineStartError.localizedDescription)")
    }
}

Tudo o que estou procurando é o buffer pcm bruto para análise. Não preciso de nenhum efeito ou saída. De acordo com a palestra da WWDC "502 Audio Engine in Practice", essa configuração deve funcionar.

Agora, se você deseja capturar dados do nó de entrada, pode instalar um toque no nó e falamos sobre isso.

Mas o que é interessante nesse exemplo em particular é que, se eu quiser trabalhar apenas com o nó de entrada, digitar apenas capturar dados do microfone e talvez examiná-los, analisá-los em tempo real ou talvez gravá-los em arquivo, posso instalar diretamente um toque no nó de entrada.

E a torneira fará o trabalho de puxar o nó de entrada para dados, colocando-o em buffers e retornando-o de volta ao aplicativo.

Depois de ter esses dados, você pode fazer o que for necessário.

Aqui estão alguns links que eu tentei:

http://hondrouthoughts.blogspot.com/2014/09/avfoundation-audio-monitoring.htmlhttp://jamiebullock.com/post/89243252529/live-coding-audio-with-swift-playgrounds (SIGABRT no playground em startAndReturnError)

Edit: Esta é a implementação baseada na sugestão de Thorsten Karrer. Infelizmente, isso não funciona.

class AudioProcessor {
    let audioEngine = AVAudioEngine()

    init(){
        let inputNode = audioEngine.inputNode
        let bus = 0
        var error: NSError?

        inputNode.installTapOnBus(bus, bufferSize: 2048, format:inputNode.inputFormatForBus(bus)) {
            (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
                println("sfdljk")
        }

        audioEngine.prepare()
        audioEngine.startAndReturnError(nil)
        println("started audio")
    }
}