⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.h

📁 这是一个自动应答机程序
💻 H
字号:
/*
 * main.h
 *
 * PWLib application header file for Voxilla
 *
 * A H.323 "net telephone" application.
 *
 * Copyright (c) 1993-2001 Equivalence Pty. Ltd.
 *
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 *
 * The Original Code is Portable Windows Library.
 *
 * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
 *
 * Portions of this code were written with the assisance of funding from
 * Vovida Networks, Inc. http://www.vovida.com.
 *
 * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
 * All Rights Reserved.
 *
 * Contributor(s): ______________________________________.
 *
 * $Log: main.h,v $
 * Revision 1.3  2008/01/02 19:12:30  willamowius
 * better enforce limit on call duration for video channels
 *
 * Revision 1.2  2007/11/14 15:23:59  willamowius
 * declare overloaded methods as virtual
 *
 * Revision 1.1  2007/11/07 03:42:15  willamowius
 * port OpenAM to H323Plus
 *
 * Revision 1.43  2006/06/26 14:29:40  csoutheren
 * Fixed for new PWLib
 *
 * Revision 1.42  2006/04/19 04:11:53  csoutheren
 * Fix problem when outputting CIF stream using QCIF source
 *
 * Revision 1.41  2006/02/28 10:12:50  csoutheren
 * Added support for NULL receive video
 *
 * Revision 1.40  2006/02/24 10:16:07  csoutheren
 * Fixed for CIF
 *
 * Revision 1.39  2006/02/21 07:52:18  csoutheren
 * Added outgoing video message functions
 *
 * Revision 1.38  2005/11/25 00:52:49  csoutheren
 * Applied patch #1292653
 * OpenAM patch to log calling number
 *
 * Revision 1.37  2005/02/03 01:21:42  csoutheren
 * Added called party to call log and command parameters
 *
 * Revision 1.36  2004/05/03 13:25:46  rjongbloed
 * Converted everything to be codec plug in freindly
 * Removed GSM and G.729 as now plug ins are "the way"!
 *
 * Revision 1.35  2004/01/02 02:52:10  csoutheren
 * Thanks to Michal Zygmuntowicz for these changes
 *   Added support for iLBC codec
 *   Added ability to specify a gatekeeper password,
 *   Fixed small bug with Speex capabilities being accidentally included.
 *
 * Revision 1.34  2003/12/02 09:46:59  csoutheren
 * Added --loop option thanks to Jan Willamowius
 *
 * Revision 1.33  2002/11/13 10:23:12  rogerh
 * Enable Speex support by default.
 *
 * Revision 1.32  2002/08/16 02:04:30  craigs
 * Ensure compilation without Speex installed
 *
 * Revision 1.31  2002/08/15 18:52:49  rogerh
 * Add support for one of the Speex codecs
 *
 * Revision 1.30  2002/08/05 10:06:06  robertj
 * Changed to use the version of G.7231. file capability/codec as used in
 *   opalvxml module. Prevents duplicate symbol link errors.
 *
 * Revision 1.29  2002/04/01 14:45:43  craigs
 * Fixed flag to end call after OGM
 *
 * Revision 1.28  2002/04/01 13:16:09  craigs
 * Added ability to kill calls at end of playing OGM
 * Added ability to play different OGMs depending on target DN
 *
 * Revision 1.27  2002/02/21 07:21:52  rogerh
 * Change the outgoing audio's FrameDelay() code to use the PAdaptiveDelay
 * class which should give clearer audio for the OGMs.
 *
 * Revision 1.26  2002/01/22 04:15:04  craigs
 * Updated for move of PWavFile to PTCLib
 * Replaced AudioDelay with PAdaptiveDelay
 *
 * Revision 1.25  2001/10/15 14:10:01  rogerh
 * Add new definitions
 *
 * Revision 1.24  2001/09/29 07:11:48  rogerh
 * Delete ogmChanel in destructor - Patrick Koorevaar <pkoorevaar@hotmail.com>
 * Only call conn.ClearCall() once after we pass the record time limit.
 * Reported by Patrick.
 *
 * Revision 1.23  2001/09/28 00:13:48  robertj
 * Changed BYTE* to PBYTEArray so get automatic memory management.
 *
 * Revision 1.22  2001/09/24 22:39:42  craigs
 * Added commands to play and record data files, esp G.723.1
 *
 * Revision 1.21  2001/07/23 09:17:36  rogerh
 * Add the LPC10 codec, a low quality and low bitrate codec.
 *
 * Revision 1.20  2001/07/17 14:33:01  rogerh
 * Support writing of .wav audio files from PCM codecs (eg G711 and GSM).
 * .wav files are written out by default now. If you still want to record
 * to raw audio files with a .sw extension, use the --recordraw option.
 *
 * Revision 1.19  2001/07/01 07:38:58  rogerh
 * Add Microsoft GSM codec. Also allocate memory for frameBuffer dynamically
 * as different codecs can have different frame sizes.
 *
 * Revision 1.18  2001/06/29 11:13:15  rogerh
 * Add AudioDelay class which removes the jitter in recorded files.
 *
 * Revision 1.17  2001/06/29 06:34:57  rogerh
 * Add mutex locks in PCM_Recordfile. This solves the race condition where
 * Close() was called while Write() was still running.
 *
 * Revision 1.16  2000/08/29 12:32:08  craigs
 * Fixed problems with recording messages
 *
 * Revision 1.15  2000/08/28 16:42:59  craigs
 * Finally fixed problems with G.723.1. All codecs now working
 *
 * Revision 1.14  2000/08/28 07:49:51  craigs
 * Added extra stuff
 *
 * Revision 1.13  2000/08/28 00:38:37  craigs
 * Added support for setting listening port number
 *
 * Revision 1.12  2000/08/27 23:42:24  craigs
 * Fixed problem with playback of messages
 * Fixed problem with recording messages
 *
 * Revision 1.11  2000/05/25 12:06:17  robertj
 * Added PConfigArgs class so can save program arguments to config files.
 *
 * Revision 1.10  2000/05/10 05:14:25  robertj
 * Changed capabilities so has a function to get name of codec, instead of relying on PrintOn.
 *
 * Revision 1.9  2000/05/09 11:22:15  craigs
 * Fixed problems caused by new jitter buffer code
 * and fixed OGM problems
 *
 * Revision 1.8  2000/04/25 23:34:22  craigs
 * Added lots of new code, including outgoing and incoming
 * multiplexors, and the start of an IVR system
 *
 * Revision 1.7  2000/01/13 04:03:45  robertj
 * Added video transmission
 *
 * Revision 1.6  1999/11/11 00:27:49  robertj
 * Changed OnAnswerCall() call back function  to allow for asyncronous response.
 *
 * Revision 1.5  1999/11/06 13:27:49  craigs
 * Added extra output and changed for new library changes
 *
 * Revision 1.4  1999/10/24 12:50:37  craigs
 * Fixed G723.1 capability, and added ability for discrete OGMs
 *
 * Revision 1.3  1999/10/24 03:08:49  craigs
 * Fixed problem with recording zero length messages, and added autodelete of files
 *
 * Revision 1.2  1999/10/22 09:56:41  craigs
 * Fixed compile warning
 *
 * Revision 1.1  1999/10/11 00:15:18  craigs
 * Initial version
 *
 *
 */

#ifndef _Voxilla_MAIN_H
#define _Voxilla_MAIN_H

#include <h323.h>
#include <h323pdu.h>
#include <h245.h>
//f#include <lid.h>

#include <ptclib/pwavfile.h>
#include <ptclib/delaychan.h>

#ifndef NO_H323_VIDEO
#if P_VIDFILE
#define OPENAM_VIDEO  1
#endif
#endif

#if OPENAM_VIDEO
#include <ptlib/video.h>
#endif

class MyH323EndPoint : public H323EndPoint
{
  PCLASSINFO(MyH323EndPoint, H323EndPoint);

  public:
    MyH323EndPoint(unsigned callLimit,
                   const PString & runCmd,
                   const PDirectory & dir,
                   int flags);
	virtual ~MyH323EndPoint() { };

    // overrides from H323EndPoint
    virtual H323Connection * CreateConnection(unsigned callReference);
    virtual BOOL OnIncomingCall(H323Connection &, const H323SignalPDU &, H323SignalPDU &);

    // new functions
    virtual 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; }

    PString    GetSPEEXOGM() const            { return speexOgm; }
    void       SetSPEEXOGM(const PString & s) { speexOgm = s; }

    PString    GetG7231OGM() const            { return g7231Ogm; }
    void       SetG7231OGM(const PString & s) { g7231Ogm = s; }

    PString    GetiLBCOGM() const            { return ilbcOgm; }
    void       SetiLBCOGM(const PString & s) { ilbcOgm = 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; }

    void       SetLoopMessage(BOOL flag) { loopMessage = flag; }
    BOOL       GetLoopMessage() const    { return loopMessage; }

