描述:
            源程序如下:从麦克风读入声音,如果声音够大就退出,显示读入的声音。
#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:帮你顶一下!

