Я пытаюсь получить доступ к определенному аудиоустройству USB с помощью WASAPI в монопольном режиме в приложении UWP. Во-первых, я создаю WAVEFORMATEXTENSIBLE
и проверяю, поддерживает ли мое устройство этот формат:
WAVEFORMATEXTENSIBLE wf;
wf.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
wf.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
wf.Format.nChannels = 2;
wf.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
// PCM 16
wf.Format.wBitsPerSample = 16;
wf.Samples.wValidBitsPerSample = wf.Format.wBitsPerSample;
wf.Format.nBlockAlign = wf.Format.nChannels * (wf.Format.wBitsPerSample / 8);
wf.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
wf.Format.nSamplesPerSec = 48000;
wf.Format.nAvgBytesPerSec = wf.Format.nSamplesPerSec * wf.Format.nBlockAlign;
hr = IAudioClient_IsFormatSupported(
pAudioClient,
AUDCLNT_SHAREMODE_EXCLUSIVE,
(WAVEFORMATEX*)&wf,
NULL);
IsFormatSupported
возвращает S_OK
. Затем я инициализирую AudioClient
следующим образом:
hr = IAudioClient_Initialize(
pAudioClient,
AUDCLNT_SHAREMODE_EXCLUSIVE,
AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
bufferDuration,
bufferDuration,
(WAVEFORMATEX*) &wf,
NULL);
Проблема здесь: Initialize
возвращает E_INVALIDARG
. Согласно документации Microsoft , это может быть вызвано несколькими проблемами, но в моем случае я подозреваю, что параметр pFormat указывает на недопустимое описание формата, потому что я не использую ни один из упомянутых флагов и не вызываю SetClientProperty
.
Правильно ли я инициализирую WAVEFORMAT
?
WAVEFORMATEXTENSIBLE wv = {0};
, ничего не меняется - person loics2   schedule 28.01.2021GetDevicePeriod
. Я думаю, что есть определенные ошибки длительности буфера (AUDCLNT_E_INVALID_DEVICE_PERIOD и AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED), поэтому это не должно быть E_INVALIDARG - person loics2   schedule 28.01.2021