posts - 0,  comments - 0,  trackbacks - 0
使用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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理



<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

文章档案

最新评论