Почему я не могу установить общий уровень громкости для интерфейса USB / Firewire Audio с помощью IAudioEndpointVolume :: SetMasterVolumeLevelScalar - PullRequest
6 голосов
/ 06 декабря 2010

Я пытаюсь исправить ошибку Audacity, которая вращается вокруг portmixer.Уровень вывода / ввода устанавливается с помощью версии portmixer для Mac, но не всегда в окнах.Я отлаживаю код окна portmixer, чтобы попытаться заставить его работать там.

Использование IAudioEndpointVolume :: SetMasterVolumeLevelScalar для установки мастер-громкости прекрасно работает для встроенного звука, но с использованием внешних интерфейсов USB или FireWire, таких как RME Fireface 400,выходная громкость не изменится, хотя это отражается на панели управления звуком в Window для этого устройства, а также в системном микшере.

Кроме того, за пределами нашей программы изменяется главный ползунок для системного микшера (на панели задач) эффекта нет - звуковая карта выводит один и тот же (полный) уровень независимо от того, на каком уровне система говорит, что она находится.Единственный способ изменить уровень вывода - использовать пользовательское приложение, которое разработчики оборудования предоставляют вместе с картой.

Функция IAudioEndpointVolume :: QueryHardwareSupport возвращает ENDPOINT_HARDWARE_SUPPORT_VOLUME, поэтому она должна иметь возможность это делать.

Такое поведение существует как для ввода, так и для вывода на многих устройствах.

Возможно, это ошибка Windows?

Можно обойти это путем эмуляции (масштабирования) вывода, но этоне предпочтительнее, поскольку он не является функционально идентичным - лучше позволить аудиоинтерфейсу выполнять масштабирование (особенно для ввода, если он включает в себя предусилитель).

1 Ответ

0 голосов
/ 21 сентября 2011

Карты, о которых вы говорите, как и RME, просто не поддерживают настройку мастера или любого другого уровня с помощью программного обеспечения, и вы мало что можете с этим поделать. Это не ошибка Windows. Можно утверждать, что возвращение ENDPOINT_HARDWARE_SUPPORT_VOLUME является ошибкой, но, вероятно, это происходит на уровне драйвера, а не на самой Windows.

Единственное решение, которое я нашел до сих пор, - это подключить отладчик (или добавить dll-хук) к программному обеспечению, поставляемому поставщиком, и посмотреть на DeviceIOControl звонки, которые он выполняет (те, которые используются для связи с оборудованием), пока настройка громкости в программном обеспечении производителя. Довольно сложно сделать это для каждой отдельной карты, но, вероятно, стоит сделать это для пары профессиональных карт. Особенно для Audacity, для аудио-программ с открытым исходным кодом это на самом деле не так уж и плохо, поэтому я могу представить некоторых людей действительно счастливыми, если громкость на их карте может быть установлена ​​им. (в то время, когда мы использовали исключительно RME Multiface, я потратил довольно много времени на выяснение вызовов DeviceIOControl, но в итоге это определенно стоило, поскольку я мог установить громкость в дБ для любой точки матрицы)

...