Проблемы с инициализацией IAudioClient в монопольном режиме

Я пытаюсь получить доступ к определенному аудиоустройству 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?


person loics2    schedule 28.01.2021    source источник
comment
Вы пытались инициализировать wf до 0? Если вы не измените все элементы в структуре, может возникнуть мусор. Либо используйте memset, либо 'WAVEFORMATEXTENSIBLE wv = {0};'   -  person Devolus    schedule 28.01.2021
comment
Я только что попробовал WAVEFORMATEXTENSIBLE wv = {0};, ничего не меняется   -  person loics2    schedule 28.01.2021
comment
Вы пробовали это? docs.microsoft.com/en-us/windows/ win32/coreaudio/. Может быть, значение длительности буфера неправильное?   -  person Devolus    schedule 28.01.2021
comment
Да, продолжительность буфера исходит из GetDevicePeriod. Я думаю, что есть определенные ошибки длительности буфера (AUDCLNT_E_INVALID_DEVICE_PERIOD и AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED), поэтому это не должно быть E_INVALIDARG   -  person loics2    schedule 28.01.2021
comment
В некоторых случаях WASAPI не возвращает ошибки, связанные с выравниванием. См. также stackoverflow.com/questions/37754642/. Также у вас есть минимальная копия, которую мы можем скомпилировать и запустить?   -  person Sjoerd van Kreel    schedule 28.01.2021
comment
О, интересно, спасибо за ссылку. Пока нет, я пытался интегрировать это в существующую кодовую базу. В настоящее время я пишу небольшую программу, чтобы проверить это изолированно, я поставлю ссылку, когда это будет сделано.   -  person loics2    schedule 29.01.2021
comment
Использование и изменение этот классический образец не может воспроизвести вашу проблему.   -  person Drake Wu    schedule 29.01.2021