2014-03-24 3 views
2

WASAPI를 사용하여 출력 장치로 전용 스트림을 열려고합니다. 허용되는 형식을 선택하는 데 문제가 있습니다. 주어진 장치에서 어떤 형식이 허용되는지에 대한 힌트가 없어 보입니다.WASAPI : 독점 출력에 대한 웨이브 형식 선택

필자의 경우 IAudioClient::GetMixFormat()은 장치의 기본 형식을 반환하며 배타 모드 (IAudioClient::IsFormatSupported()AUDCLNT_E_UNSUPPORTED_FORMAT을 반환)에서 사용할 수없는 형식을 반환합니다. 나는 거기에서 어디로 가야할지 모른다. 파형 형식 매개 변수의 조합은 어리석은 숫자입니다. 문자 그대로 작동 할 때까지 모든 문자를 반복해야합니까?

답변

4

글쎄, 나는 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 구조를 취득하는 코드이다.

+0

일반적으로 작동하지만 여전히 실패 할 수 있음을 명심하십시오. 실제로 윈도우 7을 실행하는 가상 박스에서 실패한 것을 보았습니다 (즉, deviceformat은 장치에서 지원하지 않습니다 =). IMHO는 형식을 결정하는 유일한 방법은 내가 좋아하는 것을 찾을 때까지 계속 IsFormatSupported를 호출하는 것입니다. –