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);
}