После настройки двигателя для воспроизведения файлов мое приложение необъяснимо сбои с помощью Exc_reakpoint с Code = 1. Обычно это означает, что я развергаю значение NIL, но я думаю, что я правильно обращаюсь с опциональными заявлениями. Я определил его на вызов InstallTAP. Я удалил функцию Processaudiobuffer, и мой код по -прежнему сбивается так же, так что это не так. Устройство, на котором я тестирую это, - это запуск iOS 26 Beta 3, хотя мое приложение предназначено для iOS 18 и выше. < /P>
Вот функция настройки: < /p>
Код: Выделить всё
private func setupAudioEngine() {
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print("Audio session error: \(error)")
}
engine = AVAudioEngine()
guard let engine else { return }
_ = engine.mainMixerNode
}
< /code>
Вот функция воспроизведения: < /p>
func play(_ mediaItem: MPMediaItem) {
guard let url = mediaItem.assetURL else {
print("No asset URL for media item")
return
}
player = AVAudioPlayerNode()
guard let engine,
let player else { return }
do {
audioFile = try AVAudioFile(forReading: url)
guard let audioFile else {
print("Failed to create audio file")
return
}
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: audioFile.processingFormat)
duration = Double(audioFile.length) / audioFile.fileFormat.sampleRate
engine.prepare()
if !engine.isRunning {
try engine.start()
}
player.scheduleFile(audioFile, at: nil)
DispatchQueue.main.async { [weak self] in
self?.isPlaying = true
self?.startDisplayLink()
}
} catch {
print("Error playing audio: \(error)")
DispatchQueue.main.async { [weak self] in
self?.isPlaying = false
self?.stopDisplayLink()
}
}
engine.mainMixerNode.installTap(onBus: 0, bufferSize: 1024, format: engine.mainMixerNode.outputFormat(forBus: 0)) { [weak self] buffer, _ in
self?.processAudioBuffer(buffer)
}
player.play()
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... mixer-node
Мобильная версия