在回答我的这个问题之前,你必须经历过这个问题。How to use kAudioUnitSubType_LowShelfFilter of kAudioUnitType_Effect which controls bass in core Audio?慢慢地&稳定地掌握音乐的低音控制。但是我的目标却没有成功。现在我知道我必须改变 kAULowShelfParam_CutoffFrequency 来改变低音。
以下代码我在5到7天之前使用。此代码正常播放音乐,但不能正确改变低音。看看这段代码: -
- (void)awakeFromNib
{
printf("AUGraphController awakeFromNib\n");
mIsPlaying = false;
// clear the mSoundBuffer struct
memset(&mUserData.soundBuffer, 0, sizeof(mUserData.soundBuffer));
// create the URLs we'll use for source A and B
NSString *sourceA = [[NSBundle mainBundle] pathForResource:@"04 - Second Hand Jawaani - [rKmania.com]" ofType:@"mp3"];
NSString *sourceB = [[NSBundle mainBundle] pathForResource:@"Track2" ofType:@"mp4"];
sourceURL[0] = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)sourceA, kCFURLPOSIXPathStyle, false);
sourceURL[1] = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)sourceB, kCFURLPOSIXPathStyle, false);
[bassSlider addTarget:self action:@selector(selectEQPreset) forControlEvents:UIControlEventValueChanged];
}
// output unit
CAComponentDescription output_desc(kAudioUnitType_Output, kAudioUnitSubType_RemoteIO, kAudioUnitManufacturer_Apple);
// iPodEQ unit
CAComponentDescription eq_desc(kAudioUnitType_Effect, kAudioUnitSubType_AUiPodEQ, kAudioUnitManufacturer_Apple);
// multichannel mixer unit
CAComponentDescription mixer_desc(kAudioUnitType_Mixer, kAudioUnitSubType_MultiChannelMixer, kAudioUnitManufacturer_Apple);
printf("add nodes\n");
- (void)selectEQPreset;
{
AUPreset *aPreset = (AUPreset*)CFArrayGetValueAtIndex(mEQPresetsArray, value);
OSStatus result = AudioUnitSetProperty(mEQ, kAudioUnitProperty_PresentPreset, kAudioUnitScope_Global, 0, aPreset, sizeof(AUPreset));
if (result) { printf("AudioUnitSetProperty result %ld %08X %4.4s\n", result, (unsigned int)result, (char*)&result); return; };
printf("SET EQ PRESET %d ", value);
CFShow(aPreset->presetName);
}
现在在这段代码之后我知道我必须改变频率来改变低音,然后我使用下面的代码片段,但是在下面的代码片段音乐没有播放,它给出了 excess_bad 太。我只是写了我对代码所做的更改。看看当前的代码片段: -
// iPodEQ unit
CAComponentDescription eq_desc(kAudioUnitType_Effect, kAudioUnitSubType_LowShelfFilter, kAudioUnitManufacturer_Apple);
- (void)selectEQPreset;
{
AudioUnit lowShelfAU;
assert(lowShelfAU);
float frequencyInHz = 120.0f;
frequencyInHz = bassSlider.value;
OSStatus result = AudioUnitSetParameter(lowShelfAU,kAULowShelfParam_CutoffFrequency,kAudioUnitScope_Global,0,frequencyInHz,0);
if (noErr != result)
{
assert(0 && "error!");
return ;
}
}
此代码现在我正在使用,但这并没有改变频率。它甚至停止播放音乐并在这行代码中给出了overs_bad错误..
AudioUnitSetParameter(lowShelfAU,kAULowShelfParam_CutoffFrequency,kAudioUnitScope_Global,0,frequencyInHz,0);
请有人帮我解决这个问题告诉我如何更改kAULowShelfParam_CutoffFrequency以便我可以通过滑块调整音乐的低音。对此有任何帮助都是非常值得赞赏的。
谢谢:)
答案 0 :(得分:0)
`AudioUnit lowShelfAU;` <-- that is an uninitialized garbage value
你需要实际创建一个AU实例(低架)并将其添加到AUGraph。
注意:编译器/分析器会为您识别此问题。我建议人们将警告级别调高,然后构建,分析和删除所有问题。重复直到清洁。
答案 1 :(得分:0)
在使用AudioUnit
之前,您需要创建它。如果您使用AUGraph
,您的代码将类似于:
AudioComponentDescription filterDescription = { kAudioUnitType_Effect, kAudioUnitSubType_LowShelfFilter, kAudioUnitSubType_LowShelfFilter, 0, 0 };
AUNode filterNode = -1;
OSStatus result = AUGraphAddNode(mAUGraph, &filterDescription, &filterNode);
if(noErr != result) {
// Handle error
}
AudioUnit filterUnit = nullptr;
result = AUGraphNodeInfo(mAUGraph, filterNode, nullptr, &filterUnit);
if(noErr != result) {
// Handle error
}
// Set parameters on filterUnit
您的代码失败的原因是该行
AudioUnit lowShelfAU;
使用未确定的值初始化lowShelfAU
。 AudioUnit
是指针类型,因此在没有初始化的情况下,它指向未知的内存区域。我认为在声明变量时始终初始化变量是一种编程最佳实践,以捕获这些类型的错误:
AudioUnit lowShelfAU = nullptr;
答案 2 :(得分:0)
`如你所知,苹果根据其目的创造3个音频单元。 remoteIO - &gt;用于输入和输出;混合器 - &gt;对于音频混音器;对于某些音频效果是eq和Filter,所以,如果你想切断音频频率,你需要创建一个滤波器单元并将它们连接在一起。