连接节点上的AVAudioEngine崩溃

连接节点上的AVAudioEngine崩溃,audio,core-audio,audiounit,avaudioengine,Audio,Core Audio,Audiounit,Avaudioengine,我已经用自己的方法设置了AVAudioEngine,如下所示: AVAudioSession*会话=[AVAudioSession sharedInstance]; [session setPreferredSampleRate:[session sampleRate]错误:nil]; [会话集类别:AvaudioSessionCategoryPlaybackwithOptions:AVAudioSessionCategoryOptionMixWithOthers错误:nil]; [会话设置活

我已经用自己的方法设置了AVAudioEngine,如下所示:

AVAudioSession*会话=[AVAudioSession sharedInstance];
[session setPreferredSampleRate:[session sampleRate]错误:nil];
[会话集类别:AvaudioSessionCategoryPlaybackwithOptions:AVAudioSessionCategoryOptionMixWithOthers错误:nil];
[会话设置活动:是错误:无];
音频引擎\=[[AVAudioEngine alloc]init];
//点击outputNode以创建单例
[音频引擎输出节点];
n错误*错误;
[音频引擎启动和返回错误:&错误];
启动它没有错误。我有另一种方法,可以根据我从应用程序间音频乐器收到的AudioComponentDescription连接AVAudioUnitMIDIInstrument。我的连接方法如下所示:

-(void)连接工具:(音频组件描述)描述{
instNode_u2;=零;
instNode_U9=[[AVAudioUnitMIDIInstrument alloc]initWithAudioComponentDescription:desc];
[音频引擎附件:instNode];
//在这里撞车
[audioEngine\uuConnect:instNode\uuTo:[audioEngine\uuuOutputNode]格式:nil];
[音频引擎启动和返回错误:无];
NSLog(@“完成连接”);
}
这次撞车没有给我提供任何有用的信息。我明白了:

为CFRunLoopRunSpecific-break提供的模式“kCFRunLoopCommonModes”无效,请在\u CFRunLoopError\u RunCalledWithInvalidMode上进行调试。此消息每次执行仅显示一次

*由于未捕获异常“NSRangeException”而终止应用程序,原因:'*-[\uu NSArrayM objectAtIndexedSubscript:]:索引0超出空数组的界限'

如果我做了一个测试并尝试创建一个新的混合器节点并连接它,就不会发生崩溃

我有更多相关信息
如果我这样做:

AVAudioFormat*instFormat=[instUnit\uUuOutputFormatForBus:0];
我得到了同样的错误:
-[\uu NSArrayM objectAtIndexedSubscript:]:索引0超出空数组的界限

这几乎就像没有任何输出总线的AVAudioFormat集合,也没有任何输入总线(我也检查了inputFormatForBus)。这很奇怪,因为如果我这样做:

AudioStreamBasicDescription f1;
UInt32超大=尺寸(f1);
AudioUnitGetProperty(instNode_U2;.audioUnit、kAudioUnitProperty_StreamFormat、kAudioUnitScope_Output、0、&f1、&outsize);
f1是一个有效的AudioStreamBasicD描述,显示标准44.1khz采样率、32位浮点、2个通道。因此有一个输出流格式,但它似乎没有连接到AVAudioUnitMIDIInstrument实例的任何输出总线。

编辑-更多信息 即使我只是尝试访问instune_uu2;name,也会出现nsrange异常。我现在想知道这是否是我如何获得组件描述的问题。我正在尝试使用应用程序间音频(我已经完成了所有适当的权限、功能和应用程序ID设置)。这就是我发现应用程序间音频组件的方式:

NSMutableArray*单位=[[NSMutableArray alloc]init];
AudioComponentDescription searchDesc={kaudiounitype_RemoteInstrument,0,0,0};
NSArray*componentArray=[[AVAudioUnitComponentManager共享DaudionUnitComponentManager]组件匹配说明:searchDesc];
用于(组件阵列中的AVAudioUnitComponent*组件){
AudioComponentDescription=组件。AudioComponentDescription;
InterAppAudioUnit*单位=[[InterAppAudioUnit alloc]init];
unit.componentDescription=说明;
unit.icon=AudioComponentGetIcon(component.audioComponent,44.0f);
unit.name=component.name;
unit.avComponent=组件;
[单位添加对象:单位];
}
_单位=单位;
[self.tableView重载数据];
这一切都在一个呈现的UITableViewController中。单击一个后,我只需执行:

[自连接仪表:单元.部件说明];

如果我为一个本地单元手工构建一个组件描述,那么AVAudioUnit的实例化很好,没有崩溃。

我找到了答案。AVAudioUnit对象内部的AUAudioUnit对象在创建时没有输出总线。我不知道为什么。您可以通过执行以下操作来修复它:

auauaudiounit*auInst=instUnit\uu.auauaudiounit;
NSMutableArray*busArray=[[NSMutableArray alloc]init];
AVAudioFormat*outFormat=[[self->audioEngine\uuuOutputNode]outputFormatForBus:0];
AUAudioUnitBus*总线=[[AUAudioUnitBus alloc]initWithFormat:outFormat error:&err];
[总线对象:总线];
[[auInst outputBusses]替换总线:总线阵列];

我找到了答案。AVAudioUnit对象内部的AUAudioUnit对象在创建时没有输出总线。我不知道为什么。您可以通过执行以下操作来修复它:

auauaudiounit*auInst=instUnit\uu.auauaudiounit;
NSMutableArray*busArray=[[NSMutableArray alloc]init];
AVAudioFormat*outFormat=[[self->audioEngine\uuuOutputNode]outputFormatForBus:0];
AUAudioUnitBus*总线=[[AUAudioUnitBus alloc]initWithFormat:outFormat error:&err];
[总线对象:总线];
[[auInst outputBusses]替换总线:总线阵列];

它不是零。我检查过了。什么是
instUnit
?对不起,应该更清楚一点,它是AvaudioUnitMidInstrument类型的成员变量*它不是零。我检查过了。什么是
instUnit
?对不起,应该更清楚一点,它是AvaudioUnit类型的成员变量*