2,553
社区成员




#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib, "winmm.lib")
#define BUFFER_SIZE (44100*16*2/8) // 录制声音长度
#define FRAGMENT_SIZE 1024 // 缓存区大小
#define FRAGMENT_NUM 4 // 缓存区个数
static unsigned char buffer[BUFFER_SIZE] = {0};
static int buf_count = 0;
// 函数定义
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2 );
int main()
{
/* 录音 */
HWAVEIN hWaveIn;
WAVEFORMATEX wavform;
int i = 0;
int nReturn = 0;
WAVEINCAPS wic;
static WAVEHDR wh[FRAGMENT_NUM];
// Device
nReturn = waveInGetNumDevs(); //获取系统现在的设备数目
printf("查询到设备数目:%d\n", nReturn);
for (i= 0; i<= nReturn; i++)
{
WAVEINCAPS wic_c;
waveInGetDevCaps(i, &wic_c, sizeof(WAVEINCAPS));
printf("查询 到 设备: %d\t设备名: %s\n", i, wic_c.szPname);
}
// open
wavform.wFormatTag = WAVE_FORMAT_PCM;
wavform.nChannels = 2; //声道 1: 单声道 2: 立体声
wavform.nSamplesPerSec = 44100; //采样率
wavform.nAvgBytesPerSec = 44100*16*2/8;
wavform.nBlockAlign = 4;
wavform.wBitsPerSample = 16;
wavform.cbSize = 0;
waveInOpen(&hWaveIn, WAVE_MAPPER, &wavform, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION);
waveInGetDevCaps((UINT_PTR)hWaveIn, &wic, sizeof(WAVEINCAPS));
printf("打开的音频设备:%s\n", wic.szPname);
// 准备 buffer
for (i=0; i<FRAGMENT_NUM; i++)
{
wh[i].lpData = (char *)malloc(sizeof(char)* FRAGMENT_SIZE);
wh[i].dwBufferLength = FRAGMENT_SIZE;
wh[i].dwBytesRecorded = 0;
wh[i].dwUser = 0;
wh[i].dwFlags = 0;
wh[i].dwLoops = 1;
wh[i].lpNext = NULL;
wh[i].reserved = 0;
waveInPrepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn, &wh[i], sizeof(WAVEHDR));
}
// record
printf("Start to Record...\n");
while(1)
{
waveInStart(hWaveIn);
printf("当前录音帧数:%d\n",++buf_count);
}
printf("Record Over!\n\n");
// clean
waveInStop(hWaveIn);
waveInReset(hWaveIn);
for (i =0; i<FRAGMENT_NUM; i++)
{
waveInUnprepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR));
free (wh[i].lpData);
}
waveInClose(hWaveIn);
return getchar();
}
// 录音回调函数
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD_PTR dwInstance, DWORD_PTR dwParam1,DWORD_PTR dwParam2)
{
WAVEHDR *wavehdr = (WAVEHDR * )dwParam1;
int buf_len = 0;
int result = 0;
if (WIM_DATA == uMsg)
{
//录音设备返回数据时,触发该事件
if(!waveInUnprepareHeader(hwi, wavehdr,sizeof(WAVEHDR)))
{ //可以释放内存。有的情况虽然返回数据,但不能释放内存,
//如使用同一个WAVEHDR增加多个内存块时,会出现上述情况
memcpy(buffer, wavehdr->lpData , FRAGMENT_SIZE);//复制返回数据
buf_len = wavehdr->dwBytesRecorded;//记录录音数据长度
wavehdr->dwUser=0;//恢复设置FRAGMENT_SIZE
wavehdr->dwBufferLength = FRAGMENT_SIZE;
wavehdr->dwFlags=0;
result = waveInPrepareHeader(hwi,wavehdr,sizeof(WAVEHDR));
result = waveInAddBuffer(hwi,wavehdr,sizeof(WAVEHDR));
}
}
}