我想增加虚拟音频设备的增益。音量一直在上升,但我几乎听不到音频。要做到这一点,我认为我们应该看看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);
在我看来,我应该改变第五个参数,它会做一些黑魔法位移,但我不确定这是如何工作的,以及如何改变它。感谢
答案 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;