关于那个语音聊天代码的问题

wjzhuang 2001-08-21 08:43:30
加精
这两天看到了那个语音聊天程序,我试了一下,发现有些问题,现提出来请教
代码我做了简单的修改,现贴出部分
//.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "NetTelMain.h"
#include "WaveInput.h"
#include "WaveOutPut.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TVoiceTalkForm *VoiceTalkForm;
//---------------------------------------------------------------------------
__fastcall TVoiceTalkForm::TVoiceTalkForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void _fastcall TVoiceTalkForm::InitializeInputDevice()
{
//set up pcm wave format for 11 kHz 8-bit mono.
pcmWaveFormat.wFormatTag=WAVE_FORMAT_PCM;
pcmWaveFormat.nChannels=1;
pcmWaveFormat.nSamplesPerSec=11025L;
pcmWaveFormat.nAvgBytesPerSec=11025L;
pcmWaveFormat.nBlockAlign=1;
pcmWaveFormat.wBitsPerSample=8;
pcmWaveFormat.cbSize=0;

//open the output device

switch(waveInOpen(&phwi,WAVE_MAPPER,&pcmWaveFormat,(unsigned long)Handle,0,CALLBACK_WINDOW))
{
case MMSYSERR_ALLOCATED:
ShowMessage("MMSYSERR_ALLOCTEC");return;
case MMSYSERR_BADDEVICEID:
ShowMessage("MMSYSERR_BADDEVICEID");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case WAVERR_STILLPLAYING:
ShowMessage("WAVERR_STILLPLAYING");return;
case WAVERR_BADFORMAT:
ShowMessage("WAVERR_BADFORMAT");return;
}
// ALLOCATE MEMORY AND PERPARE FOR RECORDING
for(int i=0;i<=1;i++)
{
lpInWaveHdr[i]=AllocateInputLPWAVEHDRMemory(4*1024);
switch(waveInPrepareHeader(phwi,lpInWaveHdr[i],sizeof(WAVEHDR)))
{
case MMSYSERR_INVALHANDLE:
ShowMessage("MMSYSERR_INVALHANDLE");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case MMSYSERR_NOMEM:
ShowMessage("MMSYSERR_NOMEM");return;
}
}
switch(waveInAddBuffer(phwi,lpInWaveHdr[!IsNeedSwap],sizeof(WAVEHDR)))
{
case MMSYSERR_INVALHANDLE:
ShowMessage("MMSYSERR_INVALHANDLE");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case MMSYSERR_NOMEM:
ShowMessage("MMSYSERR_NOMEM");return;
case WAVERR_UNPREPARED:
ShowMessage("WAVE_UNPREPAPERD");return;
}
}
//---------------------------------------------------------------------------

void _fastcall TVoiceTalkForm::CallBackPlay(TMessage *Message)
{
switch(waveInAddBuffer(phwi,lpInWaveHdr[!IsNeedSwap],sizeof(WAVEHDR)))
{
case WAVERR_UNPREPARED:
ShowMessage("WAVE_UNPREPAPERD");return;
case MMSYSERR_INVALHANDLE:
ShowMessage("MMSYSERR_INVALHANDLE");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case MMSYSERR_NOMEM:
ShowMessage("MMSYSERR_NOMEM");return;
}
ClientSocket1->Socket->SendBuf(lpInWaveHdr[!IsNeedSwap]->lpData,lpInWaveHdr[!IsNeedSwap]->dwBufferLength);
IsNeedSwap=!IsNeedSwap;
}
//---------------------------------------------------------------------------

void _fastcall TVoiceTalkForm::InitializeOutputDevice()
{
if(waveOutOpen(&pwho,WAVE_MAPPER,&pcmWaveFormat,(unsigned long)Handle,0,CALLBACK_WINDOW)!=MMSYSERR_NOERROR)
::MessageBox(0,"out Open error","",MB_OK);
for(int i=0;i<=1;i++)
lpOutWaveHdr[i]=AllocateOutPutLPWAVEHDRMemory(pwho,4*1024);
Volume=Volume&0x00000000;
Volume=Volume^((DWORD)0xFFFF/2);
Volume=Volume^(((DWORD)0xFFFF/2)<<16);
if(waveOutSetVolume(pwho,Volume)!=MMSYSERR_NOERROR)
ShowMessage("waveOutSetVolume error!");
}
//---------------------------------------------------------------------------

