📄 wave.cpp
字号:
//#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "wave.h"
BOOL DlgProc(HWND, UINT, WPARAM, LPARAM) ;
char temp[0xff];
HINSTANCE hInst;
HWAVEIN hWaveIn,hwaveout;
WAVEFORMATEX waveformatf;
WAVEHDR * wavehdr;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
//添加处理代码;
hInst=hInstance;
DialogBoxParam(hInstance,MAKEINTRESOURCE(1000),0,(DLGPROC)DlgProc,(1000));
return TRUE;
}
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
int lowID;
switch (uMsg){
case WM_INITDIALOG:
LoadIcon( hInst,MAKEINTRESOURCE(10));
//CreateMutex(NULL,FALSE,"MyMutex");
if ( GetLastError() == ERROR_ALREADY_EXISTS )
{
MessageBox(hWnd,"err","err",MB_OK);
EndDialog(hWnd,FALSE);
}
wavehdr=0;
//datasize = 200000;
break;
case WM_COMMAND:
lowID=LOWORD(wParam);
if (lowID==1001)
hWaveIn=OpenWaveIn(hWnd);
StartWaveIn(hWaveIn,20000);
break;
case WM_CLOSE:
EndDialog(hWnd,FALSE);
break;
case MM_WOM_OPEN://准备并开始回放
//MessageBox(0,"MM_WOM_OPEN:","err",MB_OK);
break;
case MM_WIM_DATA:
hwaveout=OpenWaveOut(hWnd);
wavehdr=WaveOut(hwaveout,wavehdr,&((PWAVEHDR)lParam)->lpData,20000);
//dwDataLength = ((PWAVEHDR)dwParam2)->dwBytesRecorded ;
//MessageBox(0,"MM_WIM_DATA:","err",MB_OK);
//waveInAddBuffer (hWaveIn, (PWAVEHDR)dwParam2, sizeof (WAVEHDR));
//if (waveInStop(m_hWaveIn) )MessageBox(0,"停止录音失败","err",MB_OK);
//if (waveInReset(m_hWaveIn) )MessageBox(0,"重置内存区失败","err",MB_OK);
//waveInClose (m_hWaveIn);
//waveinclose();
//waveout(hWnd,((PWAVEHDR)lParam)->lpData,((PWAVEHDR)lParam)->dwBytesRecorded );
//MessageBox(hWnd,"Stop","err",MB_OK);
break;
case MM_WOM_DONE:
CloseWaveOut(hwaveout);
CloseWaveIn(hWaveIn);
//释放播放完的缓冲区,并准备新的数据
//waveOutPrepareHeader (hWaveOut,(PWAVEHDR)lParam,sizeof(WAVEHDR));
// waveOutWrite(hWaveOut,(PWAVEHDR)lParam,sizeof(WAVEHDR));
break;
case MM_WIM_CLOSE:
GlobalFree(
GlobalHandle(
((WAVEHDR*)lParam)->lpData
)
);
if (waveInUnprepareHeader(hWaveIn, (WAVEHDR*)lParam, sizeof(WAVEHDR)))
MessageBox(0,"Un_Prepare Header 失败","err",MB_OK);
GlobalFree(GlobalHandle(lParam));
break;
default:
return FALSE;
}
return TRUE;
}
HWAVEIN OpenWaveIn(HWND hWnd)
{
HWAVEIN m_hWaveIn;
WAVEFORMATEX waveformat;
ZeroMemory(&waveformat,0,sizeof(waveformat));
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels=1;
waveformat.nSamplesPerSec=8000;
waveformat.nAvgBytesPerSec=8000;
waveformat.nBlockAlign=1;
waveformat.wBitsPerSample=8; //指定录音格式
waveformat.cbSize=0;
if (!waveInGetNumDevs())
{
//ssageBox(0,"没有可以使用的 waveIn 通道","err",MB_OK);
return -1;
}
if (waveInOpen(
&m_hWaveIn, //输入设备句柄
WAVE_MAPPER, //输入设备ID
&waveformat, //录音格式指针
hWnd, //处理MM_WIM_***消息的回调函数或窗口句柄,线程ID
0, // DWORD dwCallbackInstance,
CALLBACK_WINDOW //CALLBACK_WINDOW 处理消息方式的符号位
)!= MMSYSERR_NOERROR )return -1;// MessageBox(0,"打开 waveIn 通道失败","err",MB_OK);
return m_hWaveIn;
}
WAVEHDR* StartWaveIn(HWAVEIN m_hWaveIn,DWORD datasize)
{
WAVEHDR * m_pWaveHdr;
m_pWaveHdr=(WAVEHDR *)GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, sizeof(WAVEHDR));
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;
if ( waveInPrepareHeader( m_hWaveIn, m_pWaveHdr, sizeof(WAVEHDR) )!= MMSYSERR_NOERROR )
return 0;//MessageBox(0,"打开 waveIn 通道失败","err",MB_OK);
waveInAddBuffer (m_hWaveIn, m_pWaveHdr, sizeof (WAVEHDR));
if (waveInStart(m_hWaveIn) )return 0;//MessageBox(0,"开始录音失败","err",MB_OK);
return m_pWaveHdr;
}
int CloseWaveIn(HWAVEIN m_hWaveIn)
{
if (waveInStop(m_hWaveIn)== MMSYSERR_NOERROR )return -1; //关闭录音设备失败
if (!waveInClose(m_hWaveIn)==MMSYSERR_NOERROR)return -1;//Global Free 失败
return 0;
}
HWAVEOUT OpenWaveOut(HWND hWnd)
{
WAVEFORMATEX waveform;
HWAVEOUT hWaveOut;
waveform.wFormatTag =WAVE_FORMAT_PCM;
waveform.nChannels =1;
waveform.nSamplesPerSec =8000;
waveform.nAvgBytesPerSec=8000;
waveform.nBlockAlign =1;
waveform.wBitsPerSample =8;
waveform.cbSize =0;
if (waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,hWnd,NULL,CALLBACK_WINDOW))return -1;
return hWaveOut;
}
WAVEHDR * WaveOut(HWAVEOUT hWaveOut,WAVEHDR * m_pWaveHd,LPSTR *buf,DWORD dwDataLength)
{
if(m_pWaveHd==0)m_pWaveHd=(WAVEHDR*)GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, sizeof(WAVEHDR));
if(*buf==0)*buf=(LPTSTR)GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, dwDataLength);
m_pWaveHd->lpData = *buf ;
m_pWaveHd->dwBufferLength = dwDataLength ;
m_pWaveHd->dwBytesRecorded = 0 ;
m_pWaveHd->dwUser = 0 ;
m_pWaveHd->dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
m_pWaveHd->dwLoops = 1 ;
m_pWaveHd->lpNext = NULL ;
m_pWaveHd->reserved = 0 ;
waveOutPrepareHeader (hWaveOut,m_pWaveHd,sizeof (WAVEHDR)) ;
//回放开始
//MessageBeep(MB_ICONEXCLAMATION);
waveOutWrite (hWaveOut,m_pWaveHd, sizeof (WAVEHDR));
}
int CloseWaveOut(HWAVEOUT hWaveOut)
{
waveOutRestart(hWaveOut);
waveOutClose(hWaveOut);
}
DWORD FCC(LPSTR lpStr)
{
DWORD Number = lpStr[0] + lpStr[1] *0x100 + lpStr[2] *0x10000 + lpStr[3] *0x1000000 ;
return Number;
}
void saveFile(HWND hWnd,LPTSTR pSaveBuffer,DWORD dwDataLength)
{
HANDLE FileHandle;
DWORD NumToWrite=0;
DWORD dwNumber = 0;
FileHandle =CreateFile( "myTest.wav", GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// memset(m_pWaveHdr.lpData, 0, datasize);
// 拷贝刚录制的缓存中的内容进入保存数据区,dwDataLength为数据区中已有内容
/*CopyMemory (pSaveBuffer + dwDataLength, ((PWAVEHDR) lParam)->lpData,
((PWAVEHDR) lParam)->dwBytesRecorded) ;
dwDataLength += ((PWAVEHDR) lParam)->dwBytesRecorded ;
*/
dwNumber = FCC("RIFF");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = dwDataLength + 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, &waveformatf, sizeof(WAVEFORMATEX), &NumToWrite, NULL);
dwNumber = FCC("data");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = dwDataLength;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, pSaveBuffer, dwNumber, &NumToWrite, NULL);
//waveout
SetEndOfFile(FileHandle);
CloseHandle( FileHandle ); FileHandle = INVALID_HANDLE_VALUE; // 收尾关闭句柄
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -