WASAPI: IAudioClient-> Инициализация выполняется успешно, даже если IAudioClient-> IsFormatSupported завершается с ошибкой в том же формате

#windows #session #audio #wasapi

#Windows #сеанс #Аудио #wasapi

Вопрос:

Я пытаюсь выяснить, какие форматы вывода поддерживаются определенным аудиоустройством в эксклюзивном режиме. Для этого я использую IAudioClient-> IsFormatSupported() , который, согласно документации, должен использоваться для этого. К сожалению, он возвращает AUDCLNT_E_UNSUPPORTED_FORMAT почти для каждого формата, который я пытаюсь передать, за исключением 2-канального звука по умолчанию, 44,1 кГц.

Однако, если я действительно попытаюсь инициализировать audioclient, есть форматы, которые завершаются успешно, но которые не удалось выполнить в IsFormatSupported() .

Просто пытаться инициализировать каждый формат не вариант, потому что это может привести к остановке звука из других приложений.

Кто-нибудь еще видел это поведение или знает, есть ли другой способ определить, какие форматы поддерживаются конкретным аудиоустройством?

Ответ №1:

Я тоже видел такое поведение. Похоже, что IsFormatSupported будет принимать только то, что помечено как «поддерживаемое» в настройках устройства воспроизведения в Windows, но Initialize, похоже, фактически запрашивает драйверы, действительно ли это возможно.

В моей конкретной ситуации у меня есть настройка Xoxar HDAV1.3 для использования HDMI в качестве выхода. Всегда доступны два устройства воспроизведения: динамики и устройство передачи данных S / PDIF. Если я попытаюсь, например, запросить 6 каналов для устройства воспроизведения S / PDIF, IsFormatSupported отклонит его (теоретически, S / PDIF поддерживает только 2, и это все, что я вижу в настройках), но вызов Initialize завершится успешно и сработает (в конце концов, он отключается HDMI, для которого поддерживается 6 каналов). Поговорим о вводящих в заблуждение именах устройств!

Боюсь, что нет реального практического способа обойти эту проблему.