2015-05-24 89 views
0

我正在尝试读取原始.wav数据并将数据输出到扬声器,主要是用于自我实验和教学。我自己想要数据的第二个原因是我可以解析它以尝试分离音高,或者构建均衡器或某种类型的可视化。到目前为止,我已经从文件的数据中读取数据,验证头文件和什么,但是然后我去WaveOut,它开始搞乱了。我的代码目前相当意大利面代码,当然,但它更多的是初步测试,看看我能不能做到这一点。据我现在可以告诉,我的程序崩溃在waveOutWrite(),我真的不知道为什么,我找不到任何如何让WaveOut工作的好例子。这里的相关位: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); 
+0

检查返回值,特别是来自waveOutOpen。如果您没有将所有格式参数设置为声卡可以处理的内容,则会失败。 –

+0

waveOutOpen和waveOutPrepareHeader都返回MMSYSERR_NOERROR。 waveOutWrite不会返回。 – Bioniclegenius

回答

1

我设法发现什么是错的,对于所有其他人来说。我所拉动的数据只是纯粹的声音数据,不包括标题。我的问题是,它需要在声音数据的顶部,这是另外44个字节。我所要做的就是那些44个字节凸点阵列的尺寸,拍击头部回到开始,改变这一行:

hdr.lpData=(LPSTR)&sound; 

这样:

hdr.lpData=(LPSTR)sound; 

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