【问题标题】:How to use kAULowShelfParam_CutoffFrequency parameter of kAudioUnitSubType_LowShelfFilter which controls bass in Core Audio?如何使用 kAudioUnitSubType_LowShelfFilter 的 kAULowShelfParam_CutoffFrequency 参数来控制 Core Audio 中的低音?
【发布时间】:2013-09-11 15:38:48
【问题描述】:

在回答我的这个问题之前,您一定已经经历过这个问题。How to use kAudioUnitSubType_LowShelfFilter of kAudioUnitType_Effect which controls bass in core Audio? 缓慢而稳定地为音乐的低音控制做好准备。但还没有达到我的目标。现在我知道我必须改变 kAULowShelfParam_CutoffFrequency 来改变 bass

我在 5 到 7 天之前使用的以下代码。此代码可以正确播放音乐,但不能正确更改低音。看看这段代码 sn-p:-

 - (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);
}

现在在这段代码之后我知道我必须改变频率来改变低音,然后我使用下面的代码 sn-p 但是在下面的代码中 sn-p 音乐没有播放并且它给出了 excess_bad 也是。我只是在写我对代码所做的更改。看看当前代码 sn-p:-

// 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 以便我可以通过滑块调整音乐的低音。任何有关这方面的帮助都将不胜感激。

谢谢:)

【问题讨论】:

    标签: iphone objective-c ios core-audio bass


    【解决方案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;
    

    用未确定的值初始化lowShelfAUAudioUnit 是一种指针类型,因此无需初始化,它就指向未知的内存区域。我认为始终在声明变量时对其进行初始化以捕获这些类型的错误是一种编程最佳实践:

    AudioUnit lowShelfAU = nullptr;
    

    【讨论】:

    • 你还有什么问题?
    • 我不明白你在问什么,抱歉。你是什​​么意思“如何实现”代码?
    • 我在问如何在我的代码中执行你上面写的代码?
    • 我不知道您的代码是什么样的 - 您在问题中发布的代码不能是您正在使用的代码,因为没有 AUGraph。
    • 好的,但你能告诉我低音使用的是哪个频率吗?现在我也得到了角频率和中心频率
    【解决方案2】:
    `AudioUnit lowShelfAU;` <-- that is an uninitialized garbage value
    

    您需要实际创建一个 AU 实例(Low Shelf)并将其添加到 AUGraph。

    注意:编译器/分析器将为您识别此问题。我建议人们将警告级别调高,然后构建、分析和删除所有问题。重复直到干净。

    【讨论】:

    • 我需要将AUnode设为lowShelfAU,之后是否需要添加AUGraph?
    【解决方案3】:

    `如你所知,苹果根据其用途创建了 3 个音频单元。 remoteIO --> 用于输入和输出;mixer --> 用于混音器;对于某些音频效果是 eq 和 Filter 所以,如果您想切断音频频率,您需要创建一个过滤器单元并将它们连接在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-05
      • 2012-03-24
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2015-12-12
      相关资源
      最近更新 更多