MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Получение параметров аудиоустройства через WinAPI"
Answer 727144
Формат вывода звука по умолчанию хранится в ключе реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{GUID устройства}\Properties
Значение
{f19f064d-082c-4e27-bc73-6882a1bb8e4c},0
формата REG_BINARY хранит структуру WAVEFORMATEX или WAVEFORMATEXTENSIBLE (в зависимости от крутости устройства).Для считывания можно использовать Multimedia Device API. Интерфейс
IPropertyStore
от объектаIMMDevice
имеет свойствоPKEY_AudioEngine_DeviceFormat
(blob, содержащий одну из вышеуказанных структур). Пример кода для вывода имени, 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> //Используемые библиотеки: winmm.lib;strmiids.lib;quartz.lib;uuid.lib 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; WAVEFORMATEX wex;//буфер для данных о формате HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&deviceEnumerator)); if(FAILED(hr)) {printf("CoCreateInstance fail: HRESULT 0x%x",hr);goto End;} hr = deviceEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &deviceCollection); if(FAILED(hr)) {printf("EnumAudioEndpoints fail: HRESULT 0x%x",hr);goto End;} UINT deviceCount; hr = deviceCollection->GetCount(&deviceCount); if(FAILED(hr)) {printf("GetCount fail: HRESULT 0x%x",hr);goto End;} //display all endpoints for (UINT DeviceIndex = 0 ; DeviceIndex < deviceCount; DeviceIndex++) { deviceCollection->Item(DeviceIndex,&dev); if(FAILED(hr)) {printf("Item fail: 0x%x\n",hr);goto Next;} dev->GetId(&pstr); if(FAILED(hr)) {printf("Can't get device ID: HRESULT 0x%x",hr);goto Next;} hr = dev->OpenPropertyStore(STGM_READ, &propertyStore); if(FAILED(hr)) {printf("Can't open property store: HRESULT 0x%x",hr);goto Next;} PROPVARIANT friendlyName; PropVariantInit(&friendlyName); hr = propertyStore->GetValue(PKEY_Device_FriendlyName, &friendlyName); if(FAILED(hr)) {printf("Can't get device name: HRESULT 0x%x",hr);goto Next;} printf("\n"); wprintf(friendlyName.pwszVal); printf("\n"); PropVariantClear(&friendlyName); printf("Device id: "); wprintf(pstr); printf("\n"); dev->GetState(&state); if(FAILED(hr)) {printf("Can't get state: HRESULT 0x%x",hr);goto Next;} printf("State: %d\n",state); PROPVARIANT format; PropVariantInit(&format); hr = propertyStore->GetValue(PKEY_AudioEngine_DeviceFormat, &format); if(FAILED(hr)) {printf("Can't get format: HRESULT 0x%x",hr);goto Next;} printf("\n* Audio Format: *\n"); memcpy_s(&wex,sizeof(wex),format.blob.pBlobData,sizeof(wex));//копировать данные формата в буфер printf("Format tag: 0x%x\n",(int)wex.wFormatTag); printf("Channels: %d\n",(int)wex.nChannels); printf("Bits per sample: %d\n",(int)wex.wBitsPerSample); printf("Frequency: %d\n",(int)wex.nSamplesPerSec); printf("Block align: %d\n",(int)wex.nBlockAlign); PropVariantClear(&format); /* ****************** */ Next: if(dev!=NULL){dev->Release();dev=NULL;} if(propertyStore!=NULL){propertyStore->Release();propertyStore=NULL;} }//end for End:if(dev!=NULL){dev->Release();dev=NULL;} if(propertyStore!=NULL){propertyStore->Release();propertyStore=NULL;} if(deviceEnumerator!=NULL){deviceEnumerator->Release();deviceEnumerator=NULL;} if(deviceCollection!=NULL){deviceCollection->Release();deviceCollection=NULL;} CoUninitialize(); system("PAUSE"); return 0; }
Результат:
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.