MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Получить свойства звукового устройства с помощью MMDevice API"
Answer 736536
Значения GUID свойств находятся в Functiondiscoverykeys_devpkey.h. Например, имя устройства -
PKEY_Device_FriendlyName
.Но информация о разъемах - это не свойства. Ее получают с помощью другого API - Device Topology. Интерфейс
IKsJackDescription
позволяет получить структуруKSJACK_DESCRIPTION
, содержащую данные о типе разъема, его расположении и т.д.Пример кода для вывода ID, имени и информации о разъемах для всех аудиоустройств:
#define INITGUID #include <stdio.h> #include <tchar.h> #include <Windows.h> #include <Objbase.h> #include <Shobjidl.h> #include <MMDeviceAPI.h> #include <locale.h> #include <Functiondiscoverykeys_devpkey.h> #include <Devicetopology.h> #pragma comment(lib, "uuid.lib") #define SAFE_RELEASE(punk) \ if ((punk) != NULL) \ { (punk)->Release(); (punk) = NULL; } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL,"Russian"); CoInitialize(NULL); TCHAR* pstr=NULL; DWORD state; IMMDeviceEnumerator *deviceEnumerator = NULL; IMMDeviceCollection *deviceCollection = NULL; IMMDevice* dev=NULL; IPropertyStore *propertyStore=NULL; IDeviceTopology *pDeviceTopology = NULL; IConnector *pConnFrom = NULL; IConnector *pConnTo = NULL; IPart *pPart = NULL; IKsJackDescription *pJackDesc = NULL; HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&deviceEnumerator)); if(FAILED(hr)) {printf("CoCreateInstance failed");goto End;} /*Получение аудиоустройств*/ hr = deviceEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE|DEVICE_STATE_UNPLUGGED, &deviceCollection); if(FAILED(hr)) {printf("EnumAudioEndpoints failed");goto End;} UINT deviceCount; hr = deviceCollection->GetCount(&deviceCount); if(FAILED(hr)) {printf("GetCount failed");goto End;} for (UINT DeviceIndex = 0 ; DeviceIndex < deviceCount; DeviceIndex++) { deviceCollection->Item(DeviceIndex,&dev); if(FAILED(hr)) {printf("Item failed");continue;} dev->GetId(&pstr); if(FAILED(hr)) {printf("GetId failed");continue;} printf("Device id: "); wprintf(pstr); printf("\n"); hr = dev->OpenPropertyStore(STGM_READ, &propertyStore); if(FAILED(hr)) {printf("OpenPropertyStore failed");goto Next;} /*Получение имени устройства*/ PROPVARIANT friendlyName; PropVariantInit(&friendlyName); hr = propertyStore->GetValue(PKEY_Device_FriendlyName, &friendlyName); if(FAILED(hr)) {printf("GetValue failed");goto Next;} wprintf(friendlyName.pwszVal); printf("\n"); PropVariantClear(&friendlyName); /*Получение информации о разъемах*/ hr = dev->Activate(__uuidof(IDeviceTopology), CLSCTX_ALL, NULL, (void**)&pDeviceTopology); if(FAILED(hr)) {printf("Activate failed");goto Next;} hr = pDeviceTopology->GetConnector(0, &pConnFrom); if(FAILED(hr)) {printf("GetConnector failed");goto Next;} hr = pConnFrom->GetConnectedTo(&pConnTo); if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) { // The adapter device is not currently active. hr = E_NOINTERFACE; } if(FAILED(hr)) {printf("GetConnector 2 failed");goto Next;} // Get the connector's IPart interface. hr = pConnTo->QueryInterface(__uuidof(IPart), (void**)&pPart); if(FAILED(hr)) {printf("QueryInterface failed");goto Next;} // Activate the connector's IKsJackDescription interface. hr = pPart->Activate(CLSCTX_INPROC_SERVER, __uuidof(IKsJackDescription), (void**)&pJackDesc); if(FAILED(hr)) {printf("IKsJackDescription failed: %d\n",hr);goto Next;} UINT jacks=0; KSJACK_DESCRIPTION jdesc; hr=pJackDesc->GetJackCount(&jacks); if(FAILED(hr)) {printf("GetJackCount failed");goto Next;} printf("Jack count: %d\n\n",jacks); /*Вывод разъемов*/ for(UINT i=0;i<jacks;i++){ hr=pJackDesc->GetJackDescription(i,&jdesc); if(FAILED(hr)) {printf("GetJackDescription failed");continue;} printf("* Jack #%d *\n",(int)(i+1)); if(jdesc.IsConnected==0){//состояние printf("Device not connected\n"); }else{ printf("Device connected\n"); } wprintf(L"Connection Type: "); switch (jdesc.ConnectionType)//тип разъема { case eConnType3Point5mm: wprintf(L"Разъем 3.5 мм \n");break; case eConnTypeAtapiInternal:wprintf(L"Разъем ATAPI \n");break; case eConnTypeRCA: wprintf(L"Разъем RCA \n");break; case eConnTypeQuarter: wprintf(L"Разъем 1/2 дюйма \n");break; case eConnTypeOtherAnalog: wprintf(L"Аналоговый разъем \n");break; case eConnTypeOtherDigital: wprintf(L"Цифровой разъем \n"); break; default: wprintf(L"0x%x\n",jdesc.ConnectionType); break; } wprintf(L"GeoLocation: "); switch (jdesc.GeoLocation)//расположение разъема { case eGeoLocFront: wprintf(L"Передняя панель\n");break; case eGeoLocRear: wprintf(L"Задняя панель\n");break; case eGeoLocHDMI: wprintf(L"HDMI\n");break; case eGeoLocATAPI: wprintf(L"ATAPI\n");break; case eGeoLocNotApplicable: wprintf(L"Не определено\n");break; default: printf("0x%x\n",jdesc.GeoLocation);break; } } /* очистка ресурсов */ Next:SAFE_RELEASE(dev);SAFE_RELEASE(propertyStore);SAFE_RELEASE(pDeviceTopology); SAFE_RELEASE(pConnFrom);SAFE_RELEASE(pConnTo);SAFE_RELEASE(pPart); SAFE_RELEASE(pJackDesc); printf("\n"); } End: SAFE_RELEASE(deviceEnumerator); SAFE_RELEASE(deviceCollection); system("PAUSE"); CoUninitialize(); return 0; }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.