Windows Audio Endpoint API. Получение названий моих аудиоустройств

Моя главная цель на данный момент — получить подробную информацию обо всех устройствах Audio Endpoint локального компьютера. Это объекты, представляющие аудиоустройства. Я хочу иметь возможность выбирать устройство для записи на основе некоторой логики (или в конечном итоге позволить пользователю сделать это вручную).

Вот что у меня так далеко. Я довольно новичок в c ++, поэтому работа со всеми этими абстрактными классами становится немного сложнее, поэтому не стесняйтесь комментировать и качество кода.

//Create vector of IMMDevices
UINT endpointCount = NULL;
(*pCollection).GetCount(&endpointCount);
std::vector<IMMDevice**> IMMDevicePP;   //IMMDevice seems to contain all endpoint devices, so why have a collection here?
for (UINT i = 0; i < (endpointCount); i++)
{
IMMDevice* pp = NULL;
(*pCollection).Item(i, &pp);
IMMDevicePP.assign(1, &pp);
}

Моя более техническая цель в настоящее время — получить объекты, которые реализуют этот интерфейс: http://msdn.microsoft.com/en-us/library/windows/desktop/dd371414(v=vs.85).aspx
Это тип, который должен представлять одно устройство конечной точки аудио, тогда как IMMDevice кажется, содержит коллекцию устройств. тем не мение IMMEndpoint содержит только метод GetDataFlow так что я не уверен, поможет ли это мне. Опять же, цель состоит в том, чтобы легко выбрать, какое оконечное устройство будет записывать и передавать аудио.

Какие-либо предложения? Я использую неправильный API? Этот API определенно имеет хорошие команды для фактической потоковой передачи и сэмплирования аудио, но я немного растерялся относительно того, как убедиться, что я использую нужное устройство.

1

Решение

WASAPI позволит вам делать то, что вам нужно, поэтому вы используете правильный API. Вы ошибаетесь в том, что IMMDevice представляет коллекцию аудиоустройств, то есть IMMDeviceCollection. IMMDevice представляет собой одно аудиоустройство. Под «устройством» WASAPI не означает звуковую карту, как вы могли бы ожидать, скорее это означает один вход / выход на такой карте. Например, звуковая карта с аналоговым входом / выходом + цифровым выходом будет отображаться как 3 устройства IMM, каждое со своим собственным пунктом IMMEndpoint. Я не уверен, какая подробная информация вам нужна, но мне кажется, что IMMDevice предоставит вам все, что вам нужно. По сути, вы хотите сделать что-то вроде этого:

  • Создать IMMDeviceEnumerator
  • Вызовите EnumAudioEndpoints, указав визуализацию, захват или оба, для перечисления в IMMDeviceCollection
  • Получить отдельные экземпляры IMMDevice из IMMDeviceCollection
  • Имя устройства и описание могут быть запрошены из IMMDevice с помощью OpenPropertyStore (http://msdn.microsoft.com/en-us/library/windows/desktop/dd370812%28v=vs.85%29.aspx). Дополнительные сведения о поддерживаемом устройстве можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/dd370794%28v=vs.85%29.aspx.
  • Экземпляры IMMDevice, полученные из IMMDeviceCollection, также будут экземплярами IMMEndpoint, используйте QueryInterface для переключения между ними. Тем не менее, как вы заметили, это скажет вам только, если у вас есть руки на устройстве рендеринга или захвата. Гораздо проще запрашивать только то, что вы хотите, непосредственно в EnumAudioEndpoints.
  • О качестве кода: используйте x-> f () вместо if (* x) .f (), хотя технически это то же самое, что оператор -> является обычным способом вызова функции через указатель объекта
  • Не используйте vector :: assign, очевидно, он заменяет содержимое всего вектора при каждом вызове, поэтому вы получите коллекцию размера 1 независимо от количества доступных устройств. Вместо этого используйте push_back.
3

Другие решения

После перечисления ваших IMMDevices, как сказал Sjoerd, необходимо извлечь IPropertyStore
информация для устройства. Оттуда вы должны извлечь PROPVARIANT объект как таковой:

PROPERTYKEY key;
HRESULT keyResult = (*IMMDeviceProperties[i]).GetAt(p, &key);

затем

PROPVARIANT propVari;
HRESULT propVariResult = (*IMMDeviceProperties[i]).GetValue(key, &propVari);

согласно этим документам:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb761471(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx

И, наконец, для навигации большого PROPVARIANT структура, чтобы получить понятное имя устройства аудио конечной точки просто получить доступ к pwszVal член PROPVARIANT структура, как показано здесь:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd316594(v=vs.85).aspx

Все о поиске нужной документации!

1

По вопросам рекламы [email protected]