所用庫:
#include "mmsystem.h"
採集輸入設備音頻
void RecordWave()
{
//返回系統中的輸入設備數量
int count = waveInGetNumDevs();
printf("\n音頻輸入數量:%d\n", count);
//檢查指定輸入設備特性 參數:輸入設備標識/句柄;結構體指針;結構體大小
WAVEINCAPS waveIncaps;
MMRESULT mmResult = waveInGetDevCaps(0, &waveIncaps, sizeof(WAVEINCAPS));
//WAVEINCAPS 結構體參數:wMid驅動程序標識、wPid輸入設備產品標識、vDriverVersion驅動程序版本號、szPname[MAXPNAMELEN]製造商名稱、dwFormats支持的格式、wChannels支持的聲道數
printf("\n音頻輸入設備:%s\n", waveIncaps.szPname);
//MMSYSERR_NOERROR執行成功;MMSYSERR_BADDEVICEID索引越界;MMSYSERR_NODRIVER沒有就緒的設備;不能分配或者鎖定內存
if (MMSYSERR_NOERROR == mmResult)
{
HWAVEIN phwi;
WAVEFORMATEX pwfx;
WaveInitFormat(&pwfx, 1, 8000, 8);
printf("\n請求打開音頻輸入設備");
printf("\n採樣參數:單聲道 8kHz 8bit\n");
//打開指定的音頻輸入設備開始錄音 參數:接收打開的音頻輸入設備標識的HWAVEIN結構的指針;指定一個需要打開的設備標識.可以使用WAVE_MAPPER選擇一個按指定錄音格式錄音的設備;一個所需格式進行錄音的指針;指向一個回調函數、打開設備的方法標識
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;//爲緩衝區提供的信息,在waveInPrepareHeader函數中使用WHDR_PREPARED
//爲音頻輸入設備準備一個緩衝區 參數:音頻輸入設備句柄;指向WACEHDR結構的指針,標識準備的緩衝區;結構體大小
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
mmResult = waveInClose(phwi);
printf("\n請求開始錄音\n");
}
}
}
}
}
DWORD CALLBACK MicCallback(HWAVEIN hwavein, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
switch (uMsg)
{
case WIM_OPEN:
printf("\n設備已經打開...\n");
break;
case WIM_DATA:
printf("\n緩衝區%d存滿...\n", ((LPWAVEHDR)dwParam1)->dwUser);
waveInAddBuffer(hwavein, (LPWAVEHDR)dwParam1, sizeof(WAVEHDR));
break;
case WIM_CLOSE:
printf("\n設備已經關閉...\n");
break;
default:
break;
}
return 0;
}
void WaveInitFormat(LPWAVEFORMATEX m_WaveFormat, WORD nCh, DWORD nSampleRate, WORD BitsPerSample)
{
m_WaveFormat->wFormatTag = WAVE_FORMAT_PCM;
m_WaveFormat->nChannels = nCh;
m_WaveFormat->nSamplesPerSec = nSampleRate;
m_WaveFormat->nAvgBytesPerSec = nSampleRate * nCh * BitsPerSample / 8;
m_WaveFormat->nBlockAlign = m_WaveFormat->nChannels * BitsPerSample / 8;
m_WaveFormat->wBitsPerSample = BitsPerSample;
m_WaveFormat->cbSize = 0;
}
播放音頻
void PlayMusic()
{
int error = mciSendString("open C:\\Users\\Angel\\Desktop\\有多少愛可以重來.mp3 alias myDivece", NULL, 0, NULL);
if (error == 0)
{
mciSendString("play myDivece", NULL, 0, NULL); //播放
}
}