2016-09-08 5 views
0

Я хочу увеличить коэффициент усиления виртуального аудио устройства. Громкость полностью повернута, но я едва слышу звук. Для этого я думаю, что мы должны посмотреть на выигрыш IOAudioLevelControl::createVolumeControl в IOAudioDevice. Это Soundflower кодУвеличение выходов аудиоустройства Gain

// 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); 

Мне кажется, что я должен изменить 5-й аргумент, который делает некоторые черной магии немного смещается, но так как я не знаю, как это работает и как изменить его. Спасибо

ответ

0

4-й и 5-й параметры - это minDB и maxDB, указанные как в целочисленном формате 16.16 с фиксированной точкой. Я думаю, что здесь дБ будет составлять дБ относительно цифровой полной шкалы - это означает, что 0 дБФС является максимальным, а мин - отрицательным. По крайней мере, ваши параметры, похоже, меняются на противоположные, а знак положительного значения ошибочен.

Черная магия, как вы ее называете, указывает значение в формате 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; 
+0

Все еще не работает. Я понятия не имею, что происходит. У меня есть приложение эквалайзера (его виртуальный драйвер c также основан на Soundflower), и у него нет проблем с громкостью звука. просматривая IORegistry, мне удалось найти значения «IOAudioLevelControls'maxDB и minDB, которые равны 0x488000 ((72 << 16) + (32768)) и 0 соответственно для контроля усиления. Для тома maxDB: 0 и minDB: 0xffb88000. Я попытался скопировать значения усиления и использовать его в драйвере, но все тот же ... – BsD

+0

btw Я использую SoundflowerBed для этого тестирования звука, возможно, ошибка в приложении – BsD

Смежные вопросы