我正在尝试将libsndfile与xaudio2集成。我在网上找不到太多,所以我在这里问一下。
我成功地集成了libsndfile与OpenAL相当容易,但我正在努力与xaudio2。
它产生砰的一声和噼啪声。我确信这是因为我没有给出xaudio期望的正确格式…但是我不知道应该给xaudio2发送什么值。
这是我如何加载声音文件…
SF_INFO info;
SNDFILE* file =
sf_open(
filename.c_str(),
SFM_READ,
&info);
std::vector<uint16_t> wav;
std::array<int16_t, READ_BLOCK_SIZE> read_buf;
sf_count_t read_size = 0;
while ((read_size =
sf_read_short(
file,
read_buf.data(),
read_buf.size())) != 0)
wav.insert(
wav.end(),
read_buf.begin(),
read_buf.begin() + read_size);
所以wav矢量得到填充的类型,而xaudio期望一个字节数组....不确定这是否也是一个问题。
info用你知道的声音文件信息填充。
这是我如何填充xaudio缓冲区。
waveFormat = {};
waveFormat.wFormatTag = WAVE_FORMAT_PCM;
waveFormat.nChannels = info.channels;
waveFormat.nSamplesPerSec = info.samplerate;
waveFormat.wBitsPerSample = 8;
waveFormat.nBlockAlign =
waveFormat.nChannels *
waveFormat.wBitsPerSample / 8;
waveFormat.nAvgBytesPerSec =
waveFormat.nSamplesPerSec *
waveFormat.nBlockAlign;
waveFormat.cbSize = sizeof(WAVEFORMATEX);
buffer = { 0 };
buffer.AudioBytes = (UINT32)(wav.size() * sizeof(uint16_t));
buffer.Flags = XAUDIO2_END_OF_STREAM;
buffer.LoopBegin = 0;
buffer.LoopCount = 0;
buffer.LoopLength = 0;
buffer.pAudioData = (BYTE*)wav.data();
buffer.pContext = nullptr;
buffer.PlayBegin = 0;
buffer.PlayLength = (UINT32)wav.size();
我不确定AudioBytes是否正确....您可能已经知道,我不知道该向xaudio2输入什么。
我怎样才能用正确的值从libsndfile填充xaudio缓冲区?
谢谢。
所以,问题确实是格式....
所以我改变了从short到float读取音频文件的方法,并将格式从WAVE_FORMAT_PCM更改为WAVE_FORMAT_IEEE_FLOAT。每个采样的比特数为32位。
并使用reinterpret_cast....将浮点数组转换为字节数组希望下面的代码可以帮助其他人使用LibSndFile将音频文件加载到Xaudio2缓冲区。
欢呼。
std::vector<float> wav;
std::array<float, READ_BLOCK_SIZE> read_buf;
while ((read_size =
sf_read_float(
file,
read_buf.data(),
read_buf.size())) != 0)
wav.insert(
wav.end(),
read_buf.begin(),
read_buf.begin() + read_size);
waveFormat = {};
waveFormat.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
waveFormat.nChannels = info.channels;
waveFormat.nSamplesPerSec = info.samplerate;
waveFormat.wBitsPerSample = 32;
waveFormat.nBlockAlign =
(waveFormat.nChannels *
waveFormat.wBitsPerSample) / 8;
waveFormat.nAvgBytesPerSec =
waveFormat.nSamplesPerSec *
waveFormat.nBlockAlign;
waveFormat.cbSize = 0;// sizeof(waveFormat);
buffer = { 0 };
buffer.AudioBytes =
(UINT32)(wav.size() * sizeof(float));
buffer.Flags = XAUDIO2_END_OF_STREAM;
buffer.pAudioData =
(BYTE*)new BYTE[
wav.size() * sizeof(float)];
std::memcpy(
(void*)buffer.pAudioData,
reinterpret_cast<BYTE*>(wav.data()),
wav.size() * sizeof(float));
buffer.pContext = nullptr;
buffer.PlayLength = (UINT32)info.frames;