源码:
// SoundRecard.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <Mmsystem.h>
#include <string>
#pragma comment(lib, "winmm.lib")
using namespace std;
HWAVEIN hWaveIn; //输入设备
HWAVEOUT hWaveOut; //输出设备
WAVEFORMATEX waveform; //定义音频流格式
BYTE *pBuffer; //输入音频缓冲区(左右声道)
WAVEHDR wavehdr_input; //输入音频头
WAVEHDR wavehdr_output; //输出音频头
WAVEINCAPS waveincaps;
WAVEOUTCAPS waveoutcaps;
static BYTE* File = (BYTE*)malloc(sizeof(BYTE) * 512);
static DWORD dwBytesRecorded = 0;
static BOOL Flag = TRUE;
void GetInputInfo();
void GetOutputInfo();
void InitWaveform();
void Record();
void Player();
void CALLBACK CallBack(HWAVEIN hwi, // 设备句柄
UINT uMsg, // 消息
DWORD_PTR dwInstance, // 对象
DWORD_PTR dwParam1, // 参数1
DWORD_PTR dwParam2); // 参数2
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveingetnumdevs
//官网:https://docs.microsoft.com/en-us/previous-versions/dd743841(v=vs.85)
void GetInputInfo() {
cout << "***********************************************" << endl;
cout << "****************** InputInfo ******************" << endl;
cout << "***********************************************" << endl;
int count = waveInGetNumDevs();
cout << "The Number Of Waveform-Audio Input Devices:" << count << endl;
MMRESULT mmresult = waveInGetDevCapsW(0, &waveincaps, sizeof(WAVEINCAPS));
cout << "WAVEINCAPS:" << endl;
cout << "Waveincaps.dwFormats:" << waveincaps.dwFormats << endl;
cout << "Waveincaps.szPname:" << waveincaps.szPname << endl;
cout << "Waveincaps.vDriverVersion:" << waveincaps.vDriverVersion << endl;
cout << "Waveincaps.wChannels:" << waveincaps.wChannels << endl;
cout << "Waveincaps.wMid:" << waveincaps.wMid << endl;
cout << "Waveincaps.wPid:" << waveincaps.wPid << endl;
cout << "Waveincaps.wReserved1:" << waveincaps.wReserved1 << endl;
}
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutgetnumdevs
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutgetdevcaps
void GetOutputInfo() {
cout << "***********************************************" << endl;
cout << "***************** OutputInfo ******************" << endl;
cout << "***********************************************" << endl;
int count = waveOutGetNumDevs();
cout << "The Number Of Waveform-Audio Output Devices:" << count << endl;
MMRESULT mmresult = waveOutGetDevCapsW(0, &waveoutcaps, sizeof(WAVEOUTCAPS));
cout << "WAVEOUTCAPS:" << endl;
cout << "Waveoutcaps.dwFormats:" << waveoutcaps.dwFormats << endl;
cout << "Waveoutcaps.dwSupport:" << waveoutcaps.dwSupport << endl;
cout << "Waveoutcaps.szPname:" << waveoutcaps.szPname << endl;
cout << "Waveoutcaps.vDriverVersion:" << waveoutcaps.vDriverVersion << endl;
cout << "Waveoutcaps.wChannels:" << waveoutcaps.wChannels << endl;
cout << "Waveoutcaps.wMid:" << waveoutcaps.wMid << endl;
cout << "Waveoutcaps.wPid:" << waveoutcaps.wPid << endl;
cout << "Waveoutcaps.wReserved1:" << waveoutcaps.wReserved1 << endl;
}
void InitWaveform() {
// 设置音频流格式
waveform.nSamplesPerSec = 44100; // 采样率
waveform.wBitsPerSample = 16; // 采样精度
waveform.nChannels = 2; // 声道个数
waveform.cbSize = 0; // 额外空间
waveform.wFormatTag = WAVE_FORMAT_PCM; // 音频格式
waveform.nBlockAlign = (waveform.wBitsPerSample * waveform.nChannels) / 8; // 块对齐
waveform.nAvgBytesPerSec = waveform.nBlockAlign * waveform.nSamplesPerSec; // 传输速率
//分配内存
pBuffer = new BYTE[1024 * 1024];
memset(pBuffer, 0, 1024 * 1024); // 内存置0
// 设置音频头
wavehdr_input.lpData = (LPSTR)pBuffer; // 指向buffer
wavehdr_input.dwBufferLength = 1024 * 1024; // buffer大小
wavehdr_input.dwBytesRecorded = 0; // buffer存放大小
wavehdr_input.dwUser = 0;
wavehdr_input.dwFlags = 0;
wavehdr_input.dwLoops = 1;
}
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveinopen
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveinprepareheader
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveinaddbuffer
void Record() {
memset(pBuffer, 0, 1024 * 1024); // 内存置0
// 开启录音
MMRESULT mRet = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, (DWORD_PTR)CallBack, NULL, CALLBACK_FUNCTION);
waveInPrepareHeader(hWaveIn, &wavehdr_input, sizeof(WAVEHDR)); //准备buffer
waveInAddBuffer(hWaveIn, &wavehdr_input, sizeof(WAVEHDR)); //添加buffer
cout << "开始录音......" << endl;
waveInStart(hWaveIn);
cout << "正在录音......" << endl;
getchar();
Flag = FALSE;
//waveInStop(hWaveIn);
waveInReset(hWaveIn);
waveInClose(hWaveIn);
cout << "录音结束......" << endl;
}
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutopen
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutprepareheader
//官网:https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-waveoutwrite
void Player() {
// 播放录音
HANDLE Wait = CreateEvent(NULL, 0, 0, NULL);
waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveform, (DWORD_PTR)Wait, NULL, CALLBACK_EVENT);
wavehdr_output.lpData = (LPSTR)File; // 指向buffer
wavehdr_output.dwBufferLength = dwBytesRecorded; // buffer大小
wavehdr_output.dwBytesRecorded = dwBytesRecorded;
wavehdr_output.dwFlags = 0;
wavehdr_output.dwLoops = 1;
cout << "开始播放录音......" << endl;
ResetEvent(Wait);
waveOutPrepareHeader(hWaveOut, &wavehdr_output, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &wavehdr_output, sizeof(WAVEHDR));
DWORD dw = WaitForSingleObject(Wait, INFINITE);
if (dw == WAIT_OBJECT_0)
{
cout << "播放录音结束......" << endl;
}
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
}
void CALLBACK CallBack(HWAVEIN hwi, // 设备句柄
UINT uMsg, // 消息
DWORD_PTR dwInstance, // 对象
DWORD_PTR dwParam1, // 参数1
DWORD_PTR dwParam2) // 参数2
{
// 获取音频头
PWAVEHDR PWaveHdr = (PWAVEHDR)dwParam1;
// 处理消息
switch (uMsg)
{
case WIM_OPEN: // 打开录音设备
cout << "录音设备打开成功" << endl;
break;
case WIM_DATA: // 缓冲区已满
{
// 缓冲池信息
cout << "已存储的数据大小:" << dwBytesRecorded << "byte" << endl;
DWORD BytesRecorded = PWaveHdr->dwBytesRecorded;
dwBytesRecorded += BytesRecorded;
// 缓冲扩增
File = (BYTE*)realloc(File, dwBytesRecorded * sizeof(BYTE));
// 存储新内容
if (File)
{
memcpy(&File[dwBytesRecorded - BytesRecorded], PWaveHdr->lpData, BytesRecorded);
cout << "当前缓冲数据大小:" << dwBytesRecorded << "byte" << endl;
}
// 循环
if (Flag)
{
// 加入缓存
cout << "存储数据到缓存中......" << endl;
waveInAddBuffer(hwi, PWaveHdr, sizeof(WAVEHDR));
}
}
break;
case WIM_CLOSE: // 关闭录音设备
cout << "成功关闭录音设备" << endl;
break;
default:
cout << "录音设备信息异常" << endl;
break;
}
}
int main()
{
GetInputInfo();
GetOutputInfo();
InitWaveform();
cout << "***********************************************" << endl;
cout << "***********************************************" << endl;
Record();
Player();
system("pause");
return 0;
}