글쎄, 나는 MSDN 포럼에 물었고 그들은 좋은 대답을 내놓았다.
IMMDevice::OpenPropertyStore()
을 통해, 그 다음에 IPropertyStore::GetValue()
이 아닌 IAudioClient::GetMixFormat()
을 통해 장치의 기본 장치 형식을 확인해야합니다. 시간의
//CoInitialize/Enumerate devices
IPropertyStore* store = nullptr;
hr = device->OpenPropertyStore(STGM_READ, &store);
if (FAILED(hr)) {
ExitProcess(1);
}
PROPVARIANT prop;
hr = store->GetValue(PKEY_AudioEngine_DeviceFormat, &prop);
if (FAILED(hr)) {
ExitProcess(2);
}
hr = device->Activate (
__uuidof(IAudioClient),
CLSCTX_ALL,
NULL,
(void**)&audioClient
);
device->Release();
device = nullptr;
if (FAILED(hr)) {
ExitProcess(3);
}
hr = audioClient->IsFormatSupported (
AUDCLNT_SHAREMODE_EXCLUSIVE,
(PWAVEFORMATEX)prop.blob.pBlobData,
NULL
);
if (FAILED(hr)) {
ExitProcess(4);
}
최종 값은 S_OK이다 : 여기 허용 WAVEFORMATEX 구조를 취득하는 코드이다.
일반적으로 작동하지만 여전히 실패 할 수 있음을 명심하십시오. 실제로 윈도우 7을 실행하는 가상 박스에서 실패한 것을 보았습니다 (즉, deviceformat은 장치에서 지원하지 않습니다 =). IMHO는 형식을 결정하는 유일한 방법은 내가 좋아하는 것을 찾을 때까지 계속 IsFormatSupported를 호출하는 것입니다. –