全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1792
推到 Plurk!
推到 Facebook!

自己寫的錄音程式,但執行時卻有問題,有貼原始碼

尚未結案
leobxb
一般會員


發表:18
回覆:30
積分:14
註冊:2003-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-30 12:06:14 IP:220.229.xxx.xxx 未訂閱
是否可請大大幫我看看有什麼問題...    Unit1.h 
 
//---------------------------------------------------------------------------    #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include     #include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TButton *StartRecord;
        TButton *EndRecord;
        TButton *PlaySound;
        void __fastcall StartRecordClick(TObject *Sender);
        void __fastcall EndRecordClick(TObject *Sender);
        void __fastcall PlaySoundClick(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
private:        // User declarations
   char* WaveData;
   HWAVEIN WaveHandle;
   int DataSize;
   void CheckMMIOError(DWORD code);
   void OnWaveMessage(TMessage& msg);
   void CheckWaveError(DWORD code);
   void SaveWaveFile();
   WAVEHDR WaveHeader;
   WAVEFORMATEX WaveFormat; 
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);            BEGIN_MESSAGE_MAP
           MESSAGE_HANDLER(MM_WIM_DATA, TMessage, OnWaveMessage)
        END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif    
Unit1.cpp
 
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"    TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
   WaveData=0;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   if(WaveData)delete[] WaveData;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::StartRecordClick(TObject *Sender)
{
   WaveFormat.wFormatTag      = WAVE_FORMAT_PCM;
   WaveFormat.nChannels       = 1;
   WaveFormat.nSamplesPerSec  = 22050;
   WaveFormat.wBitsPerSample  = 8;
   WaveFormat.nAvgBytesPerSec = 22050;
   WaveFormat.nBlockAlign     = 1;
   WaveFormat.cbSize          = 0;       int Res=waveInOpen(&WaveHandle,WAVE_MAPPER,&WaveFormat,0,0,WAVE_FORMAT_QUERY);
   CheckWaveError(Res);
   if(Res==WAVERR_BADFORMAT)return;
   Res=waveInOpen(&WaveHandle,WAVE_MAPPER,&WaveFormat,0,0,CALLBACK_WINDOW);
   CheckWaveError(Res);       int buffer=10*22050;       if(WaveData)delete[] WaveData;
   WaveData = new char[buffer];       WaveHeader.dwBufferLength = buffer;
   WaveHeader.dwFlags        = 0;
   WaveHeader.lpData         = WaveData;       Res=waveInPrepareHeader(WaveHandle,&WaveHeader,sizeof(WAVEHDR));
   CheckWaveError(Res);
   Res=waveInAddBuffer(WaveHandle,&WaveHeader,sizeof(WAVEHDR));
   if(Res!=0)
   {
      waveInUnprepareHeader(WaveHandle,&WaveHeader,sizeof(WAVEHDR));
      delete[] WaveData;
      WaveData=0;
      return;
   }
   Res=waveInStart(WaveHandle);
   CheckWaveError(Res);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::EndRecordClick(TObject *Sender)
{
   waveInReset(WaveHandle);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::PlaySoundClick(TObject *Sender)
{
   PlaySound("test.wav",0,SND_FILENAME);
}
//---------------------------------------------------------------------------    void TForm1::OnWaveMessage(TMessage& msg)
{
   if(msg.Msg==MM_WIM_DATA)
   {
      waveInClose(WaveHandle);
      SaveWaveFile();
      WaveHeader.lpData=0;
      if(WaveData)
      {
         delete[] WaveData;
         WaveData=0;
      }
   }
}
//---------------------------------------------------------------------------    void TForm1::CheckWaveError(DWORD code)
{
   if(code==0)return;
   char buff[256];
   waveInGetErrorText(code,buff,sizeof(buff));
   MessageBox(Handle,buff,"Wave Error",MB_OK);
}
//---------------------------------------------------------------------------    void TForm1::CheckMMIOError(DWORD code)
{
   if(code==0)return;
   char buff[256];
   wsprintf(buff,"MMIO Error!!!->Error Code: %d",code);
   Application->MessageBox(buff,"MMIO Error!!!",0);
}
//---------------------------------------------------------------------------    void TForm1::SaveWaveFile()
{
   MMCKINFO ChunkInfo;
   MMCKINFO FormatChunkInfo;
   MMCKINFO DataChunkInfo;       HMMIO handle = mmioOpen("test.wav",0,MMIO_CREATE|MMIO_WRITE);
   if(!handle)
   {
      MessageBox(0,"Error creating file.","Error Message",0);
      return;
   }
   memset(&ChunkInfo,0,sizeof(MMCKINFO));
   ChunkInfo.fccType=mmioStringToFOURCC("WAVE",0);
   DWORD Res=mmioCreateChunk(handle,&ChunkInfo,MMIO_CREATERIFF);
   CheckMMIOError(Res);       FormatChunkInfo.ckid=mmioStringToFOURCC("fmt ",0);
   FormatChunkInfo.cksize=sizeof(WAVEFORMATEX);
   Res=mmioCreateChunk(handle,&FormatChunkInfo,0);
   CheckMMIOError(Res);
   mmioWrite(handle,(char*)&WaveFormat,sizeof(WaveFormat));       Res=mmioAscend(handle,&FormatChunkInfo,0);
   CheckMMIOError(Res);
   DataChunkInfo.ckid=mmioStringToFOURCC("data",0);
   DataSize=WaveHeader.dwBytesRecorded;
   DataChunkInfo.cksize=DataSize;
   Res=mmioCreateChunk(handle,&DataChunkInfo,0);
   CheckMMIOError(Res);       mmioWrite(handle,(char*)&WaveHeader.lpData,DataSize);
   mmioAscend(handle,&DataChunkInfo,0);
   mmioAscend(handle,&ChunkInfo,0);
   mmioClose(handle,0);
}
//---------------------------------------------------------------------------
有收穫記得回饋,讓我們台灣跨出程式的出頭天...
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-30 15:34:15 IP:202.104.xxx.xxx 未訂閱
leobxb:
我不知道妳說的問題是怎麼?但我第一先將妳的int buffer=10*22050;
改成DWORD buffer=48000; // 我不需要妳那麼大的buffer
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  WaveData=0;
  FilePath=ExtractFilePath(ParamStr(0));
  // 於h檔宣告AnsiString FilePath; 
}
void __fastcall TForm1::EndRecordClick(TObject *Sender)
{
   waveInStop(WaveHandle);
   waveInReset(WaveHandle);
   SaveWaveFile();
   waveInClose(WaveHandle);
   Label1->Caption="結束錄音"; 
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  PlaySound((FilePath "test.wav").c_str(),0,SND_FILENAME);
}
void TForm1::SaveWaveFile()
{
    HMMIO handle = mmioOpen((FilePath "test.wav").c_str(),0,MMIO_CREATE|MMIO_WRITE);
我只加入紅字部分,錄音OK!撥放OK!
請參考!
Andy Chang
------
Andy Chang
leobxb
一般會員


發表:18
回覆:30
積分:14
註冊:2003-10-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-31 09:10:04 IP:220.229.xxx.xxx 未訂閱
首先,先謝謝andychang1690的回答與測試:     我想一定是我沒有寫清楚,我在這再把原始碼貼一次,有問題的地方用紅色字表示.(對了按鍵名稱原本為PlaySound,要改成PLAY.不然好像會錯誤喔...)  
 
Unit1.h     //---------------------------------------------------------------------------    #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include     #include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TButton *StartRecord;
        TButton *EndRecord;
        TButton *PlaySound;
        void __fastcall StartRecordClick(TObject *Sender);
        void __fastcall EndRecordClick(TObject *Sender);
        void __fastcall PLAYClick(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
private:        // User declarations
   char* WaveData;
   HWAVEIN WaveHandle;
   int DataSize;
   void CheckMMIOError(DWORD code);
   void OnWaveMessage(TMessage& msg);
   void CheckWaveError(DWORD code);
   void SaveWaveFile();
   WAVEHDR WaveHeader;
   WAVEFORMATEX WaveFormat; 
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);       BEGIN_MESSAGE_MAP
           MESSAGE_HANDLER(MM_WIM_DATA, TMessage, OnWaveMessage)
        END_MESSAGE_MAP(TForm)   
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif        Unit1.cpp    //---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"    TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
   WaveData=0;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   if(WaveData)delete[] WaveData;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::StartRecordClick(TObject *Sender)
{
   WaveFormat.wFormatTag      = WAVE_FORMAT_PCM;
   WaveFormat.nChannels       = 1;
   WaveFormat.nSamplesPerSec  = 22050;
   WaveFormat.wBitsPerSample  = 8;
   WaveFormat.nAvgBytesPerSec = 22050;
   WaveFormat.nBlockAlign     = 1;
   WaveFormat.cbSize          = 0;       int Res=waveInOpen(&WaveHandle,WAVE_MAPPER,&WaveFormat,0,0,WAVE_FORMAT_QUERY);
   CheckWaveError(Res);
   if(Res==WAVERR_BADFORMAT)return;
   Res=waveInOpen(&WaveHandle,WAVE_MAPPER,&WaveFormat,0,0,CALLBACK_WINDOW);
   CheckWaveError(Res);       int buffer=5*22050;   //錄音五秒鐘       if(WaveData)delete[] WaveData;
   WaveData = new char[buffer];       WaveHeader.dwBufferLength = buffer;
   WaveHeader.dwFlags        = 0;
   WaveHeader.lpData         = WaveData;       Res=waveInPrepareHeader(WaveHandle,&WaveHeader,sizeof(WAVEHDR));
   CheckWaveError(Res);
   Res=waveInAddBuffer(WaveHandle,&WaveHeader,sizeof(WAVEHDR));
   if(Res!=0)
   {
      waveInUnprepareHeader(WaveHandle,&WaveHeader,sizeof(WAVEHDR));
      delete[] WaveData;
      WaveData=0;
      return;
   }
   Res=waveInStart(WaveHandle);
   CheckWaveError(Res);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::EndRecordClick(TObject *Sender)
{
   waveInReset(WaveHandle);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::PLAYClick(TObject *Sender)
{
   PlaySound("test.wav",0,SND_FILENAME);
}
//---------------------------------------------------------------------------    void TForm1::OnWaveMessage(TMessage& msg)
{
   if(msg.Msg==MM_WIM_DATA)
   {
      waveInClose(WaveHandle);
      SaveWaveFile();
      WaveHeader.lpData=0;
      if(WaveData)
      {
         delete[] WaveData;
         WaveData=0;
      }
   }
}
//---------------------------------------------------------------------------    void TForm1::CheckWaveError(DWORD code)
{
   if(code==0)return;
   char buff[256];
   waveInGetErrorText(code,buff,sizeof(buff));
   MessageBox(Handle,buff,"Wave Error",MB_OK);
}
//---------------------------------------------------------------------------    void TForm1::CheckMMIOError(DWORD code)
{
   if(code==0)return;
   char buff[256];
   wsprintf(buff,"MMIO Error!!!->Error Code: %d",code);
   Application->MessageBox(buff,"MMIO Error!!!",0);
}
//---------------------------------------------------------------------------    void TForm1::SaveWaveFile()
{
   MMCKINFO ChunkInfo;
   MMCKINFO FormatChunkInfo;
   MMCKINFO DataChunkInfo;       HMMIO handle = mmioOpen("test.wav",0,MMIO_CREATE|MMIO_WRITE);
   if(!handle)
   {
      MessageBox(0,"Error creating file.","Error Message",0);
      return;
   }
   memset(&ChunkInfo,0,sizeof(MMCKINFO));
   ChunkInfo.fccType=mmioStringToFOURCC("WAVE",0);
   DWORD Res=mmioCreateChunk(handle,&ChunkInfo,MMIO_CREATERIFF);
   CheckMMIOError(Res);       FormatChunkInfo.ckid=mmioStringToFOURCC("fmt ",0);
   FormatChunkInfo.cksize=sizeof(WAVEFORMATEX);
   Res=mmioCreateChunk(handle,&FormatChunkInfo,0);
   CheckMMIOError(Res);
   mmioWrite(handle,(char*)&WaveFormat,sizeof(WaveFormat));       Res=mmioAscend(handle,&FormatChunkInfo,0);
   CheckMMIOError(Res);
   DataChunkInfo.ckid=mmioStringToFOURCC("data",0);
   DataSize=WaveHeader.dwBytesRecorded;
   DataChunkInfo.cksize=DataSize;
   Res=mmioCreateChunk(handle,&DataChunkInfo,0);
   CheckMMIOError(Res);       mmioWrite(handle,(char*)&WaveHeader.lpData,DataSize);
   mmioAscend(handle,&DataChunkInfo,0);
   mmioAscend(handle,&ChunkInfo,0);
   mmioClose(handle,0);
}
//---------------------------------------------------------------------------    
問題就是為什麼我設定,只要超過我設定的錄音秒數或按下停止錄音鍵時,就會觸發OnWaveMessage(TMessage& msg)這個函式,但是為什麼都不會觸發呢? 有收穫記得回饋,讓我們台灣跨出程式的出頭天...
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-31 09:50:30 IP:202.104.xxx.xxx 未訂閱
leobxb: 問題就是為什麼我設定,只要超過我設定的錄音秒數或按下停止錄音鍵時,就會觸發OnWaveMessage(TMessage& msg)這個函式,但是為什麼都不會觸發呢? 對不起我保證不會觸發!有關BCB的消息機制我建議妳先看兩編文章。 都是本園地版大發表的。 http://delphi.ktop.com.tw/topic.php?topic_id=42399 【發表】VC 與 BCB 自訂訊息傳遞實作與比較 發表:anpino http://delphi.ktop.com.tw/topic.php?topic_id=19966 [推薦]深入VCL 理解BCB的消息機制(全) 發表:axsoft MESSAGE_HANDLER(MM_WIM_DATA, TMessage, OnWaveMessage) 我建議妳先研究一下。看妳從上面資料能不能找到答案! Andy Chang
------
Andy Chang
leobxb
一般會員


發表:18
回覆:30
積分:14
註冊:2003-10-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-06 08:57:42 IP:220.229.xxx.xxx 未訂閱
謝謝你的幫忙,但最近沒時間測試,所以我比較晚給分數,等我測試完在回應 有收穫記得回饋,讓我們台灣跨出程式的出頭天...
系統時間:2024-07-01 7:47:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!