在iOS5中使用滤波器音频单元效果

时间:2012-01-23 21:41:48

标签: objective-c ios signal-processing core-audio audiounit

我正在尝试使用远程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");

3 个答案:

答案 0 :(得分:8)

这里发生了几件事:

  • 如果你在每次可以返回OSStatus的调用之后执行断言(或某种类型的check-error-and-log-it),你会自己帮助很多。这样你就可以知道你得到了多远。可能还想记录实际的OSStatus值,当它是!= noErr,然后查找它(从Xcode文档查看器中的“Audio Unit Component Services Reference”开始)。
  • 在创建过滤器AudioUnit后,我无法获得您正在使用的AudioUnitSetProperty()调用。第二个参数应该是属性的名称(以kAudioUnitProperty开头的东西......)。那几乎肯定会在那里回复错误。
  • remoteIOunit只有两条总线,它们有特殊含义。总线1从麦克风输入,总线0输出到硬件。尝试连接到远程io输入范围总线3可能会是另一个错误

建议您在进行音频传递工作时回滚。这意味着你只有remoteIO,以及从输出范围/总线1到输入范围/总线0的连接。

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

  • remoteIO输出范围总线1,用于过滤输入范围总线0
  • 过滤输出范围总线0到remoteIO输入范围总线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:如果有人知道正确的音频单元文档,请分享,因为官方文档确实缺乏