return TRUE;
cerr << \if (isEncoding)
cerr << GetSoundChannelRecordDevice(); else
cerr << GetSoundChannelPlayDevice();
cerr << \return FALSE; }
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// EndPoint的实现分析完毕.
H323Connection的实现, 这个Connection的实现太简单了.可能不足以说明问题
我也没什么好说的了
/////////////////////////////////////////////////////////////// SimpleH323Connection::SimpleH323Connection(SimpleH323EndPoint & ep, unsigned r ef)
: H323Connection(ep, ref) { }
BOOL SimpleH323Connection::OnStartLogicalChannel(H323Channel & channel) {
if (!H323Connection::OnStartLogicalChannel(channel)) return FALSE;
cout << \switch (channel.GetDirection()) { case H323Channel::IsTransmitter : cout << \break;
case H323Channel::IsReceiver : cout << \break; default : break; }
cout << channel.GetCapability() << endl; return TRUE; }
void SimpleH323Connection::OnUserInputString(const PString & value) {
cout << \}
// End of File
///////////////////////////////////////////////////////////////
总结一下基本的过程就是创建一个H323Endpoint的对象endpoint, 创建对象后这个程序就
有好多个小的线程被创建了.然后EndPoint开始监听来电, 之后判断是否直接呼叫另一个h
323的Endpoint. 然后就是一个for循环, 判断标准的输入, 并通过当前的token来lock一个
Connection, 每个连接会有唯一的一个token, lock的意思是说, 在被lock的期间是不能被
释放的. 根据输入的字符决定对得到的连接做什么.
OpenAM:
是个answer machine, 自动应答机, 或者是留言机. 实现的很简单, 里面对OpenH323使用 的思路很有价值.
./openam –n –-g711message sample_message.wav
这样运行, 用netmeeting 连接一下这个IP, netmeeting就会放一段简单的英语, 测测你的
英语听力, 他在讲什么?
这个程序是一个支持多连接和并发连接的Endpoint, 但是他没有使用真正的声音设备, 放
出的音从一个已有的wav文件中读出来, 远程用户的留言被录到一个文件里, 文件的名字表
示了是什么时间录制的.
主要的思路是给在连接打开声音通道的时候, 根据isEncoding的值区别是录音还是放音,如
果是录音, 将读文件的Channel附加在codec上, 相反写文件的Channel附件在codec上,注意 这是两个codec.
这个东西给了我们一个方法, 如何使用文件IO来代替声音设备的IO来使用OpenH323.
这是main.h
#ifndef _Voxilla_MAIN_H #define _Voxilla_MAIN_H #include #include #include #include #include #include #include
//主进程
class OpenAm : public PProcess {
PCLASSINFO(OpenAm, PProcess) public: OpenAm(); ~OpenAm();
void Main();
void RecordFile(PArgList & args); void PlayFile(PArgList & args);
protected:
long GetCodec(const PString & codecname);
OpalLineInterfaceDevice * GetDevice(const PString & device); };
//H323 端点
class MyH323EndPoint : public H323EndPoint
{
PCLASSINFO(MyH323EndPoint, H323EndPoint); public:
MyH323EndPoint(unsigned callLimit, const PString & runCmd, const PDirectory & dir, int flags);
// overrides from H323EndPoint
virtual H323Connection * CreateConnection(unsigned callReference); BOOL OnIncomingCall(H323Connection &, const H323SignalPDU &, H323SignalPDU &);
// new functions
BOOL Initialise(PConfigArgs & args);
PString GetGSMOGM() const { return gsmOgm; }
void SetGSMOGM(const PString & s) { gsmOgm = s; } PString GetG711OGM() const { return g711Ogm; }
void SetG711OGM(const PString & s) { g711Ogm = s; } PString GetLPC10OGM() const { return lpc10Ogm; }
void SetLPC10OGM(const PString & s) { lpc10Ogm = s; } #ifdef SPEEX_CODEC
PString GetSPEEXOGM() const { return speexOgm; }
void SetSPEEXOGM(const PString & s) { speexOgm = s; } #endif
PString GetG7231OGM() const { return g7231Ogm; }
void SetG7231OGM(const PString & s) { g7231Ogm = s; } unsigned GetCallLimit() const { return callLimit; } PString GetRunCmd() const { return runCmd; } PDirectory GetDirectory() const { return dir; } void SetRecordWav(const BOOL rec){ recordWav = rec; } BOOL GetRecordWav() const { return recordWav; } enum {
DeleteAfterRecord = 0x01, NoRecordG7231 = 0x02,
HangupAfterPlay = 0x04 };
BOOL GetDeleteAfterRecord() const { return flags & DeleteAfterRecord; } BOOL GetNoRecordG7231() const { return flags & NoRecordG7231; }
BOOL GetHangupAfterPlay() const { return flags & HangupAfterPlay; } protected:
unsigned callLimit;
PString pcmOgm, g711Ogm, gsmOgm, lpc10Ogm, g7231Ogm, runCmd; #ifdef SPEEX_CODEC PString speexOgm; #endif
PDirectory dir; int flags;
BOOL recordWav; };
class PCM_RecordFile; class MyH323Connection;
PQUEUE(PStringQueue, PString); // Out Going Channel OGM //就是发送语音的通道 //即是读文件的通道
class PCM_OGMChannel : public PIndirectChannel {
PCLASSINFO(PCM_OGMChannel, PIndirectChannel); public:
PCM_OGMChannel(MyH323Connection & conn); BOOL Read(void * buffer, PINDEX amount); void PlayFile(PFile * chan); BOOL Close();
void QueueFile(const PString & cmd); void FlushQueue(); void SetRecordTrigger(); void SetHangupTrigger();
void SetPlayOnce() { playOnce = TRUE; }