如何使用kAudioUnitSubType_LowShelfFilter的kAULowShelfPa

2019-07-31 02:23发布

你必须通过这个来我这个问题之前已经走了。 如何使用kAudioUnitType_Effect的kAudioUnitSubType_LowShelfFilter控制低音核心音频? 慢慢地和稳步获得弄好音乐的低音控制。 但尚未得到成功的我的目标。 现在我才知道,我必须改变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了。 我只是写我的code.have当前的代码片段看看所做的更改: -

// 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 ;
}
}

此代码现在,我使用,但这并不改变频率。 它甚至停止播放音乐,并给予在此行的代码excess_bad错误..

 AudioUnitSetParameter(lowShelfAU,kAULowShelfParam_CutoffFrequency,kAudioUnitScope_Global,0,frequencyInHz,0);

请人帮助我对此,告诉我怎样才能改变kAULowShelfParam_CutoffFrequency,这样我可以调节音乐的低音通过滑块。 任何有关这帮助将是非常可观的。

谢谢 :)

Answer 1:

之前,你可以使用一个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是指针类型,以便不用初始化它指向存储器的未知区域。 我认为这是一种编程最佳实践总是初始化变量在声明时,捕获这些类型的bug:

AudioUnit lowShelfAU = nullptr;


Answer 2:

`AudioUnit lowShelfAU;` <-- that is an uninitialized garbage value

实际上你需要创建一个AU实例(低架),并将其添加到AUGraph。

注:编译器/分析仪将确定这个问题为您服务。 我建议人们把警告级别waaaay起来,然后建立,分析,并删除所有的问题。 重复,直到干净。



Answer 3:

`你知道,苹果创建根据其用途3个音频单元。 remoteIO - >为输入和输出;混合器 - >用于音频混频器;对于一些音频效果是当量和过滤器,从而,如果u想截止音频,u需要创建一个过滤器单元,并将它们连接在一起。



文章来源: How to use kAULowShelfParam_CutoffFrequency parameter of kAudioUnitSubType_LowShelfFilter which controls bass in Core Audio?