2

I'm trying to learn how to play audio through my default playback device using WASAPI. My test is capturing audio from my default device and sending it to the playback device to render so that I can hear myself talk through my speakers.

It appears that the data I'm getting from my capture device is working fine, but when I send it to the IAudioRenderClient buffer, sometimes I get just pure static and sometimes I just get silence.

If you think you need to see my capture device logic, just ask. I haven't posted it since it appears to me to be a playback device issue.

My devices are working properly in other apps. So it's not a device problem.

Can anyone tell me what I'm doing wrong?

Playback Device Init

#define REFTIMES_PER_SEC            48000
bool AudioManager::InitPlaybackDevice()
{
    HRESULT hr;
    WAVEFORMATEX* pWfx = nullptr;
    BYTE* pData = nullptr;
    UINT32 nNumFramesPadding = 0;

    // Query the Enumerator for the default playback device
    hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eCommunications, &m_pPlaybackDevice);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pPlaybackDevice->Activate(IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&m_pAudioRenderClient);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClient->GetMixFormat(&pWfx);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClient->Initialize(AUDCLNT_SHAREMODE_SHARED, 0, REFTIMES_PER_SEC, 0, pWfx, NULL);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClient->GetBufferSize(&m_nPlaybackBufferFrameCount);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClient->GetService(IID_IAudioRenderClient, (void**)&m_pAudioRenderClientObj);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClient->GetCurrentPadding(&nNumFramesPadding);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClientObj->GetBuffer(m_nPlaybackBufferFrameCount - nNumFramesPadding, &pData);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClientObj->ReleaseBuffer(m_nPlaybackBufferFrameCount - nNumFramesPadding, AUDCLNT_BUFFERFLAGS_SILENT);
    EXIT_ON_ERROR_SHUTDOWN(hr);

    hr = m_pAudioRenderClient->Start();
    EXIT_ON_ERROR(hr);
    return true;
}

Sending audio data to the playback device

bool AudioManager::SendSampleToPlaybackDevice(BYTE * i_pData, UINT32 i_nSize)
{
    if (m_pAudioRenderClientObj != nullptr)
    {
        HRESULT hr;
        BYTE* pData = nullptr;
        UINT32 nNumFramesPadding = 0;
        int nNumFrames = 0;

        hr = m_pAudioRenderClient->GetCurrentPadding(&nNumFramesPadding);
        EXIT_ON_ERROR(hr);

        nNumFrames = min(i_nSize, m_nPlaybackBufferFrameCount - nNumFramesPadding);
        hr = m_pAudioRenderClientObj->GetBuffer(nNumFrames, &pData);
        EXIT_ON_ERROR(hr);

        if(pData != nullptr)
            memcpy(pData, i_pData, nNumFrames);

        hr = m_pAudioRenderClientObj->ReleaseBuffer(nNumFrames, 0);
        EXIT_ON_ERROR(hr);
        return true;
    }
    return false;
}
szMuzzyA
  • 136
  • 13

0 Answers0