leobxb
一般會員
發表:18 回覆:30 積分:14 註冊:2003-10-02
發送簡訊給我
|
是否可請大大幫我看看有什麼問題... 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
發送簡訊給我
|
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
發送簡訊給我
|
首先,先謝謝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
發送簡訊給我
|
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
發送簡訊給我
|
謝謝你的幫忙,但最近沒時間測試,所以我比較晚給分數,等我測試完在回應 有收穫記得回饋,讓我們台灣跨出程式的出頭天...
|