ios - iOS 14.2 中引入的 AudioToolback 崩溃

标签 ios swift ios14 audiounit audiotoolbox

我在 iOS 14.2 引入的应用程序中遇到了非常一致的崩溃。我们正在使用 Crashlytics 来跟踪崩溃,并且可以确认这些新崩溃中 100% 发生在 14.2 及更高版本上。我还能够在 14.2 和 14.3 的当前第二个测试版上重新创建

我无法在 14.1 上重新创建它。此外,这些功能已经存在了很长一段时间,并且在最近几个 iOS 主要/次要版本中没有对这些功能本身进行任何更改。

具体错误是:

error: memory read failed for 0x0:

com.apple.audio.toolbox.AUScheduledParameterRefresher (20): EXC_BAD_ACCESS (code=1, address=0x0)

崩溃的要点:

• 我在我们的应用程序中有一个播放/记录机制。这可以是播放单个音轨或一次播放多个音轨。

• 只有当我在音轨上启用了音频效果(即混响、压缩等)时才会发生这种情况。我正在使用 AVAudioUnitEffect 库在正在播放的轨道上实现音频效果。

• 当用户操纵效果器的设置(即音量或增益)然后尝试在之后执行其他操作时,就会发生这种情况。

我找不到有关 AUScheduledParameterRefresher 的任何文档。我还扩展了我在 XCode 中的搜索范围,以包括整个 14.2 SDK,但其中也没有对它的引用。

基于 EXC_BAD_ACCESS 错误,我的猜测是进程的某些部分从内存中释放,当代码去改变音频效果的设置时,它不再存在。我打开 Zombies 以 try catch Instruments 中任何已释放的对象,但它没有打开任何东西。

我还下载了 iOS 14.1 SDK 并对音频框架(AudioToolbox、AVFoundation 等)进行了比较,看看是否有任何重大变化,但它并没有出现,所以它可能比甚至更低的水平这些库。


我们创建了一个最小的应用程序并将其发布到 GitHub 以显示问题: https://github.com/audiobridge/iOSCrashDemo

这被精简为仅构建效果和参数,当您点击初始化它的按钮时应用程序崩溃。

使用该应用程序似乎可以推断问题出在 AVAudioUnitEQ 上。如果您将其从链中删除,错误/崩溃就会消失。在函数已经破坏了效果之后,似乎有些东西被安排在“ future ”引用 AVAudioUnitEQ,因为它不再需要了。


我无法更深入地了解这个问题。任何帮助将不胜感激。谢谢!

作为引用,这里是 Crashlytics 在发生崩溃的线程上的堆栈跟踪:

Crashed: com.apple.audio.toolbox.AUScheduledParameterRefresher
EXC_BAD_ACCESS KERN_PROTECTION_FAILURE 0x00000001dd778040

0   ??? 0x1dd778040 (Missing)
1   AudioToolboxCore 0x196846638 AudioUnitGetParameter + 52
2   AudioToolboxCore 0x1967d8200 43-[AUAudioUnitV2Bridge _createParameterTree]_block_invoke.125 + 112
3   AudioToolboxCore 0x196788284 -[AUParameter _internalValue] + 252
4   AudioToolboxCore 0x19678ba28 20-[AUParameter value]_block_invoke + 32
5   libdispatch.dylib 0x186bce280 _dispatch_client_callout + 16
6   libdispatch.dylib 0x186bb10ec _dispatch_lane_barrier_sync_invoke_and_complete + 56
7   AudioToolboxCore 0x196788408 -[AUParameter value] + 244
8   AudioToolboxCore 0x1967daea0 parameterNodesEqual(AUParameterNode*, AUParameterNode*, std::1::vector<unsigned long long, std::1::allocator<unsigned long long> >&) + 1180
9   AudioToolboxCore 0x1967dac94 parameterNodesEqual(AUParameterNode*, AUParameterNode*, std::1::vector<unsigned long long, std::1::allocator<unsigned long long> >&) + 656
10 AudioToolboxCore 0x1967dac94 parameterNodesEqual(AUParameterNode*, AUParameterNode*, std::1::vector<unsigned long long, std::1::allocator<unsigned long long> >&) + 656
11 AudioToolboxCore 0x1967da9dc invocation function for block in void applesauce::dispatch::v1::sync_impl<-[AUAudioUnitV2Bridge _buildNewParameterTree]::$_0>(NSObject<OS_dispatch_queue>*, -[AUAudioUnitV2Bridge _buildNewParameterTree]::$_0&&, std::1::integral_constant<bool, true>) + 104
12 libdispatch.dylib 0x186bce280 _dispatch_client_callout + 16
13 libdispatch.dylib 0x186bb10ec _dispatch_lane_barrier_sync_invoke_and_complete + 56
14 AudioToolboxCore 0x1967d4034 -[AUAudioUnitV2Bridge _buildNewParameterTree] + 140
15 AudioToolboxCore 0x1967d4238 -[AUAudioUnitV2Bridge _invalidateParameterTree:] + 124
16 AudioToolboxCore 0x1967da820 caulk::concurrent::details::message_call<ParameterListPropertyListener(void*, OpaqueAudioComponentInstance*, unsigned int, unsigned int, unsigned int)::$_5>::perform() + 52
17 AudioToolboxCore 0x1967da7bc caulk::concurrent::details::rt_message_call<ParameterListPropertyListener(void*, OpaqueAudioComponentInstance*, unsigned int, unsigned int, unsigned int)::$_5>::perform() + 24
18 caulk 0x1c89c2280 caulk::concurrent::details::messenger_servicer::check_dequeue() + 104
19 caulk 0x1c89c1f34 caulk::concurrent::details::worker_thread::run() + 56
20 caulk 0x1c89c20bc void* caulk::thread_proxy<std::1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*> > >(void*) + 56
21 libsystem_pthread.dylib 0x1cd5a0b3c _pthread_start + 288
22 libsystem_pthread.dylib 0x1cd5a5880 thread_start + 8

最佳答案

根据您的示例代码项目,可以通过将 eqEffect 的定义移至类属性来防止崩溃……

class ViewController: UIViewController {

    let eqEffect = AVAudioUnitEQ(numberOfBands: 3)

...并更新所有引用 createEffects 以指向该点。例如……

let lowFilterParams = self.eqEffect.bands[0]

然而,虽然这会防止崩溃(这大概是由于 AVAudioUnitEQ 在配置它的方法完成时被释放)我不确定这是否会导致你的行为期待您的实际 应用程序,因为我不知道 AVAudioUnitEQ 是否有可能在它仍在使用时发布。 (它作为示例代码中 View Controller 的一个属性存在意味着它将始终可用。)

关于ios - iOS 14.2 中引入的 AudioToolback 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65137157/

相关文章:

ios - 如何在 iOS 14 上仅获取具有授予访问权限的 Assets ?

ios - CGPathRef 和 PDF

javascript - 无法读取未定义的属性 'messageHandlers'

swift - swift中 "??"是什么意思?

ios - @Observable 模型更改未反射(reflect)在 View 中

ios - 使用 Alamofire 删除附加在 URL 末尾的 ?=

ios - 禁用长按返回按钮(标注菜单)

ios - Swift - 应用程序跟踪透明度 - 由于 ‘Allow Apps to Request to Track’ 变灰而没有显示弹出窗口

iphone - 异步文档中的图像

ios - 将左右边距添加到 Grouped UITableView ios 8