www.pudn.com > readaudioshow.rar > f_main.cpp


//--------------------------------------------------------------------------- 
#include  
#pragma hdrstop 
#include "f_main.h" 
 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TMainForm   *MainForm; 
 
//--------------------------------------------------------------------------- 
__fastcall TMainForm::TMainForm(TComponent *Owner) : 
    TForm(Owner) 
{ 
} 
 
//--------------------------------------------------------------------------- 
void __fastcall TMainForm::WndProc(TMessage &Message) 
{ 
    if(Message.Msg == MM_WIM_DATA) 
    { 
        this->ProcessInput(); 
    } 
 
    TForm::WndProc(Message);    //其他的消息继续传递下去 
} 
 
//--------------------------------------------------------------------------- 
void __fastcall TMainForm::ProcessInput(void) 
{ 
    //  Prepare data buffer 
    if(isStart) 
    { 
        WAVEHDR *in= &WaveHeaders[buff]; 
        ::waveInUnprepareHeader(hWaveIn, in, sizeof(WAVEHDR)); 
 
        //  Update views 
        switch(RadioView->ItemIndex) 
        { 
            case 0: timethread->Process((short *)(in->lpData)); break; 
            case 1: spectrumthread->Process((short *)(in->lpData)); break; 
        } 
 
        //  Send next buffer; 
        buff++; 
        if(buff == buffers) buff=0; 
        SendHeader->dwBufferLength=WaveBufSize; 
        SendHeader->dwFlags=0; 
        SendHeader->dwLoops=0; 
        ::waveInPrepareHeader(hWaveIn, SendHeader, sizeof(WAVEHDR)); 
        ::waveInAddBuffer(hWaveIn, SendHeader, sizeof(WAVEHDR)); 
        if(SendHeader == &WaveHeaders[buffers - 1]) 
            SendHeader= &WaveHeaders[0]; 
        else 
            SendHeader++; 
    } 
} 
 
//--------------------------------------------------------------------------- 
void __fastcall TMainForm::FormCreate(TObject *Sender) 
{ 
    MMRESULT    res; 
    char        ErrText[MAXERRORLENGTH + 1]; 
    buffers=8; 
    buffer_size=2048; 
    buff=0; 
    waveFormat.wFormatTag=WAVE_FORMAT_PCM; 
    waveFormat.nChannels=2; 
    waveFormat.nSamplesPerSec=44100; 
    waveFormat.wBitsPerSample=16; 
    waveFormat.nBlockAlign=waveFormat.wBitsPerSample / 8 * waveFormat.nChannels; 
    waveFormat.nAvgBytesPerSec=waveFormat.nBlockAlign * waveFormat.nSamplesPerSec; 
    waveFormat.cbSize=0; 
    timethread=new TimeThread(true, View, buffer_size); 
    spectrumthread=new SpectrumThread(true, View, buffer_size); 
 
    //  Audio buffers 
    WaveHeaders=new WAVEHDR[buffers]; 
    WaveBufSize=buffer_size * waveFormat.wBitsPerSample / 8 * waveFormat.nChannels; 
    for(int i=0; i < buffers; i++) 
    { 
        WaveHeaders[i].dwBufferLength=WaveBufSize; 
        WaveHeaders[i].lpData= (char *)VirtualAlloc(0, WaveBufSize, MEM_COMMIT, PAGE_READWRITE); 
    } 
 
    if((res=waveInOpen(&hWaveIn, WAVE_MAPPER, &waveFormat, (DWORD) this->Handle, (DWORD) this, CALLBACK_WINDOW)) == MMSYSERR_NOERROR) 
    { 
        for(int i=0; i < buffers - 1; i++) 
        { 
            WaveHeaders[i].dwBufferLength=WaveBufSize; 
            WaveHeaders[i].dwFlags=0; 
            WaveHeaders[i].dwLoops=0; 
            if((res=waveInPrepareHeader(hWaveIn, &WaveHeaders[i], sizeof(WAVEHDR))) == MMSYSERR_NOERROR) 
            { 
                if((res=waveInAddBuffer(hWaveIn, &WaveHeaders[i], sizeof(WAVEHDR))) != MMSYSERR_NOERROR) 
                { 
                    waveInGetErrorText(res, ErrText, MAXERRORLENGTH); 
                    Application->MessageBox(ErrText, "waveInAddBuffer", MB_OK); 
                    Application->Terminate(); 
                } 
            } 
        } 
 
        if((res=waveInStart(hWaveIn)) == MMSYSERR_NOERROR) 
        { 
            SendHeader= &WaveHeaders[buffers - 1]; 
            buff=0; 
            isStart=true; 
        } 
        else 
        { 
            waveInGetErrorText(res, ErrText, MAXERRORLENGTH); 
            Application->MessageBox(ErrText, "waveInStart", MB_OK); 
            Application->Terminate(); 
        } 
    } 
    else 
    { 
        waveInGetErrorText(res, ErrText, MAXERRORLENGTH); 
        Application->MessageBox(ErrText, "waveInOpen", MB_OK); 
        Application->Terminate(); 
    } 
} 
 
//--------------------------------------------------------------------------- 
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose) 
{ 
    MMRESULT    res; 
    isStart=false; 
    timethread->Terminate(); 
    spectrumthread->Terminate(); 
 
    //  Closing audio device 
    waveInReset(hWaveIn); 
    for(int i=0; i < buffers; i++) 
    { 
        res=::waveInUnprepareHeader(hWaveIn, &WaveHeaders[i], sizeof(WAVEHDR)); 
        while(res == WAVERR_STILLPLAYING) 
        { 
            Sleep(200); 
            res=::waveInUnprepareHeader(hWaveIn, &WaveHeaders[i], sizeof(WAVEHDR)); 
        } 
    } 
 
    ::waveInClose(hWaveIn); 
    for(int i=0; i < buffers; i++) VirtualFree(WaveHeaders[i].lpData, 0, MEM_RELEASE); 
    delete[] WaveHeaders; 
    delete timethread; 
    delete spectrumthread; 
} 
 
//--------------------------------------------------------------------------- 
void __fastcall TMainForm::ViewMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) 
{ 
    spectrumthread->SetMousePoint(X, Y); 
} 
 
//--------------------------------------------------------------------------- 
void __fastcall TMainForm::Label1Click(TObject *Sender) 
{ 
    ShellExecute(Handle, "Open", "http://nowcan.yeah.net", "", NULL, 1); 
 
} 
//---------------------------------------------------------------------------