Я пытаюсь запустить простой осциллятор, используя новый AVAudioSourceNode Apple, представленный в последней версии. Код является выдержкой из примера кода, опубликованного Apple, доступного здесь.

Однако всякий раз, когда я запускаю это на игровой площадке Swift, обратный вызов запускается, но звук не издается. Когда я перемещаю этот код в приложение для iOS, он отлично работает. Есть идеи, что происходит? Насколько я знаю, другие аудиоузлы хорошо работают на игровых площадках, поэтому я не уверен, почему этот конкретный узел не работает. См. код ниже. Запуск с использованием 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
0
nevos 29 Окт 2019 в 12:50

1 ответ

Кажется, что печать Playground действительно портит производительность блоков обработки в реальном времени. У меня была та же проблема, и затем я переместил код AVAudioSourceNode в другой файл .swift в папке «Источники», как было предложено здесь

0
papadoo1 18 Май 2020 в 01:34