AVAudioSourceNode 在快速游乐场中不起作用

Posted

技术标签:

【中文标题】AVAudioSourceNode 在快速游乐场中不起作用【英文标题】:AVAudioSourceNode not working in swift playgrounds 【发布时间】:2019-10-29 09:50:14 【问题描述】:

我正在尝试使用最新版本中引入的新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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于AVAudioSourceNode 在快速游乐场中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 游乐场中使用 MapKit 显示地图以快速查看?

让视图总是填满快速的游乐场时间线?

循环缓冲区的填充速度快于 AVAudioSourceNode 渲染块可以从中读取数据

html 使用ES2015即时在浏览器中进行快速反应原型设计。使用它作为游乐场的样板,并在某些服务器上上传html文件。

快速游乐场找不到任何类型

javascript 伪古典继承的快速游乐场