Как связать аудио линию 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, и он был довольно сломлен, когда впервые появился...