录音器代码纯win32/C++

24 篇文章 1 订阅
23 篇文章 1 订阅
1.第一个可用的完整代码,程序运行后,按ctrl+c结束程序的运行。

// waveSample.cpp : Defines the entry point for the consoleapplication.
//
#include “stdio.h”
#include "stdlib.h"
#include "windows.h"
#include "mmsystem.h"
#pragma comment(lib,"Winmm.lib")

static const int HDRCOUNT = 10;

int main(int argc, char* argv[])
{
// Wave格式,只描述一般通用的格式信息
WAVEFORMATEX waveformat ={WAVE_FORMAT_PCM,//wFormatTag,格式标志
2, // nChannels,通道数,单声道数据用单通道,立体声通道用双通道
44100, // nSamplesPerSec,采样率(HZ),每秒钟采取样本的次数
176400, // nAvgBytesPerSec,每秒转换数据的字节数,forWAVE_FORMAT_PCM,nAvgBytesPerSec = nSamplesPerSec *nBlockAlign
4, // nBlockAlign,每个样本的字节数,for WAVE_FORMAT_PCM,nBlockAlign =(nChannels × wBitsPerSample) / 8
16, // wBitsPerSample,每个样本的位数,forWAVE_FORMAT_PCM,wBitsPerSample必须等于8或者16
0 // cbSize,附加在该结构体后面的格式信息的大小
};


do 
{
// 获取一个音频输入设备的句柄
HWAVEIN hWaveIn; 
// 这个函数很重要,请查看MSDN说明
MMRESULT liRet = waveInOpen(&hWaveIn,WAVE_MAPPER,&waveformat, (DWORD)NULL,0L,CALLBACK_NULL);
if (liRet != MMSYSERR_NOERROR)
{
printf("Open a audio input drive failed.\n");
break;
}

int i;  
WAVEHDR *pWaveHdr[HDRCOUNT]; // 这种结构体用来定义用于标识音频缓冲的头信息
// 这里将缓冲和头信息放在连续的内存段
for (i = 0; i < HDRCOUNT; i++)
{
pWaveHdr[i]= (WAVEHDR*)malloc( 24*1024 + sizeof(WAVEHDR) ); //连续内存块,包括了开辟的缓存
if (pWaveHdr[i] == NULL){
return -1;
}
ZeroMemory( pWaveHdr[i], sizeof(WAVEHDR) );    
pWaveHdr[i]->dwBufferLength = 24*1024; // 缓冲字节数
pWaveHdr[i]->lpData = (LPSTR)(pWaveHdr[i] + 1); //指向缓冲
liRet=waveInPrepareHeader(hWaveIn, pWaveHdr[i],sizeof(WAVEHDR));
if (liRet != MMSYSERR_NOERROR){
printf("Exit7\n");
return -1;
}
liRet=waveInAddBuffer(hWaveIn, pWaveHdr[i],sizeof(WAVEHDR));
if (liRet != MMSYSERR_NOERROR){
printf("Exit6\n");
return -1;
}
}

liRet=waveInStart(hWaveIn);
if (liRet != MMSYSERR_NOERROR){
printf("Exit5\n");
return -1;
}

int nhdr = 0;
FILE *fp = NULL;
errno_t liError = fopen_s(&fp, "hello.wav", "wb");
if(NULL == fp)
{
printf("Open file failed.\n");
return -1;
}
fwrite("RIFF", 1, 4, fp);

unsigned int dwDataLength = 1024*1024;
unsigned int waveformatSize = sizeof WAVEFORMATEX;
unsigned int Sec=(1024*1024 + waveformatSize);
fwrite(&Sec,sizeof(Sec), 1, fp);
fwrite("WAVE",4, 1, fp);
fwrite("fmt ", 1, 4, fp);
fwrite(&waveformatSize, sizeof(waveformatSize), 1,fp);
fwrite(&waveformat.wFormatTag,sizeof(waveformat.wFormatTag), 1,fp);
fwrite(&waveformat.nChannels,sizeof(waveformat.nChannels),1, fp);
fwrite(&waveformat.nSamplesPerSec,sizeof(waveformat.nSamplesPerSec),1, fp);
fwrite(&waveformat.nAvgBytesPerSec,sizeof(waveformat.nAvgBytesPerSec),1, fp);
fwrite(&waveformat.nBlockAlign,sizeof(waveformat.nBlockAlign),1, fp);
fwrite(&waveformat.wBitsPerSample,sizeof(waveformat.wBitsPerSample),1, fp);
fwrite(&waveformat.cbSize,sizeof(waveformat.cbSize), 1,fp);
fwrite("data",4, 1, fp);
fwrite(&dwDataLength,sizeof(dwDataLength), 1, fp);

for(;;){
printf("goto sleep\n");
Sleep(500);
while (pWaveHdr[nhdr]->dwFlags & WHDR_DONE){
printf("do some output: %d!\n", nhdr);
int offset, writed=0;
int length = pWaveHdr[nhdr]->dwBytesRecorded;
for (offset = 0; writed >= 0 && offset < length;offset += writed){
writed = fwrite(pWaveHdr[nhdr]->lpData+offset, 1,length-offset, fp);
printf("write: %d\n", writed);
}
liRet = waveInAddBuffer(hWaveIn, pWaveHdr[nhdr],sizeof(WAVEHDR));            
if (liRet != MMSYSERR_NOERROR){
printf("Exit4dd\n");
return -1;
}
nhdr = (nhdr+1)%HDRCOUNT;
}
}
fclose(fp);

liRet=waveInStop(hWaveIn);
if (liRet != MMSYSERR_NOERROR){
printf("Exit3\n");
return -1;
}

liRet=waveInReset(hWaveIn);
if (liRet != MMSYSERR_NOERROR){
printf("Exit2\n");
return -1;
}

for (i = 0; i < HDRCOUNT; i++){
liRet=waveInUnprepareHeader(hWaveIn, pWaveHdr[i],sizeof(WAVEHDR));
if (liRet != MMSYSERR_NOERROR){
printf("Exit1\n");
return -1;
}
free(pWaveHdr[i]);
}

liRet=waveInClose(hWaveIn);
if (liRet != MMSYSERR_NOERROR){
printf("Exit0\n");
return -1;
}


} while (false);

return 0;
}


