WaveOut计划崩溃

时间:2015-05-24 00:28:12

标签: c++ waveout

我正努力尝试读取原始.wav数据并将数据输出到扬声器,主要用于自我实验和教学。我自己想要数据的第二个原因是我可以解析它以尝试分离音高,或构建均衡器或某种类型的可视化。到目前为止,我已经阅读了文件中的数据,验证了标题和诸如此类的东西,但随后我转到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);

1 个答案:

答案 0 :(得分:1)

我设法找到了什么是错的,对于其他所有人来说。我拉的数据纯粹是声音数据,减去标题。我的问题是它需要声音数据顶部的标题,这是另外44个字节。我要做的是将数组的大小减去44个字节,然后在头开始回击标题,并改变这一行:

hdr.lpData=(LPSTR)&sound;

到此:

hdr.lpData=(LPSTR)sound;

现在,由于我解析了标题,我也可以正确地选择比特率,计算歌曲的长度,并用它做其他各种事情。