Как связать аудиолинию WAVE_MAPPER с ее аудиоустройством
Вопрос
Я разрабатываю приложение, которое, помимо прочего, перечисляет все входные аудиоустройства (используя SetupAPI
), а затем для каждого аудиоустройства выводятся все входные аудиолинии (с использованием winmm.dll
).
По сути, я связываю эти два способа: получаю путь к устройству от аудиоустройства, а затем использую waveInMessage
для сравнения пути устройства аудиолинии.
Теперь я хочу иметь возможность делать то же самое со звуковой линией Windows по умолчанию [вход] (WAVE_MAPPER
).
Проблема в том, что использование waveInGetDevCaps
для WAVE_MAPPER
возвращает «Microsoft Sound Mapper», и используя waveInMessage
с DRV_QUERYDEVICEINTERFACE
возвращает пустую строку.
Есть какие-нибудь предложения о том, как узнать, к какому устройству привязан Microsoft Mapper?
Решение 3
Пожалуйста, поправьте меня, если я ошибаюсь, но я смотрел несколько видео с прошлых конференций Microsoft по разработке звука.В последнем сообщении от Ларри Остермана он упоминает новые звуковые функции в Windows 7, над которыми работала его команда.
Одной из особенностей была [имя моя интерпретация] «горячая замена устройства».Допустим, ваше приложение воспроизводится с использованием конечной точки «воспроизведение звука по умолчанию в Windows», и в данный момент это набор USB-наушников.Внезапно вы отключаете наушники.До Windows 7 ваше приложение могло аварийно завершить работу [если вы не предусмотрели этот тестовый сценарий].В Windows 7 [и вот ссылка на исходную тему], ЕСЛИ вы используете устройство воспроизведения Windows по умолчанию, Windows корректно и автоматически переключит выходной поток на новое значение по умолчанию, которым могут быть динамики.
Я пытаюсь добиться того, чтобы поместить устройство WAVE_MAPPER в класс, где оно не должно быть.Возможно, концептуально говоря, WAVE_MAPPER, несмотря на одинаковые возможности ввода и вывода аудиопотока, следует рассматривать как исключение.
Я постараюсь быть более конкретным.В моем приложении есть список аудиоустройств, и каждое аудиоустройство имеет список аудиолиний.Аудиоустройства имеют такие свойства, как VID и PID, которые легко обнаруживаются через SetupAPI и могут быть связаны со звуковыми линиями с помощью waveInMessage 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, и он был довольно сломан, когда впервые был представлен...