2. 第二个程序代码, 程序运行后,按ctrl+c结束程序的运行。
#include "windows.h"
#include "stdio.h"
#include "locale.h"
#include "mmsystem.h"

#pragma comment(lib, "winmm.lib")

#define BLOCK 1024

void PlayMusi();
void writeFormat(WAVEFORMATEX );
DWORD CALLBACK MicCallback(HWAVEIN hwavein, UINT uMsg, DWORDdwInstance, DWORD dwParam1, DWORD dwParam2);
void recordWave();
void openFile();
void CloseDrive();
void closeFile();

FILE *fp = NULL;
HWAVEIN phwi;

void main()
{
openFile();
recordWave();
while(1);
}
void recordWave()
{
setlocale(LC_ALL, "");
int count = waveInGetNumDevs();//1
printf("\n音频输入数量:%d\n",count);

WAVEINCAPS waveIncaps;
MMRESULT mmResult =waveInGetDevCaps(0,&waveIncaps,sizeof(WAVEINCAPS));//2
printf("\n音频输入设备:%S\n",waveIncaps.szPname);
if(MMSYSERR_NOERROR!=mmResult)
{
printf("error\n");
return;
}
WAVEFORMATEX pwfx ={WAVE_FORMAT_PCM,// wFormatTag,格式标志
2, // nChannels,通道数,单声道数据用单通道,立体声通道用双通道
44100, // nSamplesPerSec,采样率(HZ),每秒钟采取样本的次数
176400, // nAvgBytesPerSec,每秒转换数据的字节数,forWAVE_FORMAT_PCM,nAvgBytesPerSec = nSamplesPerSec *nBlockAlign
4, // nBlockAlign,每个样本的字节数,for WAVE_FORMAT_PCM,nBlockAlign =(nChannels × wBitsPerSample) / 8
16, // wBitsPerSample,每个样本的位数,forWAVE_FORMAT_PCM,wBitsPerSample必须等于8或者16
0 // cbSize,附加在该结构体后面的格式信息的大小
};
//WaveInitFormat(&pwfx,1,8000,8);
writeFormat(pwfx);
printf("\n请求打开音频输入设备");
printf("\n采样参数:单声道 8kHz 8bit\n");
mmResult=waveInOpen(&phwi,WAVE_MAPPER,&pwfx,(DWORD)(MicCallback),NULL,CALLBACK_FUNCTION);//3

if(MMSYSERR_NOERROR==mmResult)
{
WAVEHDR pwh1;
char buffer1[10240];
pwh1.lpData=buffer1;
pwh1.dwBufferLength=10240;
pwh1.dwUser=1;
pwh1.dwFlags=0;
mmResult=waveInPrepareHeader(phwi,&pwh1,sizeof(WAVEHDR));//4
printf("\n准备缓冲区1");

WAVEHDR pwh2;
char buffer2[10240];
pwh2.lpData=buffer2;
pwh2.dwBufferLength=10240;
pwh2.dwUser=2;
pwh2.dwFlags=0;
mmResult=waveInPrepareHeader(phwi,&pwh2,sizeof(WAVEHDR));//4
printf("\n准备缓冲区2\n");

if(MMSYSERR_NOERROR==mmResult)
{
mmResult=waveInAddBuffer(phwi,&pwh1,sizeof(WAVEHDR));//5
printf("\n将缓冲区1加入音频输入设备");
mmResult=waveInAddBuffer(phwi,&pwh2,sizeof(WAVEHDR));//5
printf("\n将缓冲区2加入音频输入设备\n");

if(MMSYSERR_NOERROR==mmResult)
{
mmResult=waveInStart(phwi);//6
printf("\n请求开始录音\n");
}
}
}
}
DWORD CALLBACK MicCallback(HWAVEIN hwavein, UINT uMsg, DWORDdwInstance, DWORD dwParam1, DWORD dwParam2)
{
switch(uMsg) 
{
case WIM_OPEN:
printf("\n设备已经打开...\n");
break;

case WIM_DATA:
{
WAVEHDR *pWaveHdr = (WAVEHDR*)dwParam1;
waveInPrepareHeader(hwavein, pWaveHdr, sizeof WAVEHDR);
waveInAddBuffer(hwavein, pWaveHdr, sizeof(WAVEHDR));
pWaveHdr->lpData;
int a = pWaveHdr->dwBufferLength;
int writed = 0;
writed = fwrite(pWaveHdr->lpData , 1, 10240, fp);
printf("\n缓冲区%d存满...\n",((LPWAVEHDR)dwParam1)->dwUser);
}

break;
case WIM_CLOSE:
CloseDrive();
closeFile();
printf("\n设备已经关闭...\n");
break;
default:
break;
}
return 0;
}

