2012-01-23 115 views
2

我正尝试使用远程IO连接,并通过内置滤波器效果(仅适用于iOS 5)路由音频输入,然后退出硬件。我可以直接从输入路由到输出,但是我无法让过滤器工作。我不确定它是过滤器音频单元还是我错误的路由。在iOS5中使用滤波器音频单元效果

这一点只是我尝试设置过滤器和更改路由,以便数据由它处理。

任何帮助表示赞赏。

// ******* 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"); 

回答

7

有两件事情会在这里:

  • 你以后每隔会帮助自己很多,如果你做一个断言(或某种校验错误和日志吧)呼叫可以返回一个OSStatus。这样你就会知道你有多远。可能还希望在!= noErr时记录实际的OSStatus值,然后查看它(从Xcode文档查看器中的“Audio Unit Component Services Reference”开始)。
  • 创建过滤器AudioUnit后,我不明白你在做什么与AudioUnitSetProperty()调用。第二个参数应该是一个属性的名称(以kAudioUnitProperty开头的东西)。这几乎肯定会在那里返回一个错误。
  • remoteIOunit只有两条总线,它们有特殊的含义。总线1从麦克风输入,总线0输出到硬件。尝试连接到远程IO输入范围总线3可能会是另一个错误

建议您回滚到音频直通工作时。这意味着你只有remoteIO,并且从输出范围/总线1到输入范围/总线0的连接。

然后创建过滤器单元。改变你的连接,以便连接:

  • remoteIO输出范围总线进行过滤输入范围总线0
  • 滤波器输出范围总线0到remoteIO输入范围总线0

的另一件事,那将一个问题是,所有这些iOS 5过滤器似乎都想使用浮点LPCM格式,这不是其他单位默认使用的规范格式。您可能必须从过滤器单元(输入或输出范围可能是相同的?)获取流格式,然后将其设置为remoteIO输出范围/总线1产生的格式和remoteIO输入范围/总线0接受的格式。另一种选择是在滤波单元之前和之后引入AUConverter单元。

+0

“所有这些iOS 5的过滤器似乎是想用浮点LPCM格式” - 我想这为什么我的图表无法启动(使用'kAudioUnitErr_CannotDoInCurrentContext'),当我将其设置为mixer-> bandpass-> io时,但如果将带通滤波器更改为iOS 5之前的iPod EQualizer,则工作正常。 –

3

这里给出的第一个答案只是为我节省了很多挫折。 Apple文档没有告诉您,效果单元的文件格式需要浮点。我无法弄清楚为什么在我阅读这篇文章之前,它一直无法正常播放我的音频。我按照上面的建议从低通滤波器单元中检索了流格式,并用它来设置我创建的两个转换器单元(即,设置前置滤波器转换器的输出格式以及后置滤波器的输入格式一旦我这样做,并连接所有节点在一起,它开始按预期工作

+0

同意。苹果应该完全将音频单元文档更新到我们居住的iOS 5后世界! –

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:如果有人适当的音频单元文档知道请分享作为官方文档真是个缺乏