線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1160
推到 Plurk!
推到 Facebook!

在記憶體內執行錄音,播放功能都正常

尚未結案
esbcc
一般會員


發表:18
回覆:17
積分:7
註冊:2005-02-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-09 01:37:14 IP:61.219.xxx.xxx 未訂閱
這程式是在記憶體內執行錄音,播放功能都正常, 只是要把錄下的語音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);     
}
//---------------------------------------------------------------------------  
系統時間:2024-05-03 9:24:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!