// SoundRecDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SoundRec.h"
#include "SoundRecDlg.h"
#include ".\soundrecdlg.h"
#pragma comment(lib,"winmm.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CSoundRecDlg dialog
CSoundRecDlg::CSoundRecDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSoundRecDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bRun = FALSE;
m_hThread = NULL;
m_hWaveIn = NULL;
m_hOPFile = NULL;
ZeroMemory(&m_stWFEX, sizeof(WAVEFORMATEX));
ZeroMemory(m_stWHDR, MAX_BUFFERS * sizeof(WAVEHDR));
}
void CSoundRecDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSoundRecDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(ID_REC, OnBnClickedRec)
ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse)
ON_CBN_SELCHANGE(IDC_DEVICES, OnCbnSelchangeDevices)
END_MESSAGE_MAP()
// CSoundRecDlg message handlers
BOOL CSoundRecDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
if (FillDevices() <= 0)
{
// AfxMessageBox("NO Input Devices Found..", MB_ICONERROR);
// CDialog::OnOK();
}
wchar_t szFileName[MAX_PATH] = { 0 };
GetModuleFileName(NULL, szFileName, MAX_PATH);
szFileName[lstrlen(szFileName) - 3] = L'\0';
lstrcat(szFileName, L"wav");
GetDlgItem(IDC_FILENAME)->SetWindowText(szFileName);
return TRUE; // return TRUE unless you set the focus to a control
}
UINT CSoundRecDlg::FillDevices()
{
CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_DEVICES);
UINT nDevices, nC1;
WAVEINCAPS stWIC = { 0 };
MMRESULT mRes;
pBox->ResetContent();
nDevices = waveInGetNumDevs();
for (nC1 = 0; nC1 < nDevices; ++nC1)
{
ZeroMemory(&stWIC, sizeof(WAVEINCAPS));
mRes = waveInGetDevCaps(nC1, &stWIC, sizeof(WAVEINCAPS));
if (mRes == 0)
pBox->AddString(stWIC.szPname);
else
StoreError(mRes, TRUE, L"File: %s ,Line Number:%d", __FILE__, __LINE__);
}
if (pBox->GetCount())
{
pBox->SetCurSel(0);
OnCbnSelchangeDevices();
}
return nDevices;
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSoundRecDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSoundRecDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
DWORD WINAPI ThFunc(LPVOID pDt)
{
CSoundRecDlg* pOb = (CSoundRecDlg*)pDt;
pOb->StartRecording();
return 0;
}
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
WAVEHDR* pHdr = NULL;
switch (uMsg)
{
case WIM_CLOSE:
break;
case WIM_DATA:
{
CSoundRecDlg* pDlg = (CSoundRecDlg*)dwInstance;
pDlg->ProcessHeader((WAVEHDR*)dwParam1);
}
break;
case WIM_OPEN:
break;
default:
break;
}
}
VOID CSoundRecDlg::ProcessHeader(WAVEHDR* pHdr)
{
if (!pHdr) {
return;
}
TRACE(_T("mic data:%d"), pHdr->dwBytesRecorded);
MMRESULT mRes = 0;
if (WHDR_DONE == (WHDR_DONE & pHdr->dwFlags))
{
mmioWrite(m_hOPFile, pHdr->lpData, pHdr->dwBytesRecorded);
mRes = waveInAddBuffer(m_hWaveIn, pHdr, sizeof(WAVEHDR));
if (mRes != 0)
StoreError(mRes, TRUE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
}
}
VOID CSoundRecDlg::OpenDevice()
{
int nT1 = 0;
CString csT1;
double dT1 = 0.0;
MMRESULT mRes = 0;
CComboBox* pDevices = (CComboBox*)GetDlgItem(IDC_DEVICES);
CComboBox* pFormats = (CComboBox*)GetDlgItem(IDC_FORMATS);
nT1 = pFormats->GetCurSel();
if (nT1 == -1)
throw _T("");
pFormats->GetLBText(nT1, csT1);
_stscanf((LPTSTR)(LPCTSTR)csT1, _T("%lf"), &dT1);
dT1 = dT1 * 1000;
m_stWFEX.nSamplesPerSec = (int)dT1;
csT1 = csT1.Right(csT1.GetLength() - csT1.Find(',') - 1);
csT1.Trim();
if (csT1.Find(_T("mono")) != -1)
m_stWFEX.nChannels = 1;
if (csT1.Find(_T("stereo")) != -1)
m_stWFEX.nChannels = 2;
csT1 = csT1.Right(csT1.GetLength() - csT1.Find(',') - 1);
csT1.Trim();
_stscanf((LPTSTR)(LPCTSTR)csT1, _T("%d"), &m_stWFEX.wBitsPerSample);
m_stWFEX.wFormatTag = WAVE_FORMAT_PCM;
m_stWFEX.nBlockAlign = m_stWFEX.nChannels * m_stWFEX.wBitsPerSample / 8;
m_stWFEX.nAvgBytesPerSec = m_stWFEX.nSamplesPerSec * m_stWFEX.nBlockAlign;
m_stWFEX.cbSize = sizeof(WAVEFORMATEX);
mRes = waveInOpen(&m_hWaveIn, pDevices->GetCurSel(), &m_stWFEX, (DWORD_PTR)waveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION);
if (mRes != MMSYSERR_NOERROR)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
throw m_csErrorText;
}
GetDlgItem(IDC_FILENAME)->GetWindowText(csT1);
ZeroMemory(&m_stmmIF, sizeof(MMIOINFO));
DeleteFile((LPCTSTR)csT1);
m_hOPFile = mmioOpen((LPTSTR)(LPCTSTR)csT1, &m_stmmIF, MMIO_WRITE | MMIO_CREATE);
if (m_hOPFile == NULL)
throw _T("Can not open file...");
ZeroMemory(&m_stckOutRIFF, sizeof(MMCKINFO));
m_stckOutRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
mRes = mmioCreateChunk(m_hOPFile, &m_stckOutRIFF, MMIO_CREATERIFF);
if (mRes != MMSYSERR_NOERROR)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
throw m_csErrorText;
}
ZeroMemory(&m_stckOut, sizeof(MMCKINFO));
m_stckOut.ckid = mmioFOURCC('f', 'm', 't', ' ');
m_stckOut.cksize = sizeof(m_stWFEX);
mRes = mmioCreateChunk(m_hOPFile, &m_stckOut, 0);
if (mRes != MMSYSERR_NOERROR)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
throw m_csErrorText;
}
nT1 = mmioWrite(m_hOPFile, (HPSTR)&m_stWFEX, sizeof(m_stWFEX));
if (nT1 != sizeof(m_stWFEX))
{
m_csErrorText.Format(_T("Can not write Wave Header..File: %s ,Line Number:%d"), __FILE__, __LINE__);
throw m_csErrorText;
}
mRes = mmioAscend(m_hOPFile, &m_stckOut, 0);
if (mRes != MMSYSERR_NOERROR)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
throw m_csErrorText;
}
m_stckOut.ckid = mmioFOURCC('d', 'a', 't', 'a');
mRes = mmioCreateChunk(m_hOPFile, &m_stckOut, 0);
if (mRes != MMSYSERR_NOERROR)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
throw m_csErrorText;
}
}
VOID CSoundRecDlg::CloseDevice()
{
MMRESULT mRes = 0;
if (m_hWaveIn)
{
UnPrepareBuffers();
mRes = waveInClose(m_hWaveIn);
}
if (m_hOPFile)
{
mRes = mmioAscend(m_hOPFile, &m_stckOut, 0);
if (mRes != MMSYSERR_NOERROR)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
}
mRes = mmioAscend(m_hOPFile, &m_stckOutRIFF, 0);
if (mRes != MMSYSERR_NOERROR)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
}
mmioClose(m_hOPFile, 0);
m_hOPFile = NULL;
}
m_hWaveIn = NULL;
}
VOID CSoundRecDlg::PrepareBuffers()
{
MMRESULT mRes = 0;
int nT1 = 0;
for (nT1 = 0; nT1 < MAX_BUFFERS; ++nT1)
{
m_stWHDR[nT1].lpData = (LPSTR)HeapAlloc(GetProcessHeap(), 8, m_stWFEX.nAvgBytesPerSec);
m_stWHDR[nT1].dwBufferLength = m_stWFEX.nAvgBytesPerSec;
m_stWHDR[nT1].dwUser = nT1;
mRes = waveInPrepareHeader(m_hWaveIn, &m_stWHDR[nT1], sizeof(WAVEHDR));
if (mRes != 0)
{
StoreError(mRes, FALSE, _T("File: %s ,Line Number:%d"), __FILE__, __LINE__);
throw m_csErrorText;
}
mRes = waveInAddBuffer(m_hWaveIn, &m_stWHDR[nT1], sizeof(WAVEHDR));
if (mRes != 0)
{
StoreError
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于c++实现pcm音频流转换为wav格式源码+解决方案sln.zip (19个子文件)
说明.md 97B
pcm-reader.sln 1KB
pcm-reader-demo
SoundRec.vcxproj.user 165B
stdafx.h 2KB
SoundRec.suo 11KB
SoundRec.cpp 2KB
SoundRec.rc 4KB
SoundRecDlg.cpp 14KB
resource.h 794B
SoundRec.vcxproj 6KB
res
SoundRec.manifest 676B
SoundRec.ico 3KB
SoundRec.rc2 386B
SoundRecDlg.h 1KB
SoundRec.aps 38KB
SoundRec.h 484B
SoundRec.vcproj 4KB
SoundRec.vcxproj.filters 2KB
stdafx.cpp 201B
共 19 条
- 1
资源评论
z同学的编程之路
- 粉丝: 1813
- 资源: 2129
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SSCMS登录模块需要的JS文件
- JSP网络购物中心毕业设计(源代码+论文).rar
- 白盒测试报告.docx
- 基于LM5117芯片评估开发板硬件参考设计(原理图+PCB)+中英文数据手册资料.zip
- 照片批量重命名软件(文件批量修改图片文件名)
- app.apk
- 人工智能(AI)是计算机科学的一个分支,旨在开发和应用能够模拟、延伸和扩展人类智能的理论、方法和技术,包括机器人、语言识别、图像
- 嵌入式与物联网开发是当今信息技术领域的两大重要分支,它们相互交织,共同推动着智能化时代的进步 嵌入式开发主要关注在嵌入式操作
- 网络安全,这一看似高深莫测的领域,实则与我们每个人的生活息息相关
- 毕业设计基于深度学习的视觉问答系统源码+文档说明+答辩PPT.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功