我正在尝试使用远程IO连接,并通过内置过滤器效果(仅限iOS 5)路由音频输入,然后退出硬件。我可以让它从输入直接路由到输出,但我无法让过滤器工作。我不确定它是滤波器音频单元还是我错误的路由。
这一位只是我尝试设置过滤器并更改路由以便数据处理。
感谢任何帮助。
// ******* BEGIN FILTER ********
NSLog(@"Begin filter");
// Creates Audio Component Description - Output Filter
AudioComponentDescription filterCompDesc;
filterCompDesc .componentType = kAudioUnitType_Effect;
filterCompDesc.componentSubType = kAudioUnitSubType_LowPassFilter;
filterCompDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
filterCompDesc.componentFlags = 1;
filterCompDesc.componentFlagsMask = 1;
// Create Filter Unit
AudioUnit lpFilterUnit;
AudioComponent filterComponent = AudioComponentFindNext(NULL, &filterCompDesc);
setupErr = AudioComponentInstanceNew(filterComponent, &lpFilterUnit);
NSAssert(setupErr == noErr, @"No instance of filter");
AudioUnitElement bus2 = 2;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Output, bus2, &oneFlag, sizeof(oneFlag));
AudioUnitElement bus3 = 3;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Input, bus3, &oneFlag, sizeof(oneFlag));
// ******** END FILTER ******** //
AudioUnitConnection hardInToLP;
hardInToLP.sourceAudioUnit = remoteIOunit;
hardInToLP.sourceOutputNumber = 1;
hardInToLP.destInputNumber = 3;
setupErr = AudioUnitSetProperty (
remoteIOunit, // connection destination
kAudioUnitProperty_MakeConnection, // property key
kAudioUnitScope_Input, // destination scope
bus3, // destination element
&hardInToLP, // connection definition
sizeof (hardInToLP)
);
AudioUnitConnection LPToHardOut;
LPToHardOut.sourceAudioUnit = lpFilterUnit;
LPToHardOut.sourceOutputNumber = 1;
LPToHardOut.destInputNumber = 3;
setupErr = AudioUnitSetProperty (
remoteIOunit, // connection destination
kAudioUnitProperty_MakeConnection, // property key
kAudioUnitScope_Input, // destination scope
bus3, // destination element
&hardInToLP, // connection definition
sizeof (hardInToLP)
);
/*
// Sets up the Audio Units Connection - new instance called connection
AudioUnitConnection connection;
// Connect Audio Input's out to Audio Out's in
connection.sourceAudioUnit = remoteIOunit;
connection.sourceOutputNumber = bus1;
connection.destInputNumber = bus0;
setupErr = AudioUnitSetProperty(remoteIOunit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, bus0, &connection, sizeof(connection));
*/
NSAssert(setupErr == noErr, @"No RIO connection");
答案 0 :(得分:8)
这里发生了几件事:
建议您在进行音频传递工作时回滚。这意味着你只有remoteIO,以及从输出范围/总线1到输入范围/总线0的连接。
然后创建过滤器单元。更改连接,以便连接:
另一个问题是所有这些iOS 5过滤器似乎都想使用浮点LPCM格式,这不是其他单位默认的规范格式。您可能必须从过滤器单元获取流格式(输入或输出范围可能相同?)然后将其设置为remoteIO输出范围/总线1生成且remoteIO输入范围/总线0接受的格式。另一种选择是在滤波器单元之前和之后引入AUConverter单元。
答案 1 :(得分:3)
这里给出的第一个答案让我更加沮丧。 Apple文档没有告诉您效果单元的文件格式需要浮点数。在我读完这篇文章之前,我无法弄清楚为什么它一直无法正常播放我的音频。我按照上面的建议从低通滤波器单元检索了流格式,并用它来设置我创建的两个转换器单元(即设置预滤波器转换器的输出格式,以及后置滤波器的输入格式)一旦我这样做并将所有节点连接在一起,它就开始按预期工作了。
答案 2 :(得分:0)
即时尝试使用低通过滤器,当尝试按照建议进行操作时也设置格式我不断收到错误“操作无法完成”此代码中的错误是什么? 检索lowpassUnit后,我也检查错误但没有。
result = AudioUnitSetProperty(lowpassUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &stereoStreamFormat, sizeof (stereoStreamFormat));
if (noErr != result)
{
NSLog(@"%@", [NSError errorWithDomain:NSOSStatusErrorDomain code:result userInfo:nil]);
return;
}
PS:如果有人知道正确的音频单元文档,请分享,因为官方文档确实缺乏