AVAudioSourceNode在迅速的操场上不工作

问题描述 投票:0回答:1

我正在尝试使用最新版本中引入的新AVAudioSourceNode Apple运行简单的振荡器。该代码摘自Apple发布的示例代码available here

但是,每当我在Swift操场上运行此命令时,都会触发回调,但不会发出声音。当我将此代码移至iOS应用程序时,它可以正常工作。知道发生了什么事吗? AFAIK其他音频节点在Playgrounds中运行良好,因此我不确定为什么这个特定的音频节点失败。请参见下面的代码。使用Xcode 11和macOS 10.15运行。

import AVFoundation
import PlaygroundSupport

let audioEngine = AVAudioEngine()
let mainMixerNode = audioEngine.mainMixerNode
let outputNode = audioEngine.outputNode
let format = outputNode.inputFormat(forBus: 0)
let incrementAmount = 1.0 / Float(format.sampleRate)
var time: Float = 0.0

func sineWave(time: Float) -> Float {
    return sin(2.0 * Float.pi * 440.0 * time)
}

let sourceNode = AVAudioSourceNode { (_, _, frameCount, audioBufferList) -> OSStatus in
    let bufferListPointer = UnsafeMutableAudioBufferListPointer(audioBufferList)
    for frameIndex in 0..<Int(frameCount) {
        let sample = sineWave(time: time)

        time += incrementAmount

        for buffer in bufferListPointer {
            let buf: UnsafeMutableBufferPointer<Float> = UnsafeMutableBufferPointer(buffer)
            buf[frameIndex] = sample
        }
    }
    return noErr
}

audioEngine.attach(sourceNode)

audioEngine.connect(sourceNode, to: mainMixerNode, format: format)
audioEngine.connect(mainMixerNode, to: outputNode, format: nil)

mainMixerNode.outputVolume = 0.5

audioEngine.prepare()
do {
    try audioEngine.start()
} catch {
    print(error.localizedDescription)
}

PlaygroundPage.current.needsIndefiniteExecution = true
swift audio swift-playground avaudioengine
1个回答
0
投票

似乎Playground打印确实破坏了实时处理模块的性能。我遇到了同样的问题,然后将AVAudioSourceNode代码移到Sources文件夹中的另一个.swift文件中,如建议的here

© www.soinside.com 2019 - 2024. All rights reserved.