您的位置:首页 > 其它

使用waveIn进行录音

2015-10-15 01:37 260 查看
#include "stdafx.h"

#include <stdlib.h>

#include <windows.h>

#include <mmsystem.h>

static const int HDRCOUNT = 10;

int main(int argc, char* argv[])

{

int i;

WAVEHDR *pWaveHdr[HDRCOUNT];

WAVEFORMATEX waveformat;

waveformat.wFormatTag=WAVE_FORMAT_PCM;

waveformat.nChannels=1;

waveformat.nSamplesPerSec=48000;

waveformat.nAvgBytesPerSec=48000;

waveformat.nBlockAlign=1;

waveformat.wBitsPerSample=8; //指定录音格式

waveformat.cbSize=0;

HWAVEIN hWaveIn;

int error=waveInOpen(&hWaveIn,WAVE_MAPPER, &waveformat, (DWORD)NULL,0L,CALLBACK_NULL);

if (error != MMSYSERR_NOERROR){

printf("Exit8\n");

return -1;

}

for (i = 0; i < HDRCOUNT; i++){

pWaveHdr[i]= (WAVEHDR*)malloc( 24*1024 + sizeof(WAVEHDR) );

if (pWaveHdr[i] == NULL){

return -1;

}

ZeroMemory( pWaveHdr[i], sizeof(WAVEHDR) );

pWaveHdr[i]->dwBufferLength = 24*1024;

pWaveHdr[i]->lpData = (LPSTR)(pWaveHdr[i] + 1);

error=waveInPrepareHeader(hWaveIn, pWaveHdr[i], sizeof(WAVEHDR));

if (error != MMSYSERR_NOERROR){

printf("Exit7\n");

return -1;

}

error=waveInAddBuffer(hWaveIn, pWaveHdr[i], sizeof(WAVEHDR));

if (error != MMSYSERR_NOERROR){

printf("Exit6\n");

return -1;

}

}

error=waveInStart(hWaveIn);

if (error != MMSYSERR_NOERROR){

printf("Exit5\n");

return -1;

}

int nhdr = 0;

FILE *fp = fopen("hello.wav", "wb");

fwrite("RIFF", 1, 4, fp);

unsigned int dwDataLength = 1024*1024;

unsigned int waveformatSize = sizeof WAVEFORMATEX;

unsigned int Sec=(1024*1024 + waveformatSize);

fwrite(&Sec,sizeof(Sec), 1, fp);

fwrite("WAVE",4, 1, fp);

fwrite("fmt
", 1, 4, fp);

fwrite(&waveformatSize, sizeof(waveformatSize), 1, fp);

fwrite(&waveformat.wFormatTag,sizeof(waveformat.wFormatTag), 1, fp);

fwrite(&waveformat.nChannels,sizeof(waveformat.nChannels), 1, fp);

fwrite(&waveformat.nSamplesPerSec,sizeof(waveformat.nSamplesPerSec), 1, fp);

fwrite(&waveformat.nAvgBytesPerSec,sizeof(waveformat.nAvgBytesPerSec), 1, fp);

fwrite(&waveformat.nBlockAlign,sizeof(waveformat.nBlockAlign), 1, fp);

fwrite(&waveformat.wBitsPerSample,sizeof(waveformat.wBitsPerSample), 1, fp);

fwrite(&waveformat.cbSize,sizeof(waveformat.cbSize), 1, fp);

fwrite("data",4, 1, fp);

fwrite(&dwDataLength,sizeof(dwDataLength), 1, fp);

for(;;){

printf("goto
sleep\n");

Sleep(500);

while (pWaveHdr[nhdr]->dwFlags
& WHDR_DONE){

printf("do
some output: %d!\n", nhdr);

int offset, writed=0;

int length = pWaveHdr[nhdr]->dwBytesRecorded;

for (offset = 0; writed >= 0
&& offset < length; offset += writed){

writed = fwrite(pWaveHdr[nhdr]->lpData+offset, 1, length-offset, fp);

printf("write:
%d\n", writed);

}

error = waveInAddBuffer(hWaveIn, pWaveHdr[nhdr], sizeof(WAVEHDR));

if (error != MMSYSERR_NOERROR){

printf("Exit4dd\n");

return -1;

}

nhdr = (nhdr+1)%HDRCOUNT;

}

}

fclose(fp);

error=waveInStop(hWaveIn);

if (error != MMSYSERR_NOERROR){

printf("Exit3\n");

return -1;

}

error=waveInReset(hWaveIn);

if (error != MMSYSERR_NOERROR){

printf("Exit2\n");

return -1;

}

for (i = 0; i < HDRCOUNT; i++){

error=waveInUnprepareHeader(hWaveIn, pWaveHdr[i], sizeof(WAVEHDR));

if (error != MMSYSERR_NOERROR){

printf("Exit1\n");

return -1;

}

free(pWaveHdr[i]);

}

error=waveInClose(hWaveIn);

if (error != MMSYSERR_NOERROR){

printf("Exit0\n");

return -1;

}

return 0;

}
http://blog.chinaunix.net/uid-736168-id-376030.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: