Можно ли связать одно и то же аудиоустройство в разных API?

Я использую winmm api для работы со звуком. Я использую waveInGetDeviceCaps и waveInMessage для однозначной идентификации «звуковой линии». Все работает нормально, за исключением того, что в Vista имя устройства ограничено 32 символами структурой WaveInCaps.

Чтобы обойти это, я предполагаю использовать основной api, когда версия ОС> = Vista. Я использую IMMDeviceEnumerator.GetDevice и IMMDeviceEnumerator.EnumAudioEndpoints для сбора информации о звуковых линиях, но я не уверен, как определить, что одно устройство под основным api относится к одной записи под api waveXx.

Думаю, я мог бы сравнить путь к устройству обоих, но это противоречило бы рекомендации MS рассматривать строку пути к устройству как «непрозрачную».

Что бы вы сказали?


person Padu Merloti    schedule 18.12.2009    source источник
comment
Я думаю, что еще один способ помочь ответить на мой вопрос: учитывая экземпляр IMMDevice, как мне узнать, какой индекс строки (например, тот, который я могу использовать в качестве аргумента для waveInOpen) связан с этой строкой?   -  person Padu Merloti    schedule 18.12.2009


Ответы (1)


Этот сценарий описан в http://msdn.microsoft.com/en-us/library/dd370819(VS.85).aspx.

person Han    schedule 19.12.2009
comment
Здорово! Это поможет мне и в других делах, например, в получении руководства для этой конкретной конечной точки. - person Padu Merloti; 19.12.2009
comment
Что вы имеете в виду под руководством этой конечной точки? Вы имеете в виду GUID DSound? Это доступно в PKEY_AudioEndpoint_GUID. Вы также можете использовать msdn.microsoft.com/en-us/library/ms790392. aspx DRV_QUERYDEVICEINTERFACE и DRV_QUERYENDPOINTID, чтобы получить идентификатор конечной точки для данной волны или идентификатора микшера. - person ReinstateMonica Larry Osterman; 20.12.2009
comment
Верно, что я уже делаю по другим причинам. Общая картина здесь следующая: я разрабатываю мультимедийный фреймворк для захвата звука на основе waveInXxx API. Сначала мне пришлось связать данную строку ввода с ее аудиоустройством (setupAPI), и для этого я использую DRV_QUERYDEVICEINTERFACE. Проблема, с которой я столкнулся с api waveInXxx, заключается в том, что он усекает имя устройства в Vista, поэтому я призываю направить звук, чтобы получить это полное имя. - person Padu Merloti; 21.12.2009
comment
@Larry: Думаю, я ближе к решению. Мне не удалось найти DRV_QUERYENDPOINTID где-нибудь, но, используя waveInMessage с DRV_QUERYSTRINGID, я смог немного приблизиться к тому, что я хочу. Я получил от него следующую строку 00000001: 00000037: {0.0.1.00000000}. {54d2b8ce-17da-4324-ac30-e8a1003ab430}: widMessage: 00000000 и следующую строку от IMMDevice.GetID: {0.0.1.00000000}. {F1821ba1-3c39-49fb-9f5b-d3d9a85cffe8} Я мог бы сравнить строки прямо сейчас, но было бы лучше, если бы было другое сообщение, которое выводило бы строки в аналогичных форматах, и я мог бы относитесь к ним как к непрозрачным. - person Padu Merloti; 22.12.2009
comment
@Han: вы знаете, где DRV_QUERYFUNCTIONINSTANCEID is объявлен? - person Padu Merloti; 22.12.2009
comment
Ба ... извините за это. Я использовал старый WinDDK. Думаю, сейчас у меня все хорошо. - person Padu Merloti; 22.12.2009
comment
Паду: Извините, я ошибся символом, QUERYFUNCTIONINSTANCEID - правильный символ. - person ReinstateMonica Larry Osterman; 22.12.2009
comment
Нет проблем, я понял. Как вы думаете, результат, полученный в результате этой функции, является надежным? Я имею в виду ... будет ли он пока работать на всех платформах? - person Padu Merloti; 22.12.2009