#if OPENAM_VIDEO
    PString GetVideoOGM() const       { return videoOgm; }
    int     GetVideoSize() const      { return videoSize; }
    BOOL    GetVideoIsPal() const     { return videoIsPal; }
    int     GetVideoFrameRate() const { return frameRate; }
    int     GetVideoPlayMode() const  { return videoChannel; }
#endif
    
    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;
    PString speexOgm, ilbcOgm;
    PDirectory dir;
    int flags;
    BOOL recordWav;
    BOOL loopMessage;
#if OPENAM_VIDEO
    PString videoOgm;
    int videoSize;
    int frameRate;
    int videoChannel;
    BOOL videoIsPal;
#endif
};

class OpenAm : public PProcess
{
  PCLASSINFO(OpenAm, PProcess)

  public:
    OpenAm();
    ~OpenAm();

    void Main();
    static void Shutdown();

  protected:
    static MyH323EndPoint * endpoint;
};

class PCM_RecordFile;
class MyH323Connection;
PQUEUE(PStringQueue, PString);

class PCM_OGMChannel : public PIndirectChannel
{
  PCLASSINFO(PCM_OGMChannel, PIndirectChannel);

  public:
    PCM_OGMChannel(MyH323Connection & conn);

    virtual BOOL Read(void * buffer, PINDEX amount);
    virtual void PlayFile(PFile * chan);

    virtual BOOL Close();

    void QueueFile(const PString & cmd);
    void FlushQueue();

    void SetRecordTrigger();
    void SetHangupTrigger();

    void SetPlayOnce() { playOnce = TRUE; }
    void SetLoopMessage() { loopMessage = TRUE; }

  protected:
    virtual BOOL ReadFrame(PINDEX amount);
    virtual void CreateSilenceFrame(PINDEX amount);
    virtual void Synchronise(PINDEX amount);
    virtual BOOL IsWAVFileValid(PWAVFile *chan);

    BOOL AdjustFrame(void * buffer, PINDEX amount);

    PStringQueue playQueue;

    MyH323Connection & conn;
    PMutex chanMutex;
    int silentCount;
    int totalData;
    BOOL recordTrigger, hangupTrigger;
    BOOL closed;
    BOOL playOnce;
	  BOOL loopMessage;

    PAdaptiveDelay ogm_delay;

    PBYTEArray frameBuffer;
    PINDEX frameLen, frameOffs;
};

class G7231_OGMChannel : public PCM_OGMChannel
{
  PCLASSINFO(G7231_OGMChannel, PCM_OGMChannel);
  public:
    G7231_OGMChannel(MyH323Connection & conn);

