Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ WASAPI没有声音输出_Visual C++_Wasapi - Fatal编程技术网

Visual c++ WASAPI没有声音输出

Visual c++ WASAPI没有声音输出,visual-c++,wasapi,Visual C++,Wasapi,我在WASAPI方面遇到了问题。它不输出任何声音,我已经检查了写入缓冲区的数据 因为它不输出任何声音,我没有任何想法来找出问题 它在下面的代码中可能有一些问题 SoundStream::SoundStream() : writtenCursor(0), writeCursor(0), distroy(false) { IMMDeviceEnumerator * pEnumerator = nullptr; HResult(CoCreateInstance(__uuidof(MM

我在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();
        });
    }

}

您可以在上查看我的WASAPI.cpp代码(该代码运行良好)

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

//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;
}
因为“pwfx.cbSize>=22”,您知道您收到的是一个WaveFormatTextEnable,而不是一个简单的WaveFormatTex

更多信息请访问:
IAudioClient::GetMixFormat

波形可感知

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

发布的代码不会向设备发送任何数据。我通过另一个函数执行发送操作。它的声音带有AUDCLNT\u SHAREMODE\u EXCLUSIVE模式,但我希望AUDCLNT\u SHAREMODE\u SHARED Mode使用复杂的GetMixFormat可能存在一个问题。我刚刚将它添加到我的WASAPI.cpp:GUID G;G=((波形可理解*)内部波形)->子格式;//子格式00000003-0000-0010-8000-00aa00389b71定义KSDATAFORMAT_SUBTYPE_IEEE_FLOAT//子格式00000001-0000-0010-8000-00aa00389b71定义KSDATAFORMAT_SUBTYPE_PCM,如果(G.Data1==3)其FLOAT=true;如果(G.Data1==1)itsfloat=false,则为else;单词V;V=((波形可感测*)internalwaveformat)->Samples.wValidBitsPerSample;但它可以使用系统提供的AUDCLNT\U SHAREMODE\U SHAREDI混合格式来获取它。我不知道它以前可能用过浮点型。