核心audioSwift Equalizer一次调整所有频段?

我无法在Swift中设置kAudioUnitSubType_NBandEQ。 这里是我的初始化EQ的代码:

var cd:AudioComponentDescription = AudioComponentDescription(componentType: OSType(kAudioUnitType_Effect),componentSubType: OSType(kAudioUnitSubType_NBandEQ),componentManufacturer: OSType(kAudioUnitManufacturer_Apple),componentFlags: 0,componentFlagsMask: 0) // Add the node to the graph status = AUGraphAddNode(graph, &cd, &MyAppNode) println(status) // Once the graph has been opened get an instance of the equalizer status = AUGraphNodeInfo(graph, self.MyAppNode, nil, &MyAppUnit) println(status) var eqFrequencies: [UInt32] = [ 32, 250, 500, 1000, 2000, 16000 ] status = AudioUnitSetProperty( self.MyAppUnit, AudioUnitPropertyID(kAUNBandEQProperty_NumberOfBands), AudioUnitScope(kAudioUnitScope_Global), 0, eqFrequencies, UInt32(eqFrequencies.count*sizeof(UInt32)) ) println(status) status = AudioUnitInitialize(self.MyAppUnit) println(status) var ioUnitOutputElement:AudioUnitElement = 0 var samplerOutputElement:AudioUnitElement = 0 AUGraphConnectNodeInput(graph, sourceNode, sourceOutputBusNumber, self.MyAppNode, 0) AUGraphConnectNodeInput(graph, self.MyAppNode, 0, destinationNode, destinationInputBusNumber) 

然后申请更改频率增益我的代码如下:

 if (MyAppUnit == nil) {return} else{ var bandValue0 :Float32 = tenBands.objectAtIndex(0) as! Float32 var bandValue1 :Float32 = tenBands.objectAtIndex(1) as! Float32 var bandValue2 :Float32 = tenBands.objectAtIndex(2) as! Float32 var bandValue3 :Float32 = tenBands.objectAtIndex(3) as! Float32 var bandValue4 :Float32 = tenBands.objectAtIndex(4) as! Float32 var bandValue5 :Float32 = tenBands.objectAtIndex(5) as! Float32 AudioUnitSetParameter(self.MyAppUnit, 0, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue0, 0); AudioUnitSetParameter(self.MyAppUnit, 1, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue1, 0); AudioUnitSetParameter(self.MyAppUnit, 2, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue2, 0); AudioUnitSetParameter(self.MyAppUnit, 3, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue3, 0); AudioUnitSetParameter(self.MyAppUnit, 4, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue4, 0); AudioUnitSetParameter(self.MyAppUnit, 5, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue5, 0); } 

任何人都可以指出我在这里做错了吗? 我认为它与AudioUnitSetParameter中的第二个variables有关。 我已经尝试了AudioUnitParameterID(0)和AudioUnitParameterID(kAUNBandEQParam_Gain + 1)这个值,但这些似乎并没有工作。 任何帮助表示赞赏!

添加评论作为回答,因为评论是不够的。

以下代码在Objective-c中,但它应该有助于识别您的问题。

有很多地方可能会失败。 首先,你应该检查AudioUnitSetParameter的状态,实际上所有的AudioUnit Calls都会给你一个更清晰的代码失败的地方。

我已经在Objective-C中成功地完成了这个任务,并且有一个testing应用程序,如果你需要的话,它可以显示完整的graphics设置,并通过移动一个滑块来设置波段和增益…回到你的具体问题。 下面的工作对我来说很好,这可能会帮助你排除一个特定的部分。

您可以尝试获取当前的“增益”,这将表明您的频段是否设置正确。

  - (AudioUnitParameterValue)gainForBandAtPosition:(uint)bandPosition { AudioUnitParameterValue gain; AudioUnitParameterID parameterID = kAUNBandEQParam_Gain + bandPosition; OSStatus status = AudioUnitGetParameter(equalizerUnit, parameterID, kAudioUnitScope_Global, 0, &gain); if (status != noErr) { @throw [NSException exceptionWithName:@"gettingParamGainErrorException" reason:[NSString stringWithFormat:@"OSStatus Error on getting EQ Gain! Status returned %d).", (int)status] userInfo:nil]; } return gain; } 

那么设置增益可以按照以下方式完成。

  - (void)setGain:(AudioUnitParameterValue)gain forBandAtPosition:(uint)bandPosition { AudioUnitParameterID parameterID = kAUNBandEQParam_Gain + bandPosition; OSStatus status = AudioUnitSetParameter(equalizerUnit, parameterID, kAudioUnitScope_Global, 0, gain, 0); if (status != noErr) { @throw [NSException exceptionWithName:@"settingParamGainAudioErrorException" reason:[NSString stringWithFormat:@"OSStatus Error on setting EQ gain! Status returned %d).", (int)status] userInfo:nil]; } } 

最后,你要设置什么值,有效范围(如果我没有弄错)是-125.0到25.0

Interesting Posts