如何使用kAudioUnitType_Effect的kAudioUnitSubType_LowShelfFilter来控制核心音频中的低音?

Nik*_*sal 8 iphone ipod core-audio bass ios

我还有一个与BASS有关的问题.我已经发布了这个问题我们如何在iPhone中控制音乐的低音,但是没有得到你应该得到的那么多人的关注.但现在我已经做了一些搜索并阅读了Core AUDIO.我有一个示例代码,我想与你分享这里的人是下载iPhoneMixerEqGraphTest的链接.在这段代码中看一下我所看到的是开发人员使用Apple在iPod中给出的预置均衡器.让我们看一些代码片段:----

// iPodEQ unit
CAComponentDescription eq_desc(kAudioUnitType_Effect, kAudioUnitSubType_AUiPodEQ, kAudioUnitManufacturer_Apple);
Run Code Online (Sandbox Code Playgroud)

kAudioUnitSubType_AUiPodEQ的作用是从iPod的均衡器中获取预设值并在Xcode中返回我们可以在PickerView/TableView中使用的数组,并且可以设置任何类别,如贝斯,摇滚,舞蹈等.这对我来说无能为力,因为它只返回名称均衡器类型,如低音,摇滚,舞蹈等,因为我只想实现低音,并希望在UISLider上实现它.

要在滑块上实现低音,我需要值,以便我可以设置最小值和最大值,以便可以更改移动滑块上的低音.

完成所有这些后,我开始阅读Core Audio的音频单元框架的类,并得到了这个 Ipod Desc图像 之后我开始寻找低音控制并得到了这个

在此输入图像描述

所以现在我需要实现这个kAudioUnitSubType_LowShelfFilter.但现在我不知道如何在我的代码中实现这个枚举,以便我可以控制低音作为书面文档.即便是Apple也没有写过我们如何使用它.kAudioUnitSubType_AUiPodEQ此类别返回一个数组,但kAudioUnitSubType_LowShelfFilter类没有返回任何数组.在使用kAudioUnitSubType_AUiPodEQ此类别时,我们可以使用数组中的均衡器类型,但我们如何使用此类别kAudioUnitSubType_LowShelfFilter.任何人都能以任何方式帮助我吗?这将是非常值得赞赏的.

谢谢.

jus*_*tin 4

更新

尽管 Low Shelf AU 在 iOS 标头中声明,但实际上在 iOS 上并不可用。


Low Shelf 的参数与 iPod EQ 不同。

参数在“AudioUnit/AudioUnitParameters.h”中声明和记录:

// Parameters for the AULowShelfFilter unit
enum {
  // Global, Hz, 10->200, 80
  kAULowShelfParam_CutoffFrequency = 0,

  // Global, dB, -40->40, 0
  kAULowShelfParam_Gain = 1
};
Run Code Online (Sandbox Code Playgroud)

因此,在创建低架 AU 后,请使用 配置其参数AudioUnitSetParameter

您可以尝试的一些初始参数值是 120 Hz (kAULowShelfParam_CutoffFrequency) 和 +6 dB (kAULowShelfParam_Gain)——假设您的系统能够很好地再现低音,那么您的低频内容应该是原来的两倍。


你能告诉我如何使用这个 kAULowShelfParam_CutoffFrequency 来改变频率吗?

如果一切配置正确,这应该就是所需要的:

assert(lowShelfAU);
const float frequencyInHz = 120.0f;
OSStatus result = AudioUnitSetParameter(lowShelfAU,
                                        kAULowShelfParam_CutoffFrequency,
                                        kAudioUnitScope_Global,
                                        0,
                                        frequencyInHz,
                                        0);
if (noErr != result) {
  assert(0 && "error!");
  return ...;
}
Run Code Online (Sandbox Code Playgroud)