  protected:
    virtual BOOL ReadFrame(PINDEX amount);
    virtual void CreateSilenceFrame(PINDEX amount);
    virtual void Synchronise(PINDEX amount);
    virtual BOOL IsWAVFileValid(PWAVFile *chan);
};

class TimeLimitedVideoChannel : public PVideoChannel
{
	PCLASSINFO(TimeLimitedVideoChannel, PVideoChannel);
	public:
		TimeLimitedVideoChannel(MyH323Connection & _conn, unsigned _callLimit);

		virtual BOOL Write(const void * buf, PINDEX len);

	protected:
		MyH323Connection & conn;
		unsigned callLimit;
		PTime finishTime;
};

class MyH323Connection : public H323Connection
{
  PCLASSINFO(MyH323Connection, H323Connection);

  public:
    MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
    virtual ~MyH323Connection();

    // overrides from H323Connection
    virtual BOOL OpenAudioChannel(BOOL, unsigned, H323AudioCodec & codec);
#if OPENAM_VIDEO
    virtual BOOL OpenVideoChannel(BOOL, H323VideoCodec & codec);
#endif
    virtual AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
    virtual BOOL OnStartLogicalChannel(H323Channel & channel);
    virtual void OnUserInputString(const PString & value);
    virtual BOOL OnReceivedSignalSetup(const H323SignalPDU & setupPDU);

    // new functions
    void StartRecording();
    void Hangup();

    void SetE164Number(const PString & _num)
      { e164Number = _num; }

    PString GetE164Number() const
      { return e164Number; }

  protected:
#if OPENAM_VIDEO
    BOOL InitGrabber(PVideoInputDevice  * grabber, unsigned newWidth, unsigned newHeight);
#endif

    void OnUserInputChar(char ch);
    BOOL StartMenu(int menuNumber);
    BOOL ProcessMenuCmd(const PString & cmdStr);

    const MyH323EndPoint & ep;
    PString product;
    PTime   callStartTime;
    PTime   recordStartTime;
    PString basename;
    PFilePath recordFn;
    PString transmitAudioCodecName, receiveAudioCodecName;
#if OPENAM_VIDEO
    PString transmitVideoCodecName, receiveVideoCodecName;
#endif
    BOOL    recordTrigger;
    PString calledParty;
    PMutex  connMutex;

    PCM_RecordFile * recordFile;
    PCM_OGMChannel * ogmChannel;

    PString digits, lastDigits;
    int currentMenu;
    PStringList menuNames;

    PString securityToken, e164Number;
    PString sourceno;
};

class PCM_RecordFile : public PIndirectChannel
{
  PCLASSINFO(PCM_RecordFile, PIndirectChannel)

  public:
    PCM_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callLimit);
    virtual ~PCM_RecordFile();

    virtual BOOL Write(const void * buf, PINDEX len);
    virtual BOOL Close();
    virtual void StartRecording();

    virtual void DelayFrame(PINDEX len);
    virtual BOOL WriteFrame(const void * buf, PINDEX len);

    virtual BOOL WasRecordStarted() const { return recordStarted; }

  protected:
    MyH323Connection & conn;
    PTime finishTime;
    PFilePath fn;
    unsigned callLimit;
    BOOL recordStarted;
    BOOL timeLimitExceeded;
    BOOL closed;
    BOOL isPCM;
    BOOL dataWritten;
    PAdaptiveDelay delay;
    PMutex pcmrecordMutex;
    PFile *fileclass; // will point to a PWAVFile or PFile class
};

class G7231_RecordFile : public PCM_RecordFile
{
  PCLASSINFO(G7231_RecordFile, PCM_RecordFile);

  public:
    G7231_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callLimit);
    virtual void DelayFrame(PINDEX len);
    virtual BOOL WriteFrame(const void * buf, PINDEX len);
};


#endif  // _Voxilla_MAIN_H


// End of File ///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -