Этот сбой может сбить с толку и может также не выводить сообщение об ошибке на консоль, если содержимое секвенсора еще не было загружено.Очень бесполезно!
AVAudioSequencer
действительно является причиной проблемы.Чтобы исправить это, сделайте секвенсор неявно развернутым необязательным (то есть добавьте !
к его типу) и добавьте явные инструкции, чтобы остановить и удалить его во время deinit
, до , остальная часть объекта деинициализирована.
Фиксированный код выглядит следующим образом (особенно обратите внимание на метод deinit
):
class TestAudioClass {
private var audioEngine: AVAudioEngine
private var sampler: AVAudioUnitSampler
private var sequencer: AVAudioSequencer!
init() {
self.audioEngine = AVAudioEngine()
self.sampler = AVAudioUnitSampler()
audioEngine.attach(sampler)
audioEngine.connect(sampler, to: audioEngine.mainMixerNode, format: nil)
self.sequencer = AVAudioSequencer(audioEngine: audioEngine)
if let fileURL = Bundle.main.url(forResource: "TestMusic", withExtension: "mid") {
do {
try sequencer.load(from: fileURL, options: AVMusicSequenceLoadOptions())
} catch {
print("Error loading sequencer: \(error.localizedDescription)")
}
}
sequencer.prepareToPlay()
}
deinit {
sequencer.stop()
sequencer = nil
}
}
Надеюсь, это поможет!