WaveOut 程序崩溃

WaveOut Program Crashing

我正在尝试读取原始 .wav 数据并将数据输出到扬声器,主要用于 self-experimentation 和教学。我自己想要数据的第二个原因是我可以解析它来尝试分离音高,或者构建均衡器或某种可视化。到目前为止,我已经从工作文件中读取数据,验证了 header 等等,但随后我转到 WaveOut,它开始搞砸了。当然,我的代码目前是一些意大利面条代码,但它更像是一个初步测试,看看我是否能做到这一点。据我所知,我的程序在 waveOutWrite() 处崩溃,老实说我不知道​​为什么,而且我找不到任何好的示例来说明如何让 WaveOut 工作。这是相关的部分:

BYTE *sound=(BYTE*)malloc(sizeof(BYTE)*data_size);
readByte(&in,data_size,sound);
cout<<"Loaded. Now playing...\n";
HWAVEOUT waveOut;
WAVEFORMATEX wF={format_tag,channels,sample_rate,byteRate,block_align,bits_per_sample,0};
MMRESULT result;
waveOutOpen(&waveOut,WAVE_MAPPER,&wF,0,0,CALLBACK_NULL);
WAVEHDR hdr;
ZeroMemory(&hdr,sizeof(WAVEHDR));
hdr.dwBufferLength=data_size;
hdr.lpData=(LPSTR)&sound;
waveOutPrepareHeader(waveOut,&hdr,sizeof(WAVEHDR));
waveOutWrite(waveOut,&hdr,sizeof(WAVEHDR));//Crashes here, no crash if commented out. No sound either way.
Sleep(500);
while(waveOutUnprepareHeader(waveOut,&hdr,sizeof(WAVEHDR))==WAVERR_STILLPLAYING)
  Sleep(100);
waveOutClose(waveOut);

我设法为所有通过的人找出问题所在。我提取的数据只是纯粹的声音数据,减去 header。我的问题是它需要声音数据之上的 header,这是另外 44 个字节。我要做的是将数组的大小增加 44 个字节,将 header 打回开头,然后更改此行:

hdr.lpData=(LPSTR)&sound;

对此:

hdr.lpData=(LPSTR)sound;

现在,多亏了我解析 header,我还可以即时正确地选择比特率,计算歌曲的长度,并用它做各种其他事情。