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

时间:2012-08-09 11:03:41

标签: iphone ios core-audio ipod bass

我还有一个与 BASS 相关的问题。我已经发布了这个问题 How Can we control bass of music in iPhone ,但没有像你应该得到的那么多关注你的人。但现在我已经做了一些搜索并阅读了 Core AUDIO 。我有一个示例代码,我想与您分享这里的人是下载 iPhoneMixerEqGraphTest 的链接。在这段代码中看一下我所看到的是开发人员使用Apple在iPod中给出的预设均衡器。让我们看一些代码片段:----

// iPodEQ unit
CAComponentDescription eq_desc(kAudioUnitType_Effect, kAudioUnitSubType_AUiPodEQ, kAudioUnitManufacturer_Apple);

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

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

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

enter image description here

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

感谢。

1 个答案:

答案 0 :(得分:4)

<强>更新

虽然在iOS标题中声明了它,但实际上iOS上并没有提供Low Shelf AU。


低架的参数与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
};

因此,在创建低架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 ...;
}