AudioKit SynthOne падает после возвращения из фона - PullRequest
2 голосов
/ 19 сентября 2019

Мы используем версию 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.

1 Ответ

2 голосов
/ 20 сентября 2019

Эм ... да ... а как насчет .stopEngine() и .startEngine() ...?момент rtfm, конечно.

Для тех, кто может столкнуться с подобной проблемой, они используют AudioKit.engine.pause() и AudioKit.engine.start(), а не stop().

...