使用WAVE录入音频,装成DLL
声明头
#pragma once

#ifdef AUDIORECORD_EXPORT
#define AUDIORECORD_API extern "C" _declspec (dllexport)
#else
#define AUDIORECORD_API extern "C" _declspec (dllimport)
#endif

#include <windows.h>

typedef HRESULT (CALLBACK *LPAUDIORECORD_PROCEDURE)(unsigned char*,int);

LRESULT OnAudioData(WPARAM wParam,LPARAM lParam);
DWORD WINAPI Proc(LPVOID lpParameter);

AUDIORECORD_API bool __stdcall ReleaseRecord();
AUDIORECORD_API bool __stdcall BeginRecord(LPAUDIORECORD_PROCEDURE _callback);
实现体
1 #define AUDIORECORD_EXPORT
2 #include "AudioRecord.h"
3 #include <mmsystem.h>
4 #include <mmreg.h>
5 #pragma comment(lib,"Winmm.lib")
6 #include <stdlib.h>
7 #include <malloc.h>
8 #include <stdio.h>
9 #include <conio.h>
10
11 WAVEHDR hdr ;
12 WAVEFORMATEX format;
13 HWAVEIN hwin;
14 LPAUDIORECORD_PROCEDURE callback;
15 bool running;
16 DWORD dwThreadId = 0;
17
18 DWORD WINAPI RecordProc(LPVOID lpParameter)
19 {
20 MSG msg;
21 while (GetMessage(&msg,NULL,0,0))
22 {
23 switch (msg.message)
24 {
25 case MM_WIM_OPEN:
26 break;
27 case MM_WIM_DATA:
28 OnAudioData(msg.wParam,msg.lParam);
29 break;
30 case MM_WIM_CLOSE:
31 break;
32 default:
33 break;
34 }
35 }
36 return 0;
37 }
38
39 LRESULT OnAudioData(WPARAM wParam,LPARAM lParam)
40 {
41 LPWAVEHDR lpHdr = (LPWAVEHDR) lParam;
42 if(lpHdr->dwBytesRecorded==0 || lpHdr==NULL)
43 return ERROR_SUCCESS;
44
45 ::waveInUnprepareHeader(hwin, lpHdr, sizeof(WAVEHDR));
46
47 // Send recorded audio to remote host
48 callback((unsigned char *)lpHdr->lpData,lpHdr->dwBytesRecorded);
49
50 ::waveInPrepareHeader(hwin,lpHdr, sizeof(WAVEHDR));
51 ::waveInAddBuffer(hwin, lpHdr, sizeof(WAVEHDR));
52
53 return 0l;
54 }
55
56 AUDIORECORD_API bool __stdcall BeginRecord(LPAUDIORECORD_PROCEDURE _callback)
57 {
58 if(_callback == NULL)
59 return false;
60
61 callback = _callback;
62 running = false;
63 format.wFormatTag = WAVE_FORMAT_PCM;
64 format.nChannels = 1;
65 format.wBitsPerSample = 8;
66 format.cbSize = 0;
67 format.nSamplesPerSec = 8000;
68 format.nBlockAlign = 1;
69 format.nAvgBytesPerSec = 8000 ;
70
71
72 ZeroMemory(&hdr, sizeof(WAVEHDR));
73 char* lpByte = (char *)malloc(1024*sizeof(char));
74 if(lpByte==NULL)
75 return false;
76 memset(lpByte,0,_msize(lpByte));
77 hdr.lpData = (LPSTR) lpByte;
78 hdr.dwBufferLength = 1024;
79 hdr.dwBytesRecorded = 0;
80 hdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
81 hdr.dwLoops = 1;
82
83 CloseHandle(CreateThread(NULL,0,RecordProc,NULL,0,&dwThreadId));
84
85 MMRESULT mmReturn = waveInOpen(
86 &hwin,
87 WAVE_MAPPER,
88 &format,
89 dwThreadId,
90 0,
91 CALLBACK_THREAD);
92 if(mmReturn!=MMSYSERR_NOERROR )
93 return false;
94
95 mmReturn = ::waveInPrepareHeader(hwin,&hdr, sizeof(WAVEHDR));
96 mmReturn = ::waveInAddBuffer(hwin, &hdr, sizeof(WAVEHDR));
97
98 mmReturn = ::waveInStart(hwin);
99
100 if(mmReturn != MMSYSERR_NOERROR )
101 return false;
102 running = true;
103 return true;
104 }
105
106 AUDIORECORD_API bool __stdcall ReleaseRecord()
107 {
108 MMRESULT mmReturn = 0;
109 if(running == false)
110 return true;
111
112 mmReturn = ::waveInStop(hwin);
113
114 if(!mmReturn)
115 mmReturn = ::waveInReset(hwin);
116
117 Sleep(500);
118
119 if(!mmReturn)
120 mmReturn = ::waveInClose(hwin);
121
122 PostThreadMessage(dwThreadId,WM_QUIT ,0,0);
123 return true;
124 }
使用WAVE播放音频数据流,装成DLL
声明头
1 #pragma once
2
3 #ifdef AUDIOPLAY_EXPORT
4 #define AUDIOPLAY_API extern "C" _declspec (dllexport)
5 #else
6 #define AUDIOPLAY_API extern "C" _declspec (dllimport)
7 #endif
8
9 #include <windows.h>
10
11 AUDIOPLAY_API bool __stdcall BeginPlay();
12 AUDIOPLAY_API bool __stdcall PlayBlock(unsigned char *lpData,int len);
13 AUDIOPLAY_API bool __stdcall StopPlaying();
14
15 LRESULT EndPlaySoundData(WPARAM wParam,LPARAM lParam);
实现体
1 #define AUDIOPLAY_EXPORT
2 #include "AudioPlay.h"
3 #include <mmsystem.h>
4 #include <mmreg.h>
5 #pragma comment(lib,"Winmm.lib")
6 #include <stdlib.h>
7 #include <malloc.h>
8 #include <stdio.h>
9 #include <conio.h>
10
11 WAVEHDR hdr ;
12 WAVEFORMATEX format;
13 HWAVEOUT hwout;
14 bool running = false;
15 DWORD dwThreadId = 0;
16
17 DWORD WINAPI PlayProc(LPVOID lpParameter)
18 {
19 MSG msg;
20 while (GetMessage(&msg,NULL,0,0))
21 {
22 switch(msg.message)
23 {
24 case MM_WOM_DONE:
25 EndPlaySoundData(msg.wParam,msg.lParam);
26 break;
27 case MM_WOM_CLOSE:
28 break;
29 case MM_WOM_OPEN:
30 break;
31 default:
32 break;
33 }
34 }
35 return 0;
36 }
37
38 AUDIOPLAY_API bool __stdcall BeginPlay()
39 {
40 running = false;
41
42 format.wFormatTag = WAVE_FORMAT_PCM;
43 format.nChannels = 1;
44 format.wBitsPerSample = 8;
45 format.cbSize = 0;
46 format.nSamplesPerSec = 8000;
47 format.nBlockAlign = 1;
48 format.nAvgBytesPerSec = 8000 ;
49
50 CloseHandle(CreateThread(NULL,0,PlayProc,NULL,0,&dwThreadId));
51
52 MMRESULT mmReturn = ::waveOutOpen(
53 &hwout,
54 WAVE_MAPPER,
55 &format,
56 dwThreadId,
57 0,
58 CALLBACK_THREAD);
59 if(mmReturn != MMSYSERR_NOERROR)
60 return false;
61
62 running = true;
63 return true;
64 }
65
66 AUDIOPLAY_API bool __stdcall PlayBlock(unsigned char *lpData,int len)
67 {
68 MMRESULT mmResult = 0;
69 if(running == false)
70 return false;
71 WAVEHDR *lpHdr = new WAVEHDR;
72 memset(lpHdr,0,sizeof(WAVEHDR));
73 lpHdr->lpData = (char *)lpData;
74 lpHdr->dwBufferLength = len;
75 mmResult = ::waveOutPrepareHeader(hwout, lpHdr, sizeof(WAVEHDR));
76 if(mmResult)
77 return ERROR_SUCCESS;
78 mmResult = ::waveOutWrite(hwout, lpHdr, sizeof(WAVEHDR));
79 if(mmResult != MMSYSERR_NOERROR)
80 return false;
81 return true;
82 }
83
84 AUDIOPLAY_API bool __stdcall StopPlaying()
85 {
86 MMRESULT mmReturn = 0;
87 if(running == false)
88 return false;
89 mmReturn = ::waveOutReset(hwout);
90
91 if(mmReturn != MMSYSERR_NOERROR)
92 {
93 running = false;
94 Sleep(500);
95 mmReturn = ::waveOutClose(hwout);
96 }
97 return true;
98 }
99
100 LRESULT EndPlaySoundData(WPARAM wParam,LPARAM lParam)
101 {
102 LPWAVEHDR lpHdr = (LPWAVEHDR) lParam;
103 if(lpHdr != NULL)
104 ::waveOutUnprepareHeader(hwout, lpHdr, sizeof(WAVEHDR));
105 PostThreadMessage(dwThreadId,WM_QUIT ,0,0);
106 return 1l;
107 }
posted on 2009-01-16 14:15
一曲红豆 阅读(306)
评论(0) 编辑 收藏 引用