Как связать аудио линию WAVE_MAPPER с ее аудиоустройством

Я разрабатываю приложение, которое, помимо прочего, перечисляет все входные аудиоустройства (используя SetupAPI), а затем для каждого аудиоустройства перечисляет все входные аудио строки (используя winmm.dll).

По сути, я связываю эти два способа: получить путь устройства от аудиоустройства, а затем использовать waveInMessage сравнить путь устройства звуковой линии.

Теперь я хочу сделать то же самое со звуковой линией Windows [default] (по умолчанию) (WAVE_MAPPER).

Проблема в том, что с помощью waveInGetDevCaps за WAVE_MAPPER возвращает "Microsoft Sound Mapper", и используя waveInMessage с DRV_QUERYDEVICEINTERFACE возвращает пустую строку.

Любые предложения о том, как узнать, на какое устройство подключается Microsoft Mapper?

3 ответа

Решение

Пожалуйста, поправьте меня, если я ошибаюсь, но я смотрел несколько видео с прошлых конференций Microsoft по разработке звука. На последнем из них от Ларри Остермана он упоминает о новых звуковых возможностях в Windows 7, над которыми работала его команда.

Одной из особенностей была [такова моя интерпретация] "горячая замена устройства". Допустим, ваше приложение воспроизводит с использованием конечной точки "Windows Default Sound Play Play", и на данный момент это набор наушников USB. Внезапно вы отключите наушники. До Windows 7 ваше приложение зависало [если вы не предвидели этот тестовый сценарий]. В Windows 7 [и здесь описывается исходная тема], ЕСЛИ вы используете устройство воспроизведения Windows по умолчанию, Windows изящно и автоматически переключит выходной поток на новое значение по умолчанию, которым могут быть динамики.

Я пытаюсь добраться до устройства WAVE_MAPPER в классе, где его не должно быть. Может быть, концептуально говоря, WAVE_MAPPER, несмотря на то, что он имеет одинаковую возможность ввода и вывода аудиопотока, должен рассматриваться как исключение.

Я постараюсь быть более конкретным. В моем приложении у меня есть список аудиоустройств, и у каждого аудиоустройства есть список аудио линий. Аудиоустройства имеют такие свойства, как VID и PID, которые легко обнаруживаются через SetupAPI и могут быть связаны с аудио линиями через winInMessage winmm. WAVE_MAPPER не следует этой логике, и я пытался сделать это.

Поэтому вместо того, чтобы пытаться связать WAVE_MAPPER с его базовым аудиоустройством, я просто буду относиться к нему как к таковому: аудиоустройству по умолчанию.

Устройство, на которое отображается WAVE_MAPPER, зависит от параметров, переданных в waveInOpen. Из документации:

WAVE_MAPPER - Функция выбирает устройство ввода аудио-сигнала, способное записывать в указанном формате.

Это означает, что вы не можете проверить свойства устройства, не открывая его. Как только вы откроете его, вы сможете получить фактический идентификатор устройства с waveInGetID,

Ну, с одной стороны, я обнаружил, что DirectSound намного проще и с гораздо меньшим количеством недокументированных странностей XP и Vista (и вообще гораздо меньшим количеством недокументированных странностей).

Но, вероятно, единственный способ, с помощью которого вы это решите, - это перечислить все другие устройства и посмотреть, какое из них соответствует WAVE_MAPPER.

Хотя, честно говоря... используйте DirectSound или, если вы можете использовать только Vista и Win 7, используйте Core Audio API. Winmm - это древний API, и он был довольно сломлен, когда впервые появился...

Другие вопросы по тегам