全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1226
推到 Plurk!
推到 Facebook!

同時錄音放音的問題

尚未結案
WaterLin321
一般會員


發表:3
回覆:0
積分:0
註冊:2004-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-09 20:10:25 IP:213.56.xxx.xxx 未訂閱
各位大大,我最近在寫一個能夠同時錄音放音的程式,雖然程式可以執行,但是執行的結果一直有問題,已經卡在這邊很久了,拜託各位大大教教我,謝謝 < class="code"> //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include <Forms.hpp> #include "windows.h" #include "mmsystem.h" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TMemo *Memo1; TButton *Button1; TButton *Button2; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); private: // User declarations void __fastcall OnWaveMessage(TMessage &Msg); public: // User declarations __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(MM_WIM_OPEN, TMessage, OnWaveMessage) MESSAGE_HANDLER(MM_WIM_DATA, TMessage, OnWaveMessage) MESSAGE_HANDLER(MM_WIM_CLOSE, TMessage, OnWaveMessage) MESSAGE_HANDLER(MM_WOM_OPEN, TMessage, OnWaveMessage) MESSAGE_HANDLER(MM_WOM_DONE, TMessage, OnWaveMessage) MESSAGE_HANDLER(MM_WOM_CLOSE, TMessage, OnWaveMessage) END_MESSAGE_MAP(TForm) }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" #define MAX_AUDIO_IN 12 #define MAX_AUDIO_OUT 36 #define AUDIO_CHANNELS 1 #define AUDIO_SAMPLES_PER_SEC 8000 #define AUDIO_BITS_PER_SAMPLE 8 #define AUDIO_BUFFER_SIZE 4096 int giRecord; int giPlay; HWAVEIN ghWaveIn; HWAVEOUT ghWaveOut; WAVEHDR *gpWaveInHdr[MAX_AUDIO_IN]; WAVEHDR *gpWaveOutHdr[MAX_AUDIO_OUT]; BYTE gpbWaveInBuf[MAX_AUDIO_IN][AUDIO_BUFFER_SIZE]; BYTE gpbWaveOutBuf[MAX_AUDIO_OUT][AUDIO_BUFFER_SIZE]; BYTE gpbWaveMidBuf[AUDIO_BUFFER_SIZE]; //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { giRecord=0; giPlay=0; ghWaveIn=NULL; ghWaveOut=NULL; } //--------------------------------------------------------------------------- __fastcall TForm1::~TForm1() { Button2->Click(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { MMRESULT hRet=S_FALSE; WAVEFORMATEX wfx; //--------------------------------------------------------------------------- // Open record wfx.wFormatTag=WAVE_FORMAT_PCM; wfx.nChannels=AUDIO_CHANNELS; wfx.nSamplesPerSec=AUDIO_SAMPLES_PER_SEC; wfx.wBitsPerSample=AUDIO_BITS_PER_SAMPLE; wfx.nBlockAlign=(WORD)((wfx.nChannels*wfx.wBitsPerSample)/8); wfx.nAvgBytesPerSec=(wfx.nSamplesPerSec*wfx.nBlockAlign); wfx.cbSize=0; hRet=waveInOpen(&ghWaveIn, WAVE_MAPPER, &wfx, NULL, NULL, WAVE_FORMAT_QUERY); hRet=waveInOpen(&ghWaveIn, WAVE_MAPPER, &wfx, (LONG)Handle, NULL, CALLBACK_WINDOW); for(int i=0; ilpData=gpbWaveInBuf[i]; gpWaveInHdr[i]->dwBufferLength=AUDIO_BUFFER_SIZE; hRet=waveInPrepareHeader(ghWaveIn, gpWaveInHdr[i], sizeof(WAVEHDR)); hRet=waveInAddBuffer(ghWaveIn, gpWaveInHdr[i], sizeof(WAVEHDR)); } hRet=waveInStart(ghWaveIn); hRet=waveOutOpen(&ghWaveOut, WAVE_MAPPER, &wfx, NULL, NULL, WAVE_FORMAT_QUERY); hRet=waveOutOpen(&ghWaveOut, WAVE_MAPPER, &wfx, (LONG)Handle, NULL, CALLBACK_WINDOW); for(int i=0; ilpData=gpbWaveOutBuf[i]; gpWaveOutHdr[i]->dwBufferLength=AUDIO_BUFFER_SIZE; gpWaveOutHdr[i]->dwFlags=0; gpWaveOutHdr[i]->reserved=0; hRet=waveOutPrepareHeader(ghWaveOut, gpWaveOutHdr[i], sizeof(WAVEHDR)); } waveOutWrite(ghWaveOut, gpWaveOutHdr[0], sizeof(WAVEHDR)); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { //--------------------------------------------------------------------------- // Close record waveInReset(ghWaveIn); waveInClose(ghWaveIn); ghWaveIn=NULL; //--------------------------------------------------------------------------- // Play close waveOutReset(ghWaveOut); waveOutClose(ghWaveOut); ghWaveOut=NULL; } // end of Button2Click //--------------------------------------------------------------------------- void __fastcall TForm1::OnWaveMessage(TMessage &Msg) { if(Msg.Msg==MM_WIM_OPEN) { } else if(Msg.Msg==MM_WIM_DATA) { waveInUnprepareHeader(ghWaveIn, gpWaveInHdr[giRecord], sizeof(WAVEHDR)); delete gpWaveInHdr[giRecord]; gpWaveInHdr[giRecord]=NULL; gpWaveInHdr[giRecord]=(WAVEHDR*)new BYTE[sizeof(WAVEHDR)]; ZeroMemory(gpWaveInHdr[giRecord], sizeof(WAVEHDR)); gpWaveInHdr[giRecord]->lpData=gpbWaveInBuf[giRecord]; gpWaveInHdr[giRecord]->dwBufferLength=AUDIO_BUFFER_SIZE; ZeroMemory(gpWaveInHdr[giRecord]->lpData, AUDIO_BUFFER_SIZE); CopyMemory(gpbWaveMidBuf, gpWaveInHdr[giRecord]->lpData, AUDIO_BUFFER_SIZE); waveInPrepareHeader(ghWaveIn, gpWaveInHdr[giRecord], sizeof(WAVEHDR)); giRecord ; if(giRecord>=MAX_AUDIO_IN) { giRecord=0; } waveInUnprepareHeader(ghWaveIn, gpWaveInHdr[giRecord], sizeof(WAVEHDR)); waveInPrepareHeader(ghWaveIn, gpWaveInHdr[giRecord], sizeof(WAVEHDR)); waveInAddBuffer(ghWaveIn, gpWaveInHdr[giRecord], sizeof(WAVEHDR)); } else if(Msg.Msg==MM_WIM_CLOSE) { for(int i=0; i=MAX_AUDIO_OUT) { giPlay=0; } waveOutUnprepareHeader(ghWaveOut, gpWaveOutHdr[giPlay], sizeof(WAVEHDR)); delete gpWaveOutHdr[giPlay]; gpWaveOutHdr[giPlay]=NULL; gpWaveOutHdr[giPlay]=(WAVEHDR*)new BYTE[sizeof(WAVEHDR)]; gpWaveOutHdr[giPlay]->lpData=gpbWaveOutBuf[giPlay]; gpWaveOutHdr[giPlay]->dwBufferLength=AUDIO_BUFFER_SIZE; CopyMemory(gpWaveOutHdr[giPlay]->lpData, gpbWaveMidBuf, AUDIO_BUFFER_SIZE); waveOutPrepareHeader(ghWaveOut, gpWaveOutHdr[giPlay], sizeof(WAVEHDR)); waveOutWrite(ghWaveOut, gpWaveOutHdr[giPlay], sizeof(WAVEHDR)); } else if(Msg.Msg==MM_WOM_CLOSE) { for(int i=0; i
系統時間:2024-07-03 5:12:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!