// ******************* FileName: WinMain.cpp **********************
// 该源程序需要加入到 VC6 的 Win32 Application 的 empty Project 中
// 请包含我自定义的调试类,见 #include "RunTimeLog.cpp"
// 对于工程的 Link 选项,至少要包含以下库:
//msvcrt.lib kernel32.lib user32.lib Winmm.lib
#define WIN32_LEAN_AND_MEAN // Say No to MFC !!
#include <windows.h>
#include <Mmsystem.h>
char lpTemp[256]="";
void log(char *tip);
DWORD FCC(LPSTR lpStr)
{
DWORD Number = lpStr[0] + lpStr[1] *0x100 + lpStr[2] *0x10000 + lpStr[3] *0x1000000 ;
return Number;
}
int main(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
CreateMutex( NULL, false, "MyMutex");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
log("Exists and Exit");
ExitProcess( NULL);
}
log("Program Start.");
DWORD datasize = 48000;
// 最常用法
WAVEFORMATEX waveformat;
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels=1;
waveformat.nSamplesPerSec=8000;
waveformat.nAvgBytesPerSec=8000;
waveformat.nBlockAlign=1;
waveformat.wBitsPerSample=8; //指定录音格式
waveformat.cbSize=0;
wsprintf(lpTemp,"WAVEFORMATEX size = %lu", sizeof(WAVEFORMATEX) );
log(lpTemp);
HWAVEIN m_hWaveIn;
if ( waveInGetNumDevs()) //检查是否有通道可供使用
{
log("有可以使用的 WaveIn 通道");
}
else
{
log("没有可以使用的 waveIn 通道");
}
int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &waveformat, (DWORD)NULL,0L,CALLBACK_WINDOW); //打开录音设备
if ( res == MMSYSERR_NOERROR )
{
log("打开 waveIn 成功"); // 验证创建是否成功
}
else
{
wsprintf(lpTemp, "打开 waveIn 通道失败,Error_Code = 0x%x", res );
log(lpTemp);
}
WAVEHDR m_pWaveHdr;
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;
wsprintf( lpTemp, "WAVEHDR size = %lu", sizeof(WAVEHDR) );
log(lpTemp);
int resPrepare = waveInPrepareHeader( m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR) ); //准备内存块录音
if ( resPrepare == MMSYSERR_NOERROR)
{
log("准备录音用头文件成功");
}
else
{
wsprintf(lpTemp, "不能开辟录音头文件,Error_Code = 0x%03X", resPrepare );
log(lpTemp);
} // End of 验证开辟缓冲
resPrepare = waveInAddBuffer( m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR) );
if ( resPrepare == MMSYSERR_NOERROR)
{
log("准备录音用内存成功");
}
else
{
wsprintf(lpTemp, "不能开辟录音用缓冲,Error_Code = 0x%03X", resPrepare );
log(lpTemp);
} // End of 验证开辟缓冲
if (! waveInStart(m_hWaveIn) )
{
log("开始录音");
Sleep(32000);
}
else
{
log("开始录音失败");
}
MMTIME mmt;
mmt.wType = TIME_BYTES;
if ( waveInGetPosition(m_hWaveIn, &mmt, sizeof(MMTIME)) )
{
log("不能取得音频长度");
}
else
{
//log( "取得现在音频位置 =", mmt.u.cb );
}
if (mmt.wType == TIME_BYTES)
{
log("得到的 TIME_BYTES 格式的音频长度");
}
else
{
log("指定的 TIME_BYTES 格式音频长度不支持");
}
// if (! waveInStop(m_hWaveIn) ) log.write("停止录音"); else log.write("停止录音失败");
if (! waveInReset(m_hWaveIn) )
{
log("重置内存区成功");
}
else
{
log("重置内存区失败");
}
m_pWaveHdr.dwBytesRecorded = mmt.u.cb;
DWORD NumToWrite=0; DWORD dwNumber = 0;
HANDLE FileHandle = CreateFile( "myTest.wav", GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// memset(m_pWaveHdr.lpData, 0, datasize);
dwNumber = FCC("RIFF");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = m_pWaveHdr.dwBytesRecorded + 18 + 20;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("WAVE");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("fmt ");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = 18L;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, &waveformat, sizeof(WAVEFORMATEX), &NumToWrite, NULL);
dwNumber = FCC("data");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = m_pWaveHdr.dwBytesRecorded;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, m_pWaveHdr.lpData, m_pWaveHdr.dwBytesRecorded, &NumToWrite, NULL);
SetEndOfFile(FileHandle);
CloseHandle( FileHandle );
FileHandle = INVALID_HANDLE_VALUE;
// 收尾关闭句柄
log("应该已生成 myTest.wav 文件");
if ( waveInUnprepareHeader(m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR)) )
{
log("Un_Prepare Header 失败");
}
else
{
log("Un_Prepare Header 成功");
}
if ( GlobalFree(GlobalHandle( m_pWaveHdr.lpData )) )
{
log("Global Free 失败");
}
else
{
log("Global Free 成功");
}
if (res == MMSYSERR_NOERROR ) //关闭录音设备
{
if (waveInClose(m_hWaveIn)==MMSYSERR_NOERROR)
{
log("正常关闭录音设备");
}
else
{
log("非正常关闭录音设备");
ExitProcess(0);
}
}
return 0;
}
void log(char *tip)
{
MessageBox(NULL,tip,"",0);
return;
}
一种简单的用c++实现的录音程序
4星 · 超过85%的资源 需积分: 10 168 浏览量
2011-08-21
20:57:42
上传
评论 2
收藏 21KB RAR 举报
hellblackdragong
- 粉丝: 0
- 资源: 1
最新资源
- 老飞飞搭建基础通用数据库V19数据库.rar
- jquery.js
- 机械设计多工位ACF贴胶带&预压设备sw18可编辑非常好的设计图纸100%好用.zip
- 基于Pytorch复现Point-Transformer,用于ShapeNet数据集点云分割
- 【医学影像分析】2D超声图像的分割检测(Ultrasound Nerve Segmentation - Kaggle数据集)
- 嘎嘎香的五款神仙谷歌插件
- .arch书源导入教程.mp4
- 贪心算法介绍及代码示例讲解
- CR13SP35MSI64 Crystal 水晶报表运行组件最后版本64位
- 图像分类数据集:玉米叶是否感染分类数据集(2分类,包含训练集、验证集)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