Мы используем версию AK SynthOne «без скинов» в нашем приложении (т. Е. Просто движок с набором пресетов) и наблюдаем постоянный сбой при возвращении из фона.Чтобы сэкономить батарею пользователя, когда последовательность не воспроизводится, если пользователь переходит в фоновый режим, мы вызываем AudioKit.stop()
.Это позволяет использовать процессор до нуля (счастливые клиенты!), Но при возврате мы видим постоянный сбой, когда SynthOne пытается обработать свое первое примечание:
void S1NoteState::startNoteHelper(int noteNumber, int velocity, float frequency) {
oscmorph1->freq = frequency; // <-- EXC_BAD_ACCESS here!
oscmorph2->freq = frequency;
subOsc->freq = frequency;
fmOsc->freq = frequency;
...
Обратный след:
* thread #13, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
* frame #0: 0x0000000100fc5d78 Spliqs`S1NoteState::startNoteHelper(this=0x0000000108345500, noteNumber=56, velocity=54, frequency=207.652328) at S1NoteState.mm:105:21
frame #1: 0x0000000100fd6764 Spliqs`S1DSPKernel::turnOnKey(this=0x00000001088a3790, noteNumber=56, velocity=54, frequency=207.652328) at S1DSPKernel+toggleKeys.mm:85:14
frame #2: 0x0000000100fcabd0 Spliqs`S1DSPKernel::startNote(this=0x00000001088a3790, noteNumber=56, velocity=54, frequency=207.652328) at S1DSPKernel+startStopNotes.mm:45:9
frame #3: 0x0000000100fc1298 Spliqs`::-[S1AudioUnit startNote:velocity:frequency:](self=0x00000001088a3600, _cmd="startNote:velocity:frequency:", note='8', velocity='6', frequency=207.652328) at S1AudioUnit.mm:98:13
frame #4: 0x00000001014cf86c Spliqs`AKSynthOne.play(noteNumber=56, velocity=54, frequency=207.65233610331066, channel=0, self=0x0000000280de4a00) at AKSynthOne.swift:223:21
frame #5: 0x00000001016dbda4 Spliqs`AudioKit.AKPolyphonicNode.play(noteNumber: Swift.UInt8, velocity: Swift.UInt8, channel: Swift.UInt8) -> () + 328
frame #6: 0x000000010135a120 Spliqs`Conductor.handleMIDI(data1=146, data2=56, data3=54, self=0x000000010820efe0) at Conductor.swift:392:23
frame #7: 0x00000001013597a4 Spliqs`Conductor.handle(event=AudioKit.AKMIDIEvent @ 0x000000016f488ba0, self=0x000000010820efe0) at Conductor.swift:374:26
frame #8: 0x0000000101358de4 Spliqs`closure #1 in Conductor.setUpMIDIHandler(packetList=0x000000016f489e98, _0=nil, self=0x000000010820efe0) at Conductor.swift:326:30
frame #9: 0x0000000101157f48 Spliqs`thunk for @escaping @callee_guaranteed (@unowned UnsafePointer<MIDIPacketList>, @unowned UnsafeMutableRawPointer?) -> () at <compiler-generated>:0
frame #10: 0x00000001d42467b8 CoreMIDI`LocalMIDIReceiverList::HandleMIDIIn(unsigned int, unsigned int, void*, MIDIPacketList const*) + 164
frame #11: 0x00000001d4246618 CoreMIDI`MIDIProcess::RunMIDIInThread() + 132
frame #12: 0x00000001d425d1e8 CoreMIDI`XThread::RunHelper(void*) + 28
frame #13: 0x00000001d4262624 CoreMIDI`CAPThread::Entry(CAPThread*) + 92
frame #14: 0x00000001c3eef908 libsystem_pthread.dylib`_pthread_body + 132
frame #15: 0x00000001c3eef864 libsystem_pthread.dylib`_pthread_start + 48
frame #16: 0x00000001c3ef7dcc libsystem_pthread.dylib`thread_start + 4
Мы перепробовали все, начиная от запуска AudioKit и заканчивая полной повторной инициализацией SynthOne, но это всегда одно и то же.
Мы застряли на этом некоторое время, поэтому любые мысли очень ценятся.
ОБНОВЛЕНИЕ: На самом деле, я боюсь, что мне нужно реанимировать этот вопрос.Хотя подход .pause()
в моем ответе ниже работал для перехода в / из фона, у нас также есть вариант использования, когда мы переходим в автономный режим рендеринга для экспорта аудио.Этот процесс определенно действительно требует от нас остановки двигателя (для переключения режимов), и мы получаем тот же сбой, связанный с SynthOne, при обработке первого события после AudioKit.start()
.Кто-нибудь понимает, почему мы вернулись EXC_BAD_ACCESS
при возвращении?Я предполагаю, что память была каким-то образом неправильно перераспределена / восстановлена (?), Но как я могу предотвратить это?Я полагаю, в более широком смысле, вопрос будет заключаться в следующем: как безопасно запустить / остановить движок AudioKit при использовании SynthOne.