2014-04-01 216 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負責轉換和轉換用於混合波形的格式。