为什么我不能改变AU多通道混音器输入范围内的元素/总线数量?

时间:2013-10-06 21:09:56

标签: ios core-audio audiounit

更新 我正在更改我的代码,以更简化的方式说明问题。此外,我有一个小小的错误,虽然没有阻止这个问题,但确实增加了一些混乱。

我正在iOS中实例化多通道混音器AU(kAudioUnitSubType_MultiChannelMixer),我会执行以下操作:

OSStatus status = noErr;

//  Set component type:
AudioComponentDescription cd = {0};
cd.componentType = kAudioUnitType_Mixer;
cd.componentSubType = kAudioUnitSubType_MultiChannelMixer;
cd.componentManufacturer = kAudioUnitManufacturer_Apple;

//  Alloc unit:
AudioComponent defaultOutput = AudioComponentFindNext(NULL, &cd);
AudioUnit mixer;
status = AudioComponentInstanceNew(defaultOutput, &mixer);
NSLog(@"AU init status: %li", status);


//  You can try initializing the unit before or after the attempt to set its input bus count.
//  It doesn't matter; it won't work either way.
AudioUnitInitialize(mixer);

//  Get number of inputs
UInt32 busSize = sizeof(UInt32);
UInt32 busCount = 0;
status = AudioUnitGetProperty(mixer,
                              kAudioUnitProperty_ElementCount,
                              kAudioUnitScope_Input,
                              0,
                              &busCount,
                              &busSize);
NSLog(@"AU get input bus count | status: %li | count: %lu", status, busCount);


//  Try setting number of inputs
busCount = 3;
status = AudioUnitSetProperty(mixer,
                              kAudioUnitProperty_ElementCount,
                              kAudioUnitScope_Input,
                              0,
                              &busCount,
                              busSize);

NSLog(@"AU set input status: %li", status);

//  Get number of inputs
busCount = 0;
status = AudioUnitGetProperty(mixer,
                              kAudioUnitProperty_ElementCount,
                              kAudioUnitScope_Input,
                              0,
                              &busCount,
                              &busSize);

NSLog(@"AU get input bus count | status: %li | count: %lu", status, busCount);


//  Try setting number of inputs
busCount = 10;
status = AudioUnitSetProperty(mixer,
                              kAudioUnitProperty_ElementCount,
                              kAudioUnitScope_Input,
                              0,
                              &busCount,
                              busSize);

NSLog(@"AU set input status: %li", status);

//  Get number of inputs
busCount = 0;
status = AudioUnitGetProperty(mixer,
                              kAudioUnitProperty_ElementCount,
                              kAudioUnitScope_Input,
                              0,
                              &busCount,
                              &busSize);

NSLog(@"AU get input bus count | status: %li | count: %lu", status, busCount);

我得到以下输出:

2013-10-11 19:54:32.248 AUMultiChannelRadar[3996:a0b] AU init status: 0
2013-10-11 19:54:32.249 AUMultiChannelRadar[3996:a0b] AU get input bus count | status: 0 | count: 8
2013-10-11 19:54:32.250 AUMultiChannelRadar[3996:a0b] AU set input status: 0
2013-10-11 19:54:32.250 AUMultiChannelRadar[3996:a0b] AU get input bus count | status: 0 | count: 8
2013-10-11 19:54:32.250 AUMultiChannelRadar[3996:a0b] AU set input status: 0
2013-10-11 19:54:32.251 AUMultiChannelRadar[3996:a0b] AU get input bus count | status: 0 | count: 10

我希望默认情况下总线数不是8(因为音频单元文档没有说实例化时有默认值),我希望能够将输入元素的数量更改为对于这个问题,两者都少于8个(因为文档说它可以有“任意”数量的输入)。但是,从输出中,尝试将输入计数设置为小于8不会做任何事情;我只能将它设置为8以上。

2 个答案:

答案 0 :(得分:2)

我和一位Apple工程师谈过,他是CoreAudio团队的一员,向他展示了我的代码,他同意这肯定是一个错误。他甚至尝试了自己,并得到了与我相同的结果:默认情况下,该单元似乎被8个输入实例化,你只能将数字设置为8以上而不是更少(是的,我的代码最初显示2个输入因为我搞乱了8/4 - 谢谢)。

他告诉我提交雷达,所以我做了。 #15214291。

答案 1 :(得分:1)

我认为没有必要划分UInt32大小的元素数量。

UInt32 numElements = 0;
UInt32 size = sizeof(numElements);
AudioUnitGetProperty(_audioUnit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &numElements, &size);

因此,numElements将包含多个元素。