2

我在使用 WASAPI 时遇到问题。它不输出任何声音,我已经检查了写入缓冲区的数据。

因为它不输出任何声音,所以我不知道找出问题所在。

以下代码可能存在一些问题。

SoundStream::SoundStream() : writtenCursor(0), writeCursor(0), distroy(false)
{

    IMMDeviceEnumerator * pEnumerator = nullptr;
    HResult(CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pEnumerator)));

    IMMDevice * pDevice = nullptr;
    HResult(pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice));
    SafeRelease(&pEnumerator);

    HResult(pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient));
    SafeRelease(&pDevice);

    WAVEFORMATEXTENSIBLE * pwfx = nullptr;

    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    REFERENCE_TIME hnsRequestedDuration = REFTIMES_PER_SEC * 2;

    HResult(pAudioClient->GetMixFormat((WAVEFORMATEX**)&pwfx));

    HResult(pAudioClient->Initialize(
        AUDCLNT_SHAREMODE_SHARED,
        AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
        hnsRequestedDuration,
        0,
        (WAVEFORMATEX*)pwfx,
        NULL));

    pAudioClient->SetEventHandle(hEvent);

    channel = (size_t)pwfx->Format.nChannels;
    bits = (size_t)pwfx->Format.wBitsPerSample;
    validBits = (size_t)pwfx->Samples.wValidBitsPerSample;
    frequency = (size_t)pwfx->Format.nSamplesPerSec;
    buffer.reshape({ 0, channel, bits >> 3 });

    CoTaskMemFree(pwfx);

    HResult(pAudioClient->GetBufferSize(&bufferFrameCount));
    HResult(pAudioClient->Start());

    if (pAudioClient)
    {
        thread = std::thread([&]()
        {
            this->Sync();
        });
    }

}
4

2 回答 2

0

您可以在http://jdmcox.com上查看我的 WASAPI.cpp 代码(效果很好)。

您还应该检查预期的波形格式是否为浮动:

//SubFormat 00000003-0000-0010-8000-00aa00389b71 defines KSDATAFORMAT_SUBTYPE_IEEE_FLOAT 
//SubFormat 00000001-0000-0010-8000-00aa00389b71 defines KSDATAFORMAT_SUBTYPE_PCM 
GUID G; 
WORD V;
WAVEFORMATEX *pwfx = NULL;
bool itsfloat;

pAudioClient->GetMixFormat(&pwfx);
// Do we received a WAVEFORMATEXTENSIBLE?
if(pwfx.cbSize >= 22) {
   G = ((WAVEFORMATEXTENSIBLE*)pwfx)->SubFormat;
   V = ((WAVEFORMATEXTENSIBLE*)pwfx)->Samples.wValidBitsPerSample; 
   if (G.Data1 == 3) itsfloat = true; 
   else if (G.Data1 == 1) itsfloat = false;
}

您知道您收到的是 WAVEFORMATEXTENSIBLE 而不是简单的 WAVEFORMATEX,因为“pwfx.cbSize >= 22”。

查看更多信息:
IAudioClient::GetMixFormat
https://docs.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudioclient-getmixformat

波形格式
https://docs.microsoft.com/en-us/windows/win32/api/mmreg/ns-mmreg-waveformatextensible

于 2014-04-03T13:35:43.237 回答
0

您可以再次在http://jdmcox.com上查看我的 WASAPI.cpp 代码。现在它可以在共享模式和独占模式下工作。我应该注意的是,在共享模式下不需要转换波形格式或波形——Windows 会负责转换它们用于混合波形的格式。

于 2014-04-04T16:41:12.897 回答