Я пытаюсь открыть эксклюзивный поток с устройством вывода, используя WASAPI. У меня возникают проблемы при выборе приемлемого формата, так как нет никаких подсказок относительно того, какие форматы принимаются данным устройством.
В моем случае, IAudioClient::GetMixFormat()
, который в противном случае возвращает своего рода формат по умолчанию для устройства, возвращает формат, который нельзя использовать в монопольном режиме (IAudioClient::IsFormatSupported()
возвращается AUDCLNT_E_UNSUPPORTED_FORMAT
). Я не знаю, куда идти оттуда. Существует смешное количество комбинаций параметров волнового формата — нужно ли буквально перебирать каждый из них, пока что-то не заработает?
Ну, я спросил форумы MSDN, и они пришли с хорошим ответом.
Вам необходимо проверить формат устройства по умолчанию устройства через IMMDevice::OpenPropertyStore()
и впоследствии IPropertyStore::GetValue()
не IAudioClient::GetMixFormat()
, Вот код, который получил приемлемую структуру WAVEFORMATEX:
//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);
}
Конечное значение hr — S_OK.
Других решений пока нет …