我在iOS 6.1.3 iPad2和新iPad上运行SIP音频流应用程序.
我在iPad上启动了我的应用程序(没有插入任何内容).
音频工作.
我插上耳机.
应用程序崩溃:malloc:对象0x的错误....:没有分配被释放的指针或EXC_BAD_ACCESS
或者:
我在iPad上启动了我的应用程序(耳机已插入).
音频来自耳机.
我拔下耳机.
应用程序崩溃:malloc:对象0x的错误....:没有分配被释放的指针或EXC_BAD_ACCESS
应用代码采用基于http://code.google.com/p/ios-coreaudio-example/示例代码的AudioUnit api (见下文).
我使用kAudioSessionProperty_AudioRouteChange回调来获得更改感知.因此,OS声音管理器有三个回调:
1)处理录制的麦克风样本
2)为扬声器提供样本
3)通知音频硬件存在
经过大量测试后,我的感觉是棘手的代码是执行麦克风捕获的代码.在插入/拔出动作之后,大多数时候在调用RouteChange之前调用记录回调几次导致以后的"分段错误"并且永远不会调用RouteChange回调.更具体地说,我认为AudioUnitRender函数会导致"内存不良访问",而根本不会抛出异常.
我的感觉是,非原子记录回调代码与OS声音设备相关结构的更新竞争.因此,非原子性的记录回调更可能是OS HW更新和记录回调的并发性.
我修改了我的代码以使录制回调尽可能地薄,但我的感觉是我的应用程序的其他线程带来的高处理负载正在为之前描述的并发竞争提供支持.因此,由于AudioUnitRender访问不良,代码的其他部分会出现malloc/free错误.
我试图通过以下方式减少录制回调延迟:
UInt32 numFrames = 256;
UInt32 dataSize = sizeof(numFrames);
AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_MaximumFramesPerSlice,
kAudioUnitScope_Global,
0,
&numFrames,
dataSize);
Run Code Online (Sandbox Code Playgroud)
我试图提出有问题的代码:
dispatch_async(dispatch_get_main_queue(), ^{
Run Code Online (Sandbox Code Playgroud)
有人有提示或解决方案吗?为了重现错误,这里是我的音频会话代码:
//
// IosAudioController.m
// Aruts
//
// Created by Simon Epskamp on 10/11/10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "IosAudioController.h"
#import <AudioToolbox/AudioToolbox.h>
#define kOutputBus 0
#define kInputBus 1
IosAudioController* …Run Code Online (Sandbox Code Playgroud)