AvaudioEngine: точка остановки выполнения при установке нажатия на основной узел микшераIOS

Программируем под IOS
Ответить
Anonymous
 AvaudioEngine: точка остановки выполнения при установке нажатия на основной узел микшера

Сообщение Anonymous »

Я работаю над приложением Audio Visualizer, которое воспроизводит файлы из музыкальной библиотеки пользователя с использованием MediaPlayer и AvaudioEngine. Я работаю над тем, чтобы получить функциональность музыкальной библиотеки, работающую перед аспектом Visualizer.
После настройки двигателя для воспроизведения файлов мое приложение необъяснимо сбои с помощью 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()
}
Вот ссылка на мой проект MRE, если вы хотите попробовать сами: https://github.com/aabagdi/visualman-example

Подробнее здесь: https://stackoverflow.com/questions/797 ... mixer-node
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»