HRESULT OmnidirectionalSound::Initialize()

in Shared/Audio/OmnidirectionalSound.cpp [22:83]


HRESULT OmnidirectionalSound::Initialize(LPCWSTR filename, UINT32 const& loopCount)
{
    auto hr = _audioFile.Initialize(filename);

    if (SUCCEEDED(hr))
    {
        _sourceType = SoundSourceType::File;
    }

    ComPtr<IXAPO> xapo;
    if (SUCCEEDED(hr))
    {
        // Passing in nullptr as the first arg for HrtfApoInit initializes the APO with defaults of
        // omnidirectional sound with natural distance decay behavior.
        // CreateHrtfApo will fail with E_NOTIMPL on unsupported platforms.
        hr = CreateHrtfApo(nullptr, &xapo);
    }

    if (SUCCEEDED(hr))
    {
        hr = xapo.As(&_hrtfParams);
    }

    // Set the default environment.
    if (SUCCEEDED(hr))
    {
        hr = _hrtfParams->SetEnvironment(_environment);
    }

    // Initialize an XAudio2 graph that hosts the HRTF xAPO.
    // The source voice is used to submit audio data and control playback.
    if (SUCCEEDED(hr))
    {
        hr = SetupXAudio2(_audioFile.GetFormat(), xapo.Get(), &_xaudio2, &_sourceVoice);
    }

    // Submit audio data to the source voice.
    if (SUCCEEDED(hr))
    {
        XAUDIO2_BUFFER buffer{};
        buffer.AudioBytes = static_cast<UINT32>(_audioFile.GetSize());
        buffer.pAudioData = _audioFile.GetData();
        buffer.LoopCount = loopCount;
        hr = _sourceVoice->SubmitSourceBuffer(&buffer);

        const WAVEFORMATEX* format = _audioFile.GetFormat();
        unsigned int streamSize = static_cast<unsigned int>(_audioFile.GetSize());

        // compute audio length, in seconds
        unsigned int numSamples =
            streamSize * 8 /                            // number of bits
            format->wBitsPerSample;                     // bits per sample

        float numSeconds =
            static_cast<float>(numSamples) /            // number of samples
            static_cast<float>(format->nSamplesPerSec); // samples per second

        _duration = numSeconds;
    }

    return (_initStatus = hr);
}