增加音频设备输出增益

时间:2016-09-08 15:57:26

标签: c++ macos audio kernel

我想增加虚拟音频设备的增益。音量一直在上升,但我几乎听不到音频。要做到这一点,我认为我们应该看看IOAudioDevice中的增益IOAudioLevelControl::createVolumeControl。这是Soundflower代码

 // Gain control for each channel
    control = IOAudioLevelControl::createVolumeControl(SoundflowerDevice::kGainMax,         // Initial value
                                                       0,                                   // min value
                                                       SoundflowerDevice::kGainMax,         // max value
                                                       0,                                   // min 0.0 in IOFixed
                                                       (40 << 16) + (32768),                // 72 in IOFixed (16.16)
                                                       channel,                             // kIOAudioControlChannelIDDefaultLeft,
                                                       channelNameMap[channel],             // kIOAudioControlChannelNameLeft,
                                                       channel,                             // control ID - driver-defined
                                                       kIOAudioControlUsageInput);
    addControl(control, (IOAudioControl::IntValueChangeHandler)gainChangeHandler);

在我看来,我应该改变第五个参数,它会做一些黑魔法位移,但我不确定这是如何工作的,以及如何改变它。感谢

1 个答案:

答案 0 :(得分:0)

第4和第5个参数是minDB和maxDB,以16.16定点格式的整数指定。我认为这里的dB是相对于数字满量程的dB - 意味着0 dBFS是最大值而min是负值。至少,您的参数似乎是相反的,正值的符号是错误的。

您所称的黑魔法是指定16.16定点格式的值。请参阅https://en.wikipedia.org/wiki/Q_(number_format)

将maxDB设置为40.5。 40来自40位进入整数部分,0.5来自32768.更直观的方法是使用以下方法:

将浮点值乘以2 ^ n,其中n是小数位数(xx.16),然后舍入结果。

int fixedPtVal = round(40.5 * (1<<16)); 

回到minDB和maxDB的选择问题。我真的找不到任何关于此的文档,但我认为你会想做类似的事情:

minDB = round(-40.5 * (1<<16));
maxDB = 0;