音序器停止时AKMIDISampler崩溃

时间:2018-09-26 00:14:42

标签: audiokit audiotoolbox coremidi

停止音序器时,我的应用程序间歇性崩溃。我的应用程序使用了一个基于AudioToolbox的自定义MusicSequencer,并以AKMIDISampler作为其midiEndpoint。我已将崩溃跟踪到AKMIDISampler的func handle(event: AKMIDIEvent)得到空事件(即event.internalData.count == 0)。因为采样器是“硬连线的”,可以说,作为端点,我真的不确定如何调试它,因为我看不到序列尝试发送的内容(或者为什么它显然发送了空事件)。

我可以通过入侵自己的AK构建来使其运行,在其中我进行健全性检查event.internalData.count。但是,我项目(https://stackoverflow.com/a/49950129/4321521)中的另一个问题迫使我使用CocoaPods的AudioKit,这消除了我的修复(或更确切地说,是hack)...

我已经记录了将事件添加到序列中的所有函数,但它们似乎都没有发送空数据。

我想知道的一种可能的解释;我最近注意到,启用AddressSanitizer会在创建用户事件时指示堆栈缓冲区溢出。我承认我对如何在Swift中创建可变长度事件完全迷惑不解。尽管该结构具有event.length > 4属性,但我似乎无法“合法”地使用length创建任何事件。例如,这段代码:

let eventDataBytes = ByteBackpacker.pack(event) // convert to [UInt8]
var midiData = MusicEventUserData()
midiData.length = UInt32(MemoryLayout<Event>.size)
withUnsafeMutablePointer(to: &midiData.data, { pointer in
    for i in 0 ..< eventDataBytes.count {
        print("Can write byte \(i)...")
        pointer[i] = eventDataBytes[i]
    }
})

i == 4时给了我一个堆栈缓冲区溢出错误。由于我的活动具有Float64 duration属性,因此这显然不起作用...

因此,我想通过添加这些溢出的用户事件不可避免地在我的序列中包含垃圾数据。我只是不知道这将如何导致event.internalData.count == 0,或者为什么我对event.internalData的健全性检查会“修复”它(即,运行没有问题)。

回溯:

* thread #10, stop reason = EXC_BREAKPOINT (code=1, subcode=0x100bc677c)
    frame #0: 0x0000000100bc677c Spliqs`partial apply for closure #1 in     AKMIDISampler.enableMIDI(_:name:) [inlined] generic specialization <Swift.UInt8> of Swift.Array._getElement(Swift.Int, wasNativeTypeChecked: Swift.Bool, matchingSubscriptCheck: Swift._DependenceToken) -> A at AKMIDISampler.swift:0 [opt]
frame #1: 0x0000000100bc677c Spliqs`partial apply for closure #1 in AKMIDISampler.enableMIDI(_:name:) [inlined] generic specialization <Swift.UInt8> of Swift.Array.subscript.getter : (Swift.Int) -> A at AKMIDISampler.swift:0 [opt]
frame #2: 0x0000000100bc677c Spliqs`partial apply for closure #1 in AKMIDISampler.enableMIDI(_:name:) [inlined] AudioKit.AKMIDISampler.(event=AudioKit.AKMIDIEvent @ 0x00007f94f2693800)(event: AudioKit.AKMIDIEvent) throws -> () at AKMIDISampler.swift:60 [opt]
* frame #3: 0x0000000100bc677c Spliqs`partial apply for closure #1 in AKMIDISampler.enableMIDI(_:name:) at AKMIDISampler.swift:48 [opt]
frame #4: 0x0000000100bc677c Spliqs`partial apply for closure #1 in AKMIDISampler.enableMIDI(_:name:) at AKMIDISampler.swift:0 [opt]
frame #5: 0x0000000100bc4bb8 Spliqs`thunk for @escaping @callee_guaranteed (@unowned UnsafePointer<MIDIPacketList>, @unowned UnsafeMutableRawPointer?) -> () at AKMIDISampler.swift:0 [opt]
frame #6: 0x0000000194f6d7ac CoreMIDI`LocalMIDIReceiverList::HandleMIDIIn(unsigned int, unsigned int, void*, MIDIPacketList const*) + 156
frame #7: 0x0000000194f6d608 CoreMIDI`MIDIProcess::RunMIDIInThread() + 124
frame #8: 0x0000000194f81640 CoreMIDI`XThread::RunHelper(void*) + 20
frame #9: 0x0000000194f85698 CoreMIDI`CAPThread::Entry(CAPThread*) + 88
frame #10: 0x0000000184c25220 libsystem_pthread.dylib`_pthread_body + 272
frame #11: 0x0000000184c25110 libsystem_pthread.dylib`_pthread_start + 292
frame #12: 0x0000000184c23b10 libsystem_pthread.dylib`thread_start +

0 个答案:

没有答案