void writeFormat(WAVEFORMATEX waveFormat)
{
fwrite("RIFF", 1, 4, fp);
unsigned int dwDataLength = BLOCK * BLOCK;
unsigned int waveFormatSize = sizeof WAVEFORMATEX;
unsigned int Sec = (dwDataLength + waveFormatSize);
fwrite(&Sec,sizeof(Sec), 1, fp);
fwrite("WAVE",4, 1, fp);
fwrite("fmt ", 1, 4, fp);
fwrite(&waveFormatSize, sizeof(waveFormatSize), 1,fp);
fwrite(&waveFormat.wFormatTag,sizeof(waveFormat.wFormatTag), 1,fp);
fwrite(&waveFormat.nChannels,sizeof(waveFormat.nChannels),1, fp);
fwrite(&waveFormat.nSamplesPerSec,sizeof(waveFormat.nSamplesPerSec),1, fp);
fwrite(&waveFormat.nAvgBytesPerSec,sizeof(waveFormat.nAvgBytesPerSec),1, fp);
fwrite(&waveFormat.nBlockAlign,sizeof(waveFormat.nBlockAlign),1, fp);
fwrite(&waveFormat.wBitsPerSample,sizeof(waveFormat.wBitsPerSample),1, fp);
fwrite(&waveFormat.cbSize,sizeof(waveFormat.cbSize), 1,fp);
fwrite("data",4, 1, fp);
fwrite(&dwDataLength,sizeof(dwDataLength), 1, fp);
}

void openFile()
{
fp = fopen("Record.wav", "wb");
}

void closeFile()
{
//关闭文件
fclose(fp);
}

void CloseDrive()
{
//停止设备
if (MMSYSERR_NOERROR != waveInStop(phwi))
{
MessageBox(NULL, L"文件停止设备!", L"success", MB_OK);
}
Sleep(500);
//关闭设备
if (MMSYSERR_NOERROR != waveInClose(phwi))
{
MessageBox(NULL, L"文件关闭设备!", L"success", MB_OK);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值