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

StackOverflow https://stackoverflow.com/questions/1883518

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top