void __fastcall TVoiceTalkForm::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
if(OutputDeviceUnOpend)
{
InitializeOutputDevice();
OutputDeviceUnOpend=false;
}
try{
ReceiveLength=Socket->ReceiveLength();
Socket->ReceiveBuf(lpOutWaveHdr[WhichToPlay]->lpData,ReceiveLength);
StatusBar1->Panels->Items[1]->Text=AnsiString("Packages:")+MsgNumber++;
if(waveOutWrite(pwho,lpOutWaveHdr[WhichToPlay],sizeof(WAVEHDR))==MMSYSERR_NOERROR)
StatusBar1->Panels->Items[0]->Text=AnsiString("Status:")+(int)WhichToPlay;
StatusBar1->Panels->Items[2]->Text=AnsiString("PSize:")+ReceiveLength;
WhichToPlay=!WhichToPlay;
}catch(...){
StatusBar1->Panels->Items[0]->Text="WaveOut ERRor";
}
}
//---------------------------------------------------------------------------

void __fastcall TVoiceTalkForm::N2Click(TObject *Sender)
{
ClientSocket1->Active=false;
ClientSocket1->Address=Edit_IP->Text;
ClientSocket1->Port=2001;
ClientSocket1->Active=true;
}
//---------------------------------------------------------------------------

void __fastcall TVoiceTalkForm::N3Click(TObject *Sender)
{
IsPaused=false;
switch(waveInStart(phwi))
{
case MMSYSERR_INVALHANDLE:
ShowMessage("Specified device handle is invalid.");
break;
case MMSYSERR_NODRIVER:
ShowMessage("No device driver is present.");
break;
case MMSYSERR_NOMEM:
ShowMessage("Unable to allocate or lock memory.");
break;
case MMSYSERR_NOERROR:
ShowMessage("Successful");
break;
default:
break;
}
}
//---------------------------------------------------------------------------

void __fastcall TVoiceTalkForm::N4Click(TObject *Sender)
{
if(!IsPaused)
{
switch(waveInStop(phwi))
{
case MMSYSERR_INVALHANDLE:
ShowMessage("Specified device handle is invalid.");
break;
case MMSYSERR_NODRIVER:
ShowMessage("No device driver is present.");
break;
case MMSYSERR_NOMEM:
ShowMessage("Unable to allocate or lock memory.");
break;
case MMSYSERR_NOERROR:
ShowMessage("Successful");
break;
default:
break;
}
}
}
//---------------------------------------------------------------------------

void __fastcall TVoiceTalkForm::N5Click(TObject *Sender)
{
switch(waveInStart(phwi))
{
case MMSYSERR_INVALHANDLE:
ShowMessage("Specified device handle is invalid.");
break;
case MMSYSERR_NODRIVER:
ShowMessage("No device driver is present.");
break;
case MMSYSERR_NOMEM:
ShowMessage("Unable to allocate or lock memory.");
break;
case MMSYSERR_NOERROR:
ShowMessage("Successful");
break;
default:
break;
}

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

void __fastcall TVoiceTalkForm::N6Click(TObject *Sender)
{
ServerSocket1->Active=false;
ClientSocket1->Active=false;
IsPaused=true;
switch(waveInReset(phwi))
{
case MMSYSERR_INVALHANDLE:
ShowMessage("Specified device handle is invalid.");
break;
case MMSYSERR_NODRIVER:
ShowMessage("No device driver is present.");
break;
case MMSYSERR_NOMEM:
ShowMessage("Unable to allocate or lock memory.");
break;
case MMSYSERR_NOERROR:
ShowMessage("Successful");
break;
default:
break;

}
switch(waveInStop(phwi))
{
case MMSYSERR_INVALHANDLE:
ShowMessage("Specified device handle is invalid.");
break;
case MMSYSERR_NODRIVER:
ShowMessage("No device driver is present.");
break;
case MMSYSERR_NOMEM:
ShowMessage("Unable to allocate or lock memory.");
break;
case MMSYSERR_NOERROR:
ShowMessage("Successful");
break;
default:
break;
}
for(int i=0;i<=1;i++)
FreeInPutBuffer(phwi,lpInWaveHdr[i]);
waveInClose(phwi);
waveOutReset(pwho);
waveOutBreakLoop(pwho);
for(int i=0;i<=1;i++)
FreeOutPutBuffer(pwho,lpOutWaveHdr[i]);
waveOutClose(pwho);
StatusBar1->Panels->Items[0]->Text="Is Stoped";
}
//---------------------------------------------------------------------------

void __fastcall TVoiceTalkForm::VolumeBarChange(TObject *Sender)
{
Volume=Volume&0x00000000;
Volume=Volume^((DWORD)VolumeBar->Position*0xFFFF/100);
Volume=Volume^((DWORD)VolumeBar->Position*0xFFFF/100<<16);
if(waveOutSetVolume(pwho,Volume)!=MMSYSERR_NOERROR)
ShowMessage("waveoutsetvolumeerror");
}
//---------------------------------------------------------------------------


void __fastcall TVoiceTalkForm::N7Click(TObject *Sender)
{
/*
ServerSocket1->Active=false;
ClientSocket1->Active=false;
IsPaused=true;
waveInReset(phwi);
waveInStop(phwi);
for(int i=0;i<=1;i++)
FreeInPutBuffer(phwi,lpInWaveHdr[i]);
waveInClose(phwi);
waveOutReset(pwho);
waveOutBreakLoop(pwho);
for(int i=0;i<=1;i++)
FreeOutPutBuffer(pwho,lpOutWaveHdr[i]);
waveOutClose(pwho);
StatusBar1->Panels->Items[0]->Text="Is Stoped";
*/
Application->Terminate();
}
//---------------------------------------------------------------------------

void __fastcall TVoiceTalkForm::FormCreate(TObject *Sender)
{
//InitializeInputDevice();
}
//---------------------------------------------------------------------------
//.h
//---------------------------------------------------------------------------

#ifndef NetTelMainH
#define NetTelMainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <ScktComp.hpp>
#include<math.h>
#include<MMSystem.h>
#include<Buttons.hpp>
#include <NMSTRM.hpp>
#include <Psock.hpp>
#include<ToolWin.hpp>

#define NETTEL_PORT 2001
//---------------------------------------------------------------------------
class TVoiceTalkForm : public TForm
{
__published: // IDE-managed Components
TServerSocket *ServerSocket1;
TClientSocket *ClientSocket1;
TMainMenu *MainMenu1;
TLabel *Label_IP;
TEdit *Edit_IP;
TPanel *Panel1;
TGroupBox *VolumeGroupBox;
TTrackBar *VolumeBar;
TStatusBar *StatusBar1;
TMenuItem *N1;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *N4;
TMenuItem *N5;
TMenuItem *N6;
TMenuItem *N7;
void __fastcall ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall N2Click(TObject *Sender);
void __fastcall N3Click(TObject *Sender);
void __fastcall N4Click(TObject *Sender);
void __fastcall N5Click(TObject *Sender);
void __fastcall N6Click(TObject *Sender);
void __fastcall VolumeBarChange(TObject *Sender);
void __fastcall N7Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private:
WAVEFORMATEX pcmWaveFormat;
HWAVEIN phwi;
LPWAVEHDR lpInWaveHdr[2];
bool IsNeedSwap,IsPaused,WhichToPlay,OutputDeviceUnOpend;
HWAVEOUT pwho;
LPWAVEHDR lpOutWaveHdr[2];
DWORD Volume;
long MsgNumber,timebegin,timeend;
int getwhichtime,ReceiveLength;
void _fastcall InitializeOutputDevice();
void _fastcall CallBackPlay(TMessage*Message);
void _fastcall InitializeInputDevice();

public:

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(MM_WIM_DATA,TMessage* ,CallBackPlay)
END_MESSAGE_MAP(TComponent)
__fastcall TVoiceTalkForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TVoiceTalkForm *VoiceTalkForm;
//---------------------------------------------------------------------------
#endif
...全文
567 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
shak 2001-08-26
  • 打赏
  • 举报
回复
1.语音的采集和播放。
  本软件中要把语音直接转换为数据,放在内存中,而不是存为语音文件,而且播放语音时,也是直接播放语音数据,而不是播放语音文件。这样的好处前面已经提到,即省略了读写硬盘的费时操作,提高了语音通话的实时性。
  要完成上述语音操作,编程语言中提供的容易使用的高级的多媒体语音函数是无法胜任的,只能用一些底层的语音函数来实现,这一类函数和结构的名字都以"wave"作为前缀。
  下面简要分析录音和放音的流程,考虑到两着的处理和流程基本上是类似的,本文就只以录音为例来分析,如图三为录音流程。录音的准备工作主要是三点,打开录音设备,获得录音句柄,指定录音格式,分配若干用于录音的内存,内存的大小和数量下文将进一步分析。开始录音时,先将所有内存块都提供给录音设备用来录音,录音设备就会依次将语音数据写入内存,当一块内存写满,录音设备就会发一个Window 消息MM_WIM_DATA给相应的窗口,通知程序作相关的处理,这时程序通常的处理是把内存中的数据进行复制,如写入文件等,在此我们的处理是把数据进行压缩和网络发送,然后把内存置空,返还给录音设备进行录音,这样就形成一个循环不息的录音过程。结束录音时就释放所有内存块,关闭录音设备。



录音流程 

以录音为例,关键的录音函数和顺序如下:
WAVEFORMATEX waveformat;
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels=1;
waveformat.nSamplesPerSec=8000;
waveformat.nAvgBytesPerSec=16000;
waveformat.nBlockAlign=2;
waveformat.cbSize=0;
waveformat.wBitsPerSample=16; //指定录音格式
int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &waveformat, (DWORD)m_hWnd,0L,CALLBACK_WINDOW); //打开录音设备
waveInPrepareHeader(m_hWaveIn,m_pWaveHdr[i],sizeof(WAVEHDR)); //准备内存块录音
waveInAddBuffer(m_hWaveIn,m_pWaveHdr[i],sizeof(WAVEHDR)); //增加内存块
waveInStart(m_hWaveIn);//开始录音
waveInStop(m_hWaveIn); //停止录音
waveInReset(m_hWaveIn); //清空内存块
waveInClose(m_hWaveIn); //关闭录音设备



完整源代码
WaveInput.h
#ifndef WaveInputH
#define WaveInputH
#include<MMSystem.h>
//----------

LPWAVEHDR AllocateInputLPWAVEHDRMemory(UINT size);
void FreeInPutBuffer(HWAVEIN hwi,LPWAVEHDR pwh);
//------------------
#endif


WaveInput.cpp
#include <vcl.h>
#pragma hdrstop
#include "WaveInput.h"
//-------------------------------------------------------------------
LPWAVEHDR AllocateInputLPWAVEHDRMemory(UINT size)
{HPSTR sublpData;
HGLOBAL lpmemory;
LPWAVEHDR lpInWaveHdr;
lpmemory=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,size);
if(lpmemory==NULL)
ShowMessage("Failed to GloabalAlloc memory for data sublpData");
if((sublpData=(HPSTR)GlobalLock(lpmemory))==NULL)
{::MessageBox(0,"Failed to lock memory for data sublpData",NULL,MB_OK|MB_ICONEXCLAMATION);
}
lpmemory=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,(DWORD)sizeof(WAVEHDR));
if(lpmemory==NULL)ShowMessage("Failed to globalAlloc memory for data LPWAVEHDR");
lpInWaveHdr=(LPWAVEHDR)GlobalLock(lpmemory);
if(lpInWaveHdr==NULL)
{::MessageBox(0,"failed to lock memory for header:lplpInWaveHdr",NULL,MB_OK|MB_ICONEXCLAMATION);
}
lpInWaveHdr->lpData=sublpData;
lpInWaveHdr->dwBufferLength=size;
lpInWaveHdr->dwLoops=0L;
lpInWaveHdr->dwFlags=0L;
sublpData=NULL;
lpmemory=NULL;
return(lpInWaveHdr);
}
//--------------------------
void FreeInPutBuffer(HWAVEIN hwi,LPWAVEHDR pwh)
{
if(waveInUnprepareHeader(hwi,pwh,sizeof(WAVEHDR))!=MMSYSERR_NOERROR)
ShowMessage("WaveInUnperpareHeader ERROR!");
try
{
delete pwh->lpData;
delete pwh;
}
catch(...)
{ShowMessage("delete pwh error!");
}
}
//----------------------------------------



WaveOutput.h

#ifndef WaveOutPutH
#define WaveOutPutH
#include<MMSystem.h>
//-----------------------
LPWAVEHDR AllocateOutPutLPWAVEHDRMemory(HWAVEOUT phwo,UINT size);
void FreeOutPutBuffer(HWAVEOUT hwo,LPWAVEHDR pwh);
//----------------------------
#endif


WaveOutPut.cpp
#include<vcl.h>
#pragma hdrstop
#include "WaveOutPut.h"
//------------------------
LPWAVEHDR AllocateOutPutLPWAVEHDRMemory(HWAVEOUT phwo,UINT size)
{
LPWAVEHDR lpOutWaveHdr;
lpOutWaveHdr=(LPWAVEHDR)GlobalLock(GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,sizeof(WAVEHDR)));
if(lpOutWaveHdr==NULL)
::MessageBox(0,"Failed to lock memory for header",NULL ,MB_OK|MB_ICONEXCLAMATION);
if((lpOutWaveHdr->lpData=(HPSTR)GlobalLock(GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,size)))==NULL)
::MessageBox(0,"Failed to lock memory for data chumk",NULL,MB_OK|MB_ICONEXCLAMATION);
lpOutWaveHdr->dwBufferLength=size;
lpOutWaveHdr->dwFlags=0L;
lpOutWaveHdr->dwLoops=0L;
waveOutPrepareHeader(phwo,lpOutWaveHdr,sizeof(WAVEHDR));
return(lpOutWaveHdr);
}
//---------------------------------------------------------------------
void FreeOutPutBuffer(HWAVEOUT hwo,LPWAVEHDR pwh)
{
switch(waveOutUnprepareHeader(hwo,pwh,sizeof(WAVEHDR)))
{case MMSYSERR_INVALHANDLE:
ShowMessage("MMSYSERR_INVALHANDLE");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVE");return;
case MMSYSERR_NOMEM:
ShowMessage("MMSYSERR_NOMEM");return;
case WAVERR_STILLPLAYING:
ShowMessage("WAVERR_STILLPLAYING");return;
}
try{
delete pwh->lpData;
delete pwh;
}
catch(...)
{ShowMessage("delete 'pwh'error!");
}
}


NetTelMain.h
//---------------------------------------------------------------------------

#ifndef NetTelMainH
#define NetTelMainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <ScktComp.hpp>
#include<math.h>
#include<MMSystem.h>
#include<Buttons.hpp>
#include <NMSTRM.hpp>
#include <Psock.hpp>
#include<ToolWin.hpp>

#define NETTEL_PORT 2001
//---------------------------------------------------------------------------
class TNetTelForm : public TForm
{
__published: // IDE-managed Components
TServerSocket *ServerSocket1;
TClientSocket *ClientSocket1;
TMainMenu *MainMenu1;
TLabel *Label_IP;
TEdit *Edit_IP;
TPanel *Panel1;
TGroupBox *VolumeGroupBox;
TTrackBar *VolumeBar;
TStatusBar *StatusBar1;
TMenuItem *N1;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *N4;
TMenuItem *N5;
TMenuItem *N6;
TMenuItem *N7;
void __fastcall ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall N2Click(TObject *Sender);
void __fastcall N3Click(TObject *Sender);
void __fastcall N4Click(TObject *Sender);
void __fastcall N5Click(TObject *Sender);
void __fastcall N6Click(TObject *Sender);
void __fastcall VolumeBarChange(TObject *Sender);
private:
WAVEFORMATEX pcmWaveFormat;
HWAVEIN phwi;
LPWAVEHDR lpInWaveHdr[2];
bool IsNeedSwap,IsPaused,WhichToPlay,OutputDeviceUnOpend;
HWAVEOUT pwho;
LPWAVEHDR lpOutWaveHdr[2];
DWORD Volume;
long MsgNumber,timebegin,timeend;
int getwhichtime,ReceiveLength;
void _fastcall InitializeOutputDevice();
void _fastcall CallBackPlay(TMessage*Message);
void _fastcall InitializeInputDevice();

public:

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(MM_WIM_DATA,TMessage* ,CallBackPlay)
END_MESSAGE_MAP(TComponent)
__fastcall TNetTelForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TNetTelForm *NetTelForm;
//---------------------------------------------------------------------------
#endif


NetTelMain.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "NetTelMain.h"
#include "WaveInput.h"
#include "WaveOutPut.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TNetTelForm *NetTelForm;
//---------------------------------------------------------------------------
__fastcall TNetTelForm::TNetTelForm(TComponent* Owner)
: TForm(Owner)
{
IsNeedSwap=true;
IsPaused=true;
WhichToPlay=true;
OutputDeviceUnOpend=true;
getwhichtime=0;
timebegin=timeend=0;
MsgNumber=0;
ReceiveLength=0;
InitializeInputDevice();
ServerSocket1->Port=2001;
ServerSocket1->Active=true;

}
//---------------------------------------------------------------------------
void _fastcall TNetTelForm::InitializeInputDevice()
{
//set up pcm wave format for 11 kHz 8-bit mono.
pcmWaveFormat.wFormatTag=WAVE_FORMAT_PCM;
pcmWaveFormat.nChannels=1;
pcmWaveFormat.nSamplesPerSec=11025L;
pcmWaveFormat.nAvgBytesPerSec=11025L;
pcmWaveFormat.nBlockAlign=1;
pcmWaveFormat.wBitsPerSample=8;
pcmWaveFormat.cbSize=0;
//open the output device

switch(waveInOpen(&phwi,WAVE_MAPPER,&pcmWaveFormat,(unsigned long)Handle,0,CALLBACK_WINDOW))
{ case MMSYSERR_ALLOCATED:
ShowMessage("MMSYSERR_ALLOCTEC");return;
case MMSYSERR_BADDEVICEID:
ShowMessage("MMSYSERR_BADDEVICEID");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case WAVERR_STILLPLAYING:
ShowMessage("WAVERR_STILLPLAYING");return;
case WAVERR_BADFORMAT:
ShowMessage("WAVERR_BADFORMAT");return;
}
// ALLOCATE MEMORY AND PERPARE FOR RECORDING
for(int i=0;i<=1;i++)
{lpInWaveHdr[i]=AllocateInputLPWAVEHDRMemory(4*1024);
switch(waveInPrepareHeader(phwi,lpInWaveHdr[i],sizeof(WAVEHDR)))
{case MMSYSERR_INVALHANDLE:
ShowMessage("MMSYSERR_INVALHANDLE");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case MMSYSERR_NOMEM:
ShowMessage("MMSYSERR_NOMEM");return;
}
}
switch(waveInAddBuffer(phwi,lpInWaveHdr[!IsNeedSwap],sizeof(WAVEHDR)))

{case MMSYSERR_INVALHANDLE:
ShowMessage("MMSYSERR_INVALHANDLE");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case MMSYSERR_NOMEM:
ShowMessage("MMSYSERR_NOMEM");return;
case WAVERR_UNPREPARED:
ShowMessage("WAVE_UNPREPAPERD");return;
}

}
//------------------------------------------------
void _fastcall TNetTelForm::CallBackPlay(TMessage *Message)
{
switch(waveInAddBuffer(phwi,lpInWaveHdr[!IsNeedSwap],sizeof(WAVEHDR)))
{ case WAVERR_UNPREPARED:
ShowMessage("WAVE_UNPREPAPERD");return;
case MMSYSERR_INVALHANDLE:
ShowMessage("MMSYSERR_INVALHANDLE");return;
case MMSYSERR_NODRIVER:
ShowMessage("MMSYSERR_NODRIVER");return;
case MMSYSERR_NOMEM:
ShowMessage("MMSYSERR_NOMEM");return;
}
ClientSocket1->Socket->SendBuf(lpInWaveHdr[!IsNeedSwap]->lpData,lpInWaveHdr[!IsNeedSwap]->dwBufferLength);
IsNeedSwap=!IsNeedSwap;
}
//------------------------
void _fastcall TNetTelForm::InitializeOutputDevice()
{if(waveOutOpen(&pwho,WAVE_MAPPER,&pcmWaveFormat,(unsigned long)Handle,0,CALLBACK_WINDOW)!=MMSYSERR_NOERROR)
::MessageBox(0,"out Open error","",MB_OK);
for(int i=0;i<=1;i++)
lpOutWaveHdr[i]=AllocateOutPutLPWAVEHDRMemory(pwho,4*1024);
Volume=Volume&0x00000000;
Volume=Volume^((DWORD)0xFFFF/2);
Volume=Volume^(((DWORD)0xFFFF/2)<<16);
if(waveOutSetVolume(pwho,Volume)!=MMSYSERR_NOERROR)
ShowMessage("waveOutSetVolume error!");
}

void __fastcall TNetTelForm::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
if(OutputDeviceUnOpend)
{ InitializeOutputDevice();
OutputDeviceUnOpend=false;
}
try{ReceiveLength=Socket->ReceiveLength();
Socket->ReceiveBuf(lpOutWaveHdr[WhichToPlay]->lpData,ReceiveLength);
StatusBar1->Panels->Items[1]->Text=AnsiString("Packages:")+MsgNumber++;
if(waveOutWrite(pwho,lpOutWaveHdr[WhichToPlay],sizeof(WAVEHDR))==MMSYSERR_NOERROR)
StatusBar1->Panels->Items[0]->Text=AnsiString("Status:")+(int)WhichToPlay;
StatusBar1->Panels->Items[2]->Text=AnsiString("PSize:")+ReceiveLength;
WhichToPlay=!WhichToPlay;}
catch(...)
{StatusBar1->Panels->Items[0]->Text="WaveOut ERRor";}
}
//---------------------------------------------------------------------------

void __fastcall TNetTelForm::ConnectClick(TObject *Sender)
{
ClientSocket1->Active=false;
ClientSocket1->Address=Edit_IP->Text;
ClientSocket1->Port=2001;
ClientSocket1->Active=true;
}
//---------------------------------------------------------------------------

void __fastcall TNetTelForm::StartClick(TObject *Sender)
{
IsPaused=false;
waveInStart(phwi);
}
//---------------------------------------------------------------------------

void __fastcall TNetTelForm::PauseClick(TObject *Sender)
{
if(!IsPaused)
waveInStop(phwi);
}
//---------------------------------------------------------------------------

void __fastcall TNetTelForm::ResumeClick(TObject *Sender)
{
waveInStart(phwi);
}
//---------------------------------------------------------------------------

void __fastcall TNetTelForm::StopClick(TObject *Sender)
{
ServerSocket1->Active=false;
ClientSocket1->Active=false;
IsPaused=true;
waveInReset(phwi);
waveInStop(phwi);
for(int i=0;i<=1;i++) FreeInPutBuffer(phwi,lpInWaveHdr[i]);
waveInClose(phwi);
waveOutReset(pwho);
waveOutBreakLoop(pwho);
for(int i=0;i<=1;i++)FreeOutPutBuffer(pwho,lpOutWaveHdr[i]);
waveOutClose(pwho);
StatusBar1->Panels->Items[0]->Text="Is Stoped";
}
//---------------------------------------------------------------------------

void __fastcall TNetTelForm::VolumeBarChange(TObject *Sender)
{
Volume=Volume&0x00000000;
Volume=Volume^((DWORD)VolumeBar->Position*0xFFFF/100);
Volume=Volume^((DWORD)VolumeBar->Position*0xFFFF/100<<16);
if(waveOutSetVolume(pwho,Volume)!=MMSYSERR_NOERROR)
ShowMessage("waveoutsetvolumeerror");
}
//---------------------------------------------------------------------------

void __fastcall TNetTelForm::ExitClick(TObject *Sender)
{ if(!IsPaused)
{StopClick(Sender);}
Close();
}

void __fastcall TNetTelForm::FormDestroy(TObject *Sender)
{ExitClick(Sender);
}

void __fastcall TNetTelForm::TerminatedClick(TObject *Sender)
{ delete &phwi;
ExitClick(Sender);
TerminateProcess(GetCurrentProcess(),THREAD_SUSPEND_RESUME);
}

void __fastcall TNetTelForm::ClientSocket1Connect(TObject *Sender,TCustomWinSocket *Socket)
{StatusBar1->Panels-Items[0]->Text="Connect OK!";}

void __fastcall TNetTelForm::ClientSocket1Error(TObject *Sender,TCustomWinSocket *Socket,TErrorEvent ErrorEvent,int &ErrorCode)
{Socket->Close();}

void __fastcall TNetTelForm::ServerSocket1Error(TObject *Sender,TCustomWinSocket *Socket,TErrorEvent ErrorEvent,int &ErrorCode)
{Socket->Close();}
语音传输设置
为了减少语音延迟,语音抖动,提高压缩比.设置如下:
声音源 采样率为22.050KHZ,16位,单声道.
22.050*2*1=44.1KB/S
语音延迟最佳为0.1秒,所以内存缓存大小为4-5KB
提高压缩比:录制45.5秒的声音大小为1960KB
在C466,64MB采用解霸2000,22.050KHZ,128千位/S,用了14秒,mp3大小为709KB.
为了及时压缩需要P2-233MHZ系统,10MB网络
shak 2001-08-25
  • 打赏
  • 举报
回复
不好意思 我的能运行 当没有经过测试 我的条件不好
感谢各位!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

自从过江项羽发表了对我的抗议后我的问题没能理
我在此向各位道歉!!!!!!!
其实是误会啊!!!!
请各位到 对shak(大白鲨)表示抗议 我做的解释
wjzhuang 2001-08-25
  • 打赏
  • 举报
回复
dragonki:
你的会不会有我这样的问题?
rh 2001-08-25
  • 打赏
  • 举报
回复
楼上的,不知道是谁的bug?
enyuan 2001-08-25
  • 打赏
  • 举报
回复
用bcb很多bug没搞好,注定要失败,用vc.
lovedog 2001-08-25
  • 打赏
  • 举报
回复
我也要一份啊!!
usefulinfo@21cn.com
dragonki 2001-08-24
  • 打赏
  • 举报
回复
发了
sunchunqian 2001-08-24
  • 打赏
  • 举报
回复
dragonki(dragonki)兄:
能不能麻烦你把你的程序(代码及可执行程序)也给我发一份,
sunchunqian@sina.com
感激不尽!
谢谢!!
wjzhuang 2001-08-24
  • 打赏
  • 举报
回复
up~
wjzhuang 2001-08-24
  • 打赏
  • 举报
回复
dragonki:
就是一直说话才出错,我本来想唱首歌,可她就是不让我把歌唱完.
气死我了~~~~~~
dragonki 2001-08-23
  • 打赏
  • 举报
回复
多久?
这个过程中有没有说话?
出错提示信息是什么?
wjzhuang 2001-08-23
  • 打赏
  • 举报
回复
呵呵~~~~~~~大白鲨别激动.
你给我的程序我运行确实有问题,后来dragonki老兄又给了我一个.
我运行了可以.
不过请问两位老兄:
这个程序运行久了会出问题.提示信息是Sock的问题.
请问这是什么原因?
shak 2001-08-23
  • 打赏
  • 举报
回复
这是你的问题
我发给你的是能运行的
shak 2001-08-23
  • 打赏
  • 举报
回复
这是我的 你们还到处去骂我
AutoAsm 2001-08-22
  • 打赏
  • 举报
回复
不压缩恐怕有些够戗,不过还是祝贺你。
wjzhuang 2001-08-22
  • 打赏
  • 举报
回复
没有压缩,我先能运行通过再考虑压缩
wangledong 2001-08-22
  • 打赏
  • 举报
回复
问大家一下,这个程序采用语音压缩了没有?现在有什么方法可以压缩?
Dogface 2001-08-22
  • 打赏
  • 举报
回复
我和楼上的老兄情况一样,也给我一份吧。
dogface@263.net
SCUM 2001-08-22
  • 打赏
  • 举报
回复
dragonki(dragonki) 兄,我也想要一份好吧?谢谢!

thescum@sohu.com
wjzhuang 2001-08-22
  • 打赏
  • 举报
回复
 dragonki(dragonki)老兄:
能不能麻烦你把你的程序(要代码)给我发一份,
编译好的可执行程序也给我一份(要可以独立运行的),
我的就是不行,很奇怪,我对照一下你的
wjzhuang@sina.com
谢谢
加载更多回复(23)
看大家都在参与,有很多很好的源码值得学习,我也来凑个热闹,眼前语音助手有的人可能会知道,不知道的功能介绍在下面,最要是自动家家触发系统,写这个系统的难点在于触发系统的设计思路和其稳定性,所以建议改动内核源码前用复件去改. 最新是写到桌面宠物和任务栏编辑框后来没写了(可能有BUG),因为又去写了一个机器聊天学习系统希望加入里面,但写出来发现这种大型数据学习系统真不是我这台I5处理器可以跑的动的,动不动就要跑半个月...后来又因为有的代码老是重复写就又去写了一个编程助手,跑题了,眼前语音助手是我真正定下心来写的第一个程序,所以你们可以从代码里看到我的一些学习过程,集成了百度和讯飞两种识别在里面, 经过测试讯飞识别率比百度高.大家用的时候最好编译出来,效率要高几倍.希望大家喜欢,谢谢大家 PS:为了大家拿到就可以用,所以里面有的东西没去掉,所以请善待作者不解释,相信大家 程序基于网络 大部分功能都需要连网,按F8键可以显示程序界面,请配合耳麦使用本程序,当你说话时程序界面上的分贝值跳动时证明耳麦连接正常。  重要:分贝过滤值 是用来过滤分贝的,也就是说你设为多少,那么声音必须大于这个,才可以有用.如果环境很吵,你可以设高些,具体就可以试验一下; 而过滤值下面那个数字,就是通过了分贝过滤限制的实时值。如果真的太吵,你可以把分贝过滤值设到很高,然后用手动模式,按F1手动模式,按一下开始说话,说完再按一下开始识别。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