WASAPI: выбор волнового формата для эксклюзивного вывода

Я пытаюсь открыть эксклюзивный поток с устройством вывода, используя WASAPI. У меня возникают проблемы при выборе приемлемого формата, так как нет никаких подсказок относительно того, какие форматы принимаются данным устройством.

В моем случае, IAudioClient::GetMixFormat(), который в противном случае возвращает своего рода формат по умолчанию для устройства, возвращает формат, который нельзя использовать в монопольном режиме (IAudioClient::IsFormatSupported() возвращается AUDCLNT_E_UNSUPPORTED_FORMAT). Я не знаю, куда идти оттуда. Существует смешное количество комбинаций параметров волнового формата — нужно ли буквально перебирать каждый из них, пока что-то не заработает?

3

Решение

Ну, я спросил форумы 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.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]