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