這程式是在記憶體內執行錄音,播放功能都正常,
只是要把錄下的語音Data用lpWaveHdr->lpData存出去成a.wav.結果卻不對.
是用什麼方式可以抓正確,請分享
//--------------------------------------------------------------------------- #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include <Forms.hpp>
#include
#include
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *RecordButton;
TButton *StopButton;
TTrackBar *TrackBar1;
void __fastcall RecordButtonClick(TObject *Sender);
void __fastcall StopButtonClick(TObject *Sender);
void __fastcall TrackBar1Change(TObject *Sender);
private: // User declarations
unsigned long ulSize;
bool FAllocated;
bool FRecording;
bool FPlaying;
HWAVEIN hwi;
HWAVEOUT hwo;
HGLOBAL HData, HWaveHdr;
LPSTR lpData;
LPWAVEHDR lpWaveHdr; void __fastcall MMWimData(TMessage &Msg);
void __fastcall MMWomDone(TMessage &Msg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
__fastcall ~TForm1();
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(MM_WIM_DATA, TMessage, MMWimData)
MESSAGE_HANDLER(MM_WOM_DONE, TMessage, MMWomDone)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif //--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ ulSize = 100000;
FAllocated = false;
FRecording = false;
FPlaying = false; TrackBar1->Max = 0xFFFF;
TrackBar1->Frequency = 1000; DWORD current_volume;
waveOutGetVolume(0, ¤t_volume);
TrackBar1->Position = TrackBar1->Max - LOWORD(current_volume);
} //---------------------------------------------------------------------------
/********************************************************************** WaveHeader (WAVEHDR) wrapper functions
\*********************************************************************/ bool WaveMakeHeader(unsigned long ulSize, HGLOBAL &HData, HGLOBAL &HWaveHdr,
LPSTR &lpData, LPWAVEHDR &lpWaveHdr)
{
HData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, ulSize);
if (!HData) return false; lpData = (LPSTR)GlobalLock(HData);
if (!lpData)
{
GlobalFree(HData);
return false;
} HWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR));
if (!HWaveHdr)
{
GlobalUnlock(HData);
GlobalFree(HData);
return false;
} lpWaveHdr = (LPWAVEHDR)GlobalLock(HWaveHdr);
if (!lpWaveHdr)
{
GlobalUnlock(HWaveHdr);
GlobalFree(HWaveHdr);
GlobalUnlock(HData);
GlobalFree(HData);
return false;
} ZeroMemory(lpWaveHdr, sizeof(WAVEHDR));
lpWaveHdr->lpData = lpData;
lpWaveHdr->dwBufferLength = ulSize;
return true;
}
//--------------------------------------------------------------------------- void WaveFreeHeader(HGLOBAL &HData, HGLOBAL &HWaveHdr)
{
GlobalUnlock(HWaveHdr);
GlobalFree(HWaveHdr);
GlobalUnlock(HData);
GlobalFree(HData);
}
//--------------------------------------------------------------------------- /********************************************************************** WaveIn (recording) wrapper functions
\*********************************************************************/ bool WaveRecordOpen(LPHWAVEIN lphwi, HWND Hwnd, int nChannels,
long lFrequency, int nBits)
{
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = (WORD)nChannels;
wfx.nSamplesPerSec = (DWORD)lFrequency;
wfx.wBitsPerSample = (WORD)nBits;
wfx.nBlockAlign = (WORD)((wfx.nChannels * wfx.wBitsPerSample) / 8);
wfx.nAvgBytesPerSec = (wfx.nSamplesPerSec * wfx.nBlockAlign);
wfx.cbSize = 0; MMRESULT result = waveInOpen(lphwi, WAVE_MAPPER, &wfx, (LONG)Hwnd, NULL,
CALLBACK_WINDOW); if (result == MMSYSERR_NOERROR) return true;
return false;
}
//--------------------------------------------------------------------------- bool WaveRecordBegin(HWAVEIN hwi, LPWAVEHDR &lpWaveHdr)
{
MMRESULT result = waveInPrepareHeader(hwi, lpWaveHdr, sizeof(WAVEHDR));
if (result == MMSYSERR_NOERROR)
{
MMRESULT result = waveInAddBuffer(hwi, lpWaveHdr, sizeof(WAVEHDR));
if (result == MMSYSERR_NOERROR)
{
MMRESULT result = waveInStart(hwi);
if (result == MMSYSERR_NOERROR) return true;
}
}
return false;
}
//--------------------------------------------------------------------------- void WaveRecordEnd(HWAVEIN hwi, LPWAVEHDR &lpWaveHdr)
{
waveInStop(hwi);
waveInReset(hwi);
waveInUnprepareHeader(hwi, lpWaveHdr, sizeof(WAVEHDR));
}
//--------------------------------------------------------------------------- void WaveRecordClose(HWAVEIN hwi)
{
waveInReset(hwi);
waveInClose(hwi);
}
//--------------------------------------------------------------------------- /********************************************************************** WaveOut (playback) wrapper functions
\*********************************************************************/ bool WavePlayOpen(LPHWAVEOUT lphwo, HWND Hwnd, int nChannels,
long lFrequency, int nBits)
{
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = (WORD)nChannels;
wfx.nSamplesPerSec = (DWORD)lFrequency;
wfx.wBitsPerSample = (WORD)nBits;
wfx.nBlockAlign = (WORD)((wfx.nChannels * wfx.wBitsPerSample) / 8);
wfx.nAvgBytesPerSec = (wfx.nSamplesPerSec * wfx.nBlockAlign);
wfx.cbSize = 0; MMRESULT result = waveOutOpen(lphwo, WAVE_MAPPER, &wfx, (LONG)Hwnd, NULL,
CALLBACK_WINDOW); if (result == MMSYSERR_NOERROR) return true;
return false;
}
//--------------------------------------------------------------------------- bool WavePlayBegin(HWAVEOUT hwo, LPWAVEHDR &lpWaveHdr)
{
MMRESULT result = waveOutPrepareHeader(hwo, lpWaveHdr, sizeof(WAVEHDR));
if (result == MMSYSERR_NOERROR)
{
MMRESULT result = waveOutWrite(hwo, lpWaveHdr, sizeof(WAVEHDR));
if (result == MMSYSERR_NOERROR) return true;
} return false;
}
//--------------------------------------------------------------------------- void WavePlayEnd(HWAVEOUT hwo, LPWAVEHDR &lpWaveHdr)
{
waveOutReset(hwo);
waveOutUnprepareHeader(hwo, lpWaveHdr, sizeof(WAVEHDR));
}
//--------------------------------------------------------------------------- void WavePlayClose(HWAVEOUT hwo)
{
waveOutReset(hwo);
waveOutClose(hwo);
}
//--------------------------------------------------------------------------- /********************************************************************** Example usage...
\*********************************************************************/
__fastcall TForm1::~TForm1()
{
if (FAllocated) WaveFreeHeader(HData, HWaveHdr);
if (FRecording) WaveRecordClose(hwi);
if (FPlaying) WavePlayClose(hwo); }
void __fastcall TForm1::RecordButtonClick(TObject *Sender)
{
if (WaveRecordOpen(&hwi, Handle, 2, 44100, 16))
{
if (WaveMakeHeader(ulSize, HData, HWaveHdr, lpData, lpWaveHdr))
{
FAllocated = true;
if (WaveRecordBegin(hwi, lpWaveHdr))
{
FRecording = true;
Caption = "Recording..."; //Shape1->Brush->Color = clRed;
StopButton->Enabled = true;
RecordButton->Enabled = false;
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StopButtonClick(TObject *Sender)
{
if (FRecording)
{
WaveRecordEnd(hwi, lpWaveHdr);
FRecording = false;
}
if (FPlaying)
{
WavePlayEnd(hwo, lpWaveHdr);
FPlaying = false;
//Shape2->Brush->Color = clBlack;
StopButton->Enabled = false;
} }
//---------------------------------------------------------------------------
void __fastcall TForm1::MMWimData(TMessage &Msg)
{ char *pBuffer;
Caption = "DONE RECORDING";
if (FRecording) WaveRecordEnd(hwi, lpWaveHdr);
// pBuffer= (char*)(lpWaveHdr(lParam)->lpData);
// pBuffer= (char*)(lpWaveHdr->lpData);
pBuffer= lpWaveHdr->lpData;//<===========
TMemoryStream *Stream = new TMemoryStream;
Stream->Size=sizeof(WAVEHDR);
Stream->Position=0;
//Stream->Write((char*)((lpWaveHdr->lpData)) ,80000 );
//Stream->Write((char*)((lpWaveHdr->lpData)) , lpWaveHdr->dwBufferLength);
Stream->Write((char*)(pBuffer) , ulSize);
Stream->Position=0;
Stream->SaveToFile("c:\\a.wav"); delete Stream;
WaveRecordClose(hwi);
if (WavePlayOpen(&hwo, Handle, 2, 44100, 16))
{
ShowMessage("Click OK to begin play"); if (WavePlayBegin(hwo, lpWaveHdr))
{
FPlaying = true;
Caption = "Playing...";
}
WavePlayOpen(&hwo, Handle, 2, 44100, 16);
WavePlayBegin(hwo, lpWaveHdr);
}
//=============================================
if (WavePlayOpen(&hwo, Handle, 2, 44100, 16))
{
ShowMessage("Click OK to begin play "); if (WavePlayBegin(hwo, lpWaveHdr))
{
FPlaying = true;
Caption = "Playing..."; }
}
//============================================= } void __fastcall TForm1::MMWomDone(TMessage &Msg)
{
Caption = "DONE PLAYING";
WavePlayClose(hwo);
RecordButton->Enabled = true;
StopButton->Enabled = false;
// Shape2->Brush->Color = clBlack;
}
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
DWORD new_volume = (DWORD)MAKEWPARAM(TrackBar1->Max - TrackBar1->Position,
TrackBar1->Max - TrackBar1->Position);
waveOutSetVolume((HWAVEOUT)WAVE_MAPPER, new_volume);
}
//---------------------------------------------------------------------------