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

Sam*_*ent 2 signal-processing objective-c core-audio audiounit ios

我正在尝试使用远程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");
Run Code Online (Sandbox Code Playgroud)

inv*_*ame 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单元.