2014-04-01 164 views
0

我遇到了WASAPI问题。它不输出任何声音,我已经检查写入缓冲区的数据。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(); 
     }); 
    } 

} 
+0

发布的代码不会向设备发送任何数据。 –

+0

我用另一个函数做发送操作。 –

回答

0

你可以看看我的WASAPI.cpp代码为http://jdmcox.com(工作正常)。

+0

它有AUDCLNT_SHAREMODE_EXCLUSIVE模式的声音,但我想AUDCLNT_SHAREMODE_SHARED模式 –

+0

一个问题可能是在使用棘手的GetMixFormat。我刚刚添加到我的WASAPI.cpp:GUID G; G =((WAVEFORMATEXTENSIBLE *)internalwaveformat) - > SubFormat; \t //子格式限定00000003-0000-0010-8000-00aa00389b71 KSDATAFORMAT_SUBTYPE_IEEE_FLOAT \t //子格式限定00000001-0000-0010-8000-00aa00389b71 KSDATAFORMAT_SUBTYPE_PCM \t如果(G.Data1 == 3) \t \t itsfloat = TRUE; \t else if(G.Data1 == 1) \t \t itsfloat = false; \t WORD V; \t V =((WAVEFORMATEXTENSIBLE *)internalwaveformat) - > Samples.wValidBitsPerSample; – user2831980

+0

但它可以使用系统提供的混合格式AUDCLNT_SHAREMODE_SHARED –

0

你可以看看我的WASAPI.cpp代码,重新编号为http://jdmcox.com。 现在它在共享模式以及独占模式下工作。 我应该注意,在共享模式下不需要波形格式或波形的转换--Windows负责转换和转换用于混合波形的格式。