WaterLin321
一般會員
發表:3 回覆:0 積分:0 註冊:2004-10-11
發送簡訊給我
|
各位大大,我最近在寫一個能夠同時錄音放音的程式,雖然程式可以執行,但是執行的結果一直有問題,已經卡在這邊很久了,拜託各位大大教教我,謝謝
< 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
|