描述:
源程序如下:从麦克风读入声音,如果声音够大就退出,显示读入的声音。
#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
#include <string.h>
#include <mmsystem.h>
void main()
{
short a=2,b=3;
WAVEFORMATEX waveformat; //与声音输入有关的结构体
WAVEHDR m_pWaveHdr;
MMTIME mmt;
HWAVEIN m_hWaveIn;
UINT uDeviceID;
FILE * stream;
int testresult;
DWORD datasize = 48000;
int i;
printf("START \n");
stream=fopen("results.txt","w+");
fprintf(stream,"mic %hd buffer %d \n ", a, b );
/*准备麦克风输入*/
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels=1;
waveformat.nSamplesPerSec=8000;
waveformat.nAvgBytesPerSec=8000;
waveformat.nBlockAlign=1;
waveformat.wBitsPerSample=8; //指定录音格式
waveformat.cbSize=0;
a=waveInGetNumDevs();
waveInOpen(&m_hWaveIn,WAVE_MAPPER, &waveformat, (DWORD)NULL,0L,CALLBACK_WINDOW); //打开麦克风
m_pWaveHdr.lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, datasize) );
memset(m_pWaveHdr.lpData, 0, datasize );
m_pWaveHdr.dwBufferLength = datasize;
m_pWaveHdr.dwBytesRecorded = 0;
m_pWaveHdr.dwUser = 0;
m_pWaveHdr.dwFlags = 0;
m_pWaveHdr.dwLoops = 0;
waveInPrepareHeader( m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR) ); //准备内存块录音
waveInAddBuffer( m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR) );
/*开始记录声音*/
if (waveInStart(m_hWaveIn)==MMSYSERR_NOERROR) testresult=1;
else testresult=0;
mmt.wType = TIME_BYTES;
printf("record %d",testresult);
while (1)
{
waveInGetPosition(m_hWaveIn, &mmt, sizeof(MMTIME));
m_pWaveHdr.dwBytesRecorded = mmt.u.cb;
if(*(m_pWaveHdr.lpData+m_pWaveHdr.dwBytesRecorded-1)>120)
//if(*(m_pWaveHdr.lpData+m_pWaveHdr.dwBytesRecorded-1)>-50&&*(m_pWaveHdr.lpData+m_pWaveHdr.dwBytesRecorded-1)<50 )
{
//fprintf(stream,"%s %ld %s","reaction_time ",reaction_time,"\t");
printf("\n data %hd",*(m_pWaveHdr.lpData+m_pWaveHdr.dwBytesRecorded-1));
printf("\n point %d",mmt.u.cb);
printf("\n header %d",m_pWaveHdr.lpData);
printf("\n data1 %hd",*(m_pWaveHdr.lpData+5));
fprintf(stream,"%s","\n");
printf("\n data:");
for(i=0;i<mmt.u.cb;i++)
{
printf("%hd ",*(m_pWaveHdr.lpData+i));
}
printf("\n OK!");
break;
}
/* if(getkey()&&pressed==0)
{
fprintf(stream,"wavedata %hd \n ", *(m_pWaveHdr.lpData+m_pWaveHdr.dwBytesRecorded-1) );
}*/
}
/*结束记录声音*/
waveInReset(m_hWaveIn);
/*结束麦克风输入*/
waveInUnprepareHeader(m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR)) ;
GlobalFree(GlobalHandle( m_pWaveHdr.lpData ));
waveInClose(m_hWaveIn);
fclose (stream);
return;
}
可是有些电脑里面程序可以正常使用,有些电脑里面不用任何输入就自动退出了。数据类型是短整形,数值范围-128~127。从得到得数据看,如果没有麦克风输入,数值应该是-128,这样的话程序可以正常运行;但是在很多电脑上,没有声音输入数值也是127,程序就自动退出了。不知道这是为什么?
解决方案1:
扩大此值范围试试。换成无符号型。
解决方案2:帮你顶一下!