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

參考寫了一個錄音程式顯示波形,現在要將錄音存檔(有貼code)請大家幫忙看看

尚未結案
sb055665
一般會員


發表:24
回覆:25
積分:14
註冊:2006-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-10 12:22:05 IP:211.20.xxx.xxx 未訂閱

請大家幫幫忙看一下吧,是不是那裡有錯導致存檔可以但是始終只有1k,而且無法播放,麻煩大家看一下,謝謝!

//---------------------------------------------------------------------------
void CALLBACK WaveInProc(HWAVEIN waveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
WAVEHDR *WaveStruct;
HWAVEIN WaveIn;
if(uMsg == MM_WIM_DATA) //CALLBACK
{
Form1->ProcessInput(); //call畫圖功能
Form1->AddSample((byte *)WaveStruct->lpData); //存檔
waveInUnprepareHeader(WaveIn,WaveStruct,sizeof(WAVEHDR));
waveInPrepareHeader(WaveIn,WaveStruct,sizeof(WAVEHDR));
waveInAddBuffer(WaveIn,WaveStruct,sizeof(WAVEHDR));
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ProcessInput()
{
if( isStart)
{
WAVEHDR* in=&WaveHeader1[buff];
::waveInUnprepareHeader( hWaveIn, in, sizeof(WAVEHDR));

// Views update
//
Form1->Process(view,(short*)(in->lpData));
// 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 == &WaveHeader1[buffers-1] )
SendHeader = &WaveHeader1[0];
else
SendHeader ;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
buffers = 2;
buffer_size = 1024;
buff = 0;
pFormat1.wFormatTag = WAVE_FORMAT_PCM;
pFormat1.nChannels = 2;
pFormat1.nSamplesPerSec = 44100;
pFormat1.wBitsPerSample = 16;
pFormat1.nBlockAlign = pFormat1.wBitsPerSample/8*pFormat1.nChannels;
pFormat1.nAvgBytesPerSec = pFormat1.nBlockAlign*pFormat1.nSamplesPerSec;
pFormat1.cbSize = 0;
// Audio buffers

WaveHeader1 = new WAVEHDR[buffers];
WaveBufSize = buffer_size*pFormat1.wBitsPerSample/8*pFormat1.nChannels;
//////////////////////////////////////////////////////////////////
Form1->CWaveFile(Edit1->Text.c_str(),44100,16,WaveBufSize);
///////////////////////////////////////////////////////////////
for( int i = 0; i {
WaveHeader1[i].dwBufferLength = WaveBufSize;
WaveHeader1[i].lpData = (char *)VirtualAlloc( 0, WaveBufSize, MEM_COMMIT, PAGE_READWRITE );
}
if( waveInOpen( &hWaveIn, WAVE_MAPPER, &pFormat1, (DWORD)WaveInProc, (DWORD)this,CALLBACK_FUNCTION )==MMSYSERR_NOERROR)
{
for( int i = 0; i {
WaveHeader1[i].dwBufferLength=WaveBufSize;
WaveHeader1[i].dwFlags=0;
WaveHeader1[i].dwLoops=0;
if( waveInPrepareHeader( hWaveIn, &WaveHeader1[i], sizeof(WAVEHDR))== MMSYSERR_NOERROR)
if( waveInAddBuffer( hWaveIn, &WaveHeader1[i], sizeof(WAVEHDR))!= MMSYSERR_NOERROR)
{
Application->MessageBox( "Error", "Multimedia Error", MB_OK);
Application->Terminate();
}
}
if( waveInStart( hWaveIn ) == MMSYSERR_NOERROR )
{
SendHeader = &WaveHeader1[buffers/2];
buff = 0;
isStart = true;
}
else
{
Application->MessageBox( "Error", "Multimedia Error", MB_OK);
Application->Terminate();
}
}
else
{
Application->MessageBox( "Error", "Multimedia Error", MB_OK);
Application->Terminate();
}

}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
// Closing audio device
isStart = false;
MMRESULT res=waveInReset( hWaveIn );
for( int i = 0; i {
res = ::waveInUnprepareHeader( hWaveIn, &WaveHeader1[i], sizeof(WAVEHDR) );
while( res == WAVERR_STILLPLAYING )
{
Sleep( 200 );
res = ::waveInUnprepareHeader( hWaveIn, &WaveHeader1[i], sizeof(WAVEHDR) );
}
}
::waveInClose( hWaveIn );

for( int i=0; i VirtualFree( WaveHeader1[i].lpData, 0, MEM_RELEASE );
delete [] WaveHeader1;

}

//---------------------------------------------------------------------------

void TForm1::Process( TPaintBox* in, short* idata )
{
data=idata;
view=in;
FillBuffer();
}

//---------------------------------------------------------------------------

void __fastcall TForm1::FillBuffer()
{
//音量大小波形
count = 1024;
alfa = 45.0f*M_PI/180.0f;
hcos = cos(alfa);
hsin = sin(alfa);

int StereoY = view->ClientHeight/2;
int StereoX = StereoY;
double StereoScale = 0.707*static_cast(StereoY)/32767.0f;

double stereoleft = 0;
double stereoright = 0;
view->Canvas->Lock();
view->Canvas->Brush->Color = clBlack;
view->Canvas->Pen->Color = clWhite;
view->Canvas->Rectangle( 0, 0, view->ClientWidth, view->ClientHeight);
//*data /=10000000000000000;
for(int i=0; i {

double left=static_cast((*data ));
double right=static_cast((*data ));
stereoleft = (hcos*left - hsin*right);
stereoright = (hsin*right hcos*left);
view->Canvas->Pixels[StereoX stereoleft*StereoScale][StereoY stereoright*StereoScale] = clAqua;

}
view->Canvas->Unlock();

}
//---------------------------------------------------------------------------

void __fastcall TForm1::CWaveFile(char *Nombre,WORD Frecuencia,WORD Resolucion,DWORD SizeData)
{
//Crea el fichero WAV destino.
hFormat=CreateFile(Nombre,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hFormat==INVALID_HANDLE_VALUE)
throw("No se puede crear el fichero");

m_SizeOfFile=0x00;
m_SizeWaveChunck=0x10;
m_WaveTypeFormat=0x01; //PCM.
m_MonoStereo=0x01; //Mono.
m_SampleRate=Frecuencia;
m_BitsSample=Resolucion;
m_BlockAlignment=m_BitsSample/8; //Nmero de canales * BitsSample/8
m_BytesSample=m_SampleRate*m_BlockAlignment;

m_SizeOfDatos=0x00;

m_SizeChunk=SizeData;

m_nDataChuncks=0;

WriteFile(hFormat,"RIFF",4,&m_Escritos,NULL);
WriteFile(hFormat,&m_SizeOfFile,4,&m_Escritos,NULL);
WriteFile(hFormat,"WAVE",4,&m_Escritos,NULL);

WriteFile(hFormat,"fmt ",4,&m_Escritos,NULL);
WriteFile(hFormat,&m_SizeWaveChunck,4,&m_Escritos,NULL);
WriteFile(hFormat,&m_WaveTypeFormat,2,&m_Escritos,NULL);
WriteFile(hFormat,&m_MonoStereo,2,&m_Escritos,NULL);
WriteFile(hFormat,&m_SampleRate,4,&m_Escritos,NULL);
WriteFile(hFormat,&m_BytesSample,4,&m_Escritos,NULL);
WriteFile(hFormat,&m_BlockAlignment,2,&m_Escritos,NULL);
WriteFile(hFormat,&m_BitsSample,2,&m_Escritos,NULL);

WriteFile(hFormat,"data",4,&m_Escritos,NULL);
WriteFile(hFormat,&m_SizeOfDatos,4,&m_Escritos,NULL);
}
//---------------------------------------------------------------------------
void TForm1::AddSample(byte *Buffer)
{
WriteFile(hFormat,Buffer,m_SizeChunk,&m_Escritos,NULL); .
m_nDataChuncks ;
}
//---------------------------------------------------------------------------

sb055665
一般會員


發表:24
回覆:25
積分:14
註冊:2006-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-10 18:08:33 IP:211.20.xxx.xxx 未訂閱
謝謝大家!我已經有一點頭緒了,現在想請問各位大大,如果想要濾雜音,所謂的雜音,我的想法指的是,只有拿mic的人聲音我要,其它旁人的雜音我都不要,我是想利用db值來取得,但是沒有頭緒,是否有經驗的人,能告知如何運作會比較好,還有,是否有相關書藉可以參考,例如:如何取的db值
系統時間:2024-05-02 11:16:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!