23,121
社区成员
发帖
与我相关
我的任务
分享
/* .h */
private: // User declarations
int m_CurOut;
bool m_blWaveOut;
HWAVEOUT hWaveOut;
WAVEFORMATEX waveFormOut;
PWAVEHDR pWaveOut[MAX_INQUEU];
char waveBufferOut[MAX_INQUEU][BUFSIZE];
public: // User declarations
__fastcall TfrmMain(TComponent* Owner);
virtual void __fastcall WndProc(Messages::TMessage &Message);
/* .cpp */ /* 我使用 BCB,使用VC 的代码差不多 */
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "fmMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
hWaveOut = NULL;
m_blWaveOut = false;
for(int i=0; i<MAX_INQUEU; i++)
pWaveOut[i] = (PWAVEHDR)new char[sizeof(WAVEHDR)];
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ButtonStopClick(TObject *Sender)
{
int i;
if(NULL == hWaveOut) return;
if(m_blWaveOut) waveOutReset(hWaveOut);
for(i=0; i<MAX_INQUEU; i++)
{
waveOutUnprepareHeader(hWaveOut, pWaveOut[i], sizeof (WAVEHDR));
}
waveOutClose(hWaveOut);
hWaveOut = NULL;
m_blWaveOut = false;
ButtonPlay->Enabled = true;
ButtonStop->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ButtonPlayClick(TObject *Sender)
{
ButtonStopClick(ButtonStop);
int i, j;
int miny, maxy, cycle;
int lasty, cury;
int freq[10] = {500, 1000};
for(i=1; i<10; i++) // for(i=1; i<ComboBoxFreq->Items->Count; i++)
freq[i] = freq[i-1]* 2;
// if(-1 == ComboBoxFreq->ItemIndex) ComboBoxFreq->ItemIndex = ComboBoxFreq->Items->Count- 1;
int step = BUFSIZE* MAX_INQUEU/ freq[0]; // [ComboBoxFreq->ItemIndex]; // 使用 500Hz
int counter = 0;
double ft = 0.0;
double ft_inc;
ft_inc = 2* 3.14159265389/ 4410; // 10Hz
for(i=0; i<MAX_INQUEU; i++)
{
for(j=0; j<BUFSIZE; j++)
{
waveBufferOut[i][j] = 128+ 127* sin(ft);
ft += ft_inc;
if(0 ==((++counter) % step))
{
ft_inc = (10+ 1.0*counter/step)* 2* 3.14159265389/ BUFSIZE;
}
}
}
waveFormOut.wFormatTag = WAVE_FORMAT_PCM;
waveFormOut.nChannels = 1;
waveFormOut.nSamplesPerSec = BUFSIZE;
waveFormOut.nAvgBytesPerSec = BUFSIZE;
waveFormOut.nBlockAlign = 1;
waveFormOut.wBitsPerSample = 8;
waveFormOut.cbSize = 0;
if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveFormOut, (DWORD)Handle, NULL, CALLBACK_WINDOW))
{
ShowMessage("waveOutOpen is failed!");
return;
}
for(i=0; i<MAX_INQUEU; i++)
{
if(NULL == pWaveOut[i]) continue;
pWaveOut[i]->lpData = waveBufferOut[i];
pWaveOut[i]->dwBufferLength = BUFSIZE;
pWaveOut[i]->dwBytesRecorded = 0;
pWaveOut[i]->dwUser = 0;
pWaveOut[i]->dwFlags = WHDR_BEGINLOOP;
pWaveOut[i]->dwLoops = 1;
pWaveOut[i]->lpNext = NULL;
pWaveOut[i]->reserved = 0;
}
m_CurOut = MAX_INQUEU- 1;
for(i=0; i<MAX_INQUEU-1; i++)
{
// Prepare and write
waveOutPrepareHeader(hWaveOut, pWaveOut[i], sizeof(WAVEHDR));
waveOutWrite(hWaveOut, pWaveOut[i], sizeof(WAVEHDR));
}
ButtonPlay->Enabled = false;
ButtonStop->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormDestroy(TObject *Sender)
{
for(int i=0; i<MAX_INQUEU; i++)
if(pWaveOut[i]) delete []pWaveOut[i];
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::WndProc(Messages::TMessage &Message)
{
switch(Message.Msg)
{
case MM_WOM_DONE: // 播放结束
waveOutUnprepareHeader((HWAVEOUT)Message.WParam, (PWAVEHDR)Message.LParam, sizeof(WAVEHDR));
waveOutPrepareHeader(hWaveOut, pWaveOut[m_CurOut], sizeof(WAVEHDR));
waveOutWrite(hWaveOut, pWaveOut[m_CurOut], sizeof(WAVEHDR));
if(++m_CurOut >= MAX_INQUEU) m_CurOut = 0;
break;
case MM_WOM_OPEN: // 打开输出设备
//StatusBar->Panels->Items[0]->Text = "正在输出";
m_blWaveOut = true;
break;
case MM_WOM_CLOSE:
//StatusBar->Panels->Items[0]->Text = "没有输出";
break;
case MM_WIM_OPEN: // 打开输入设备
//StatusBar->Panels->Items[1]->Text = "正在输入";
break;
case MM_WIM_CLOSE:
//StatusBar->Panels->Items[1]->Text = "没有输入";
break;
}
TForm::WndProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
ButtonStopClick(ButtonStop);
}