home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / openh323.tar.gz / openh323.tar / openh323 / include / vpblid.h < prev    next >
C/C++ Source or Header  |  2003-08-13  |  11KB  |  363 lines

  1. /*
  2.  * vpblid.h
  3.  *
  4.  * Voicetronix VPB4 line interface device
  5.  *
  6.  * Copyright (c) 1999-2000 Equivalence Pty. Ltd.
  7.  *
  8.  * The contents of this file are subject to the Mozilla Public License
  9.  * Version 1.0 (the "License"); you may not use this file except in
  10.  * compliance with the License. You may obtain a copy of the License at
  11.  * http://www.mozilla.org/MPL/
  12.  *
  13.  * Software distributed under the License is distributed on an "AS IS"
  14.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  15.  * the License for the specific language governing rights and limitations
  16.  * under the License.
  17.  *
  18.  * The Original Code is Open H323 Library.
  19.  *
  20.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  21.  *
  22.  * Contributor(s): ______________________________________.
  23.  *
  24.  * $Log: vpblid.h,v $
  25.  * Revision 1.16  2003/08/13 22:02:03  dereksmithies
  26.  * Apply patch from Daniel Bichara to GetOSHandle() for VPB devices. Thanks.
  27.  *
  28.  * Revision 1.15  2003/03/05 06:26:41  robertj
  29.  * Added function to play a WAV file to LID, thanks Pietro Ravasio
  30.  *
  31.  * Revision 1.14  2002/09/16 01:14:15  robertj
  32.  * Added #define so can select if #pragma interface/implementation is used on
  33.  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
  34.  *
  35.  * Revision 1.13  2002/09/03 06:19:37  robertj
  36.  * Normalised the multi-include header prevention ifdef/define symbol.
  37.  *
  38.  * Revision 1.12  2002/08/05 10:03:47  robertj
  39.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  40.  *
  41.  * Revision 1.11  2002/07/02 03:20:37  dereks
  42.  * Fix check for line disconnected state.   Remove timer on line ringing.
  43.  *
  44.  * Revision 1.10  2001/11/19 06:35:59  robertj
  45.  * Added tone generation handling
  46.  *
  47.  * Revision 1.9  2001/09/13 05:27:46  robertj
  48.  * Fixed incorrect return type in virtual function, thanks Vjacheslav Andrejev
  49.  *
  50.  * Revision 1.8  2001/02/09 05:16:24  robertj
  51.  * Added #pragma interface for GNU C++.
  52.  *
  53.  * Revision 1.7  2001/01/25 07:27:14  robertj
  54.  * Major changes to add more flexible OpalMediaFormat class to normalise
  55.  *   all information about media types, especially codecs.
  56.  *
  57.  * Revision 1.6  2001/01/24 05:34:49  robertj
  58.  * Altered volume control range to be percentage, ie 100 is max volume.
  59.  *
  60.  * Revision 1.5  2000/11/24 10:50:52  robertj
  61.  * Modified the ReadFrame/WriteFrame functions to allow for variable length codecs.
  62.  *
  63.  * Revision 1.4  2000/11/20 04:35:40  robertj
  64.  * Changed tone detection API slightly to allow detection of multiple
  65.  * simultaneous tones
  66.  *
  67.  * Revision 1.3  2000/05/02 04:32:25  robertj
  68.  * Fixed copyright notice comment.
  69.  *
  70.  * Revision 1.2  2000/01/07 08:28:09  robertj
  71.  * Additions and changes to line interface device base class.
  72.  *
  73.  * Revision 1.1  1999/12/23 23:02:35  robertj
  74.  * File reorganision for separating RTP from H.323 and creation of LID for VPB support.
  75.  *
  76.  */
  77.  
  78. #ifndef __OPAL_VPBLID_H
  79. #define __OPAL_VPBLID_H
  80.  
  81. #ifdef P_USE_PRAGMA
  82. #pragma interface
  83. #endif
  84.  
  85.  
  86. #include "lid.h"
  87. #include <vpbapi.h>
  88.  
  89.  
  90. ///////////////////////////////////////////////////////////////////////////////
  91. // DR - this thread is needed to keep tones playing indefinately, as VPB
  92. // tones normally end after a defined period.
  93. class ToneThread : public PThread
  94. {
  95.   PCLASSINFO(PThread, ToneThread);
  96.  
  97.   public:
  98.     ToneThread(int handle, VPB_TONE tone);
  99.     ~ToneThread();
  100.     void Main();
  101.  
  102.   private:
  103.     int        handle;   // VPB handle to play tone on
  104.     VPB_TONE   vpbtone;  // tone parameters of tone to play
  105.     PSyncPoint shutdown; // used to signal Main() to finish
  106. };
  107.  
  108.  
  109. /**This class describes the Voicetronix line interface device.
  110.  */
  111. class OpalVpbDevice : public OpalLineInterfaceDevice
  112. {
  113.   PCLASSINFO(OpalVpbDevice, OpalLineInterfaceDevice);
  114.  
  115.   public:
  116.     /**Create a new, closed, device for a VPB card.
  117.       */
  118.     OpalVpbDevice();
  119.  
  120.     /**Destroy line interface device.
  121.        This calls Close() on the device.
  122.       */
  123.     ~OpalVpbDevice() { Close(); }
  124.  
  125.     /**Open the device.
  126.       */
  127.     virtual BOOL Open(
  128.       const PString & device      /// Device identifier name.
  129.     );
  130.  
  131.     /**Close the device.
  132.       */
  133.     virtual BOOL Close();
  134.  
  135.     /**Get the device name.
  136.       */
  137.     virtual PString GetName() const;
  138.  
  139.     /**Get the total number of lines supported by this device.
  140.       */
  141.     virtual unsigned GetLineCount();
  142.  
  143.  
  144.     /**Determine if line is currently off hook.
  145.        This returns TRUE if GetLineState() is a state that implies the line is
  146.        off hook (eg OffHook or LineBusy).
  147.       */
  148.     virtual BOOL IsLineOffHook(
  149.       unsigned line   /// Number of line
  150.     );
  151.  
  152.     /**Set the state of the line.
  153.        Note that not be possible on a given line.
  154.       */
  155.     virtual BOOL SetLineOffHook(
  156.       unsigned line,        /// Number of line
  157.       BOOL newState = TRUE  /// New state to set
  158.     );
  159.  
  160.  
  161.     /**Determine if line is ringing.
  162.       */
  163.     virtual BOOL IsLineRinging(
  164.       unsigned line,          /// Number of line
  165.       DWORD * cadence = NULL  /// Cadence of incoming ring
  166.     );
  167.  
  168.     /**Determine if line has been disconnected from a call.
  169.        return TRUE if a tone is detected.
  170.       */
  171.     virtual BOOL IsLineDisconnected(
  172.       unsigned line,   /// Number of line
  173.       BOOL checkForWink = TRUE
  174.     );
  175.  
  176.     /**Get the media formats this device is capable of using.
  177.       */
  178.     virtual OpalMediaFormat::List GetMediaFormats() const;
  179.  
  180.     /**Set the codec for reading.
  181.       */
  182.     virtual BOOL SetReadFormat(
  183.       unsigned line,    /// Number of line
  184.       const OpalMediaFormat & mediaFormat   /// Codec type
  185.     );
  186.  
  187.     /**Set the codec for writing.
  188.       */
  189.     virtual BOOL SetWriteFormat(
  190.       unsigned line,    /// Number of line
  191.       const OpalMediaFormat & mediaFormat   /// Codec type
  192.     );
  193.  
  194.     /**Get the media format (codec) for reading on the specified line.
  195.       */
  196.     virtual OpalMediaFormat GetReadFormat(
  197.       unsigned line    /// Number of line
  198.     );
  199.  
  200.     /**Get the media format (codec) for writing on the specified line.
  201.       */
  202.     virtual OpalMediaFormat GetWriteFormat(
  203.       unsigned line    /// Number of line
  204.     );
  205.  
  206.     /**Stop the read codec.
  207.       */
  208.     virtual BOOL StopReadCodec(
  209.       unsigned line   /// Number of line
  210.     );
  211.  
  212.     /**Stop the write codec.
  213.       */
  214.     virtual BOOL StopWriteCodec(
  215.       unsigned line   /// Number of line
  216.     );
  217.  
  218.     /**Set the read frame size in bytes.
  219.        Note that a LID may ignore this value so always use GetReadFrameSize()
  220.        for I/O.
  221.       */
  222.     virtual BOOL SetReadFrameSize(
  223.       unsigned line,    /// Number of line
  224.       PINDEX frameSize  /// New frame size
  225.     );
  226.  
  227.     /**Set the write frame size in bytes.
  228.        Note that a LID may ignore this value so always use GetReadFrameSize()
  229.        for I/O.
  230.       */
  231.     virtual BOOL SetWriteFrameSize(
  232.       unsigned line,    /// Number of line
  233.       PINDEX frameSize  /// New frame size
  234.     );
  235.  
  236.     /**Get the read frame size in bytes.
  237.        All calls to ReadFrame() will return this number of bytes.
  238.       */
  239.     virtual PINDEX GetReadFrameSize(
  240.       unsigned line   /// Number of line
  241.     );
  242.  
  243.     /**Get the write frame size in bytes.
  244.        All calls to WriteFrame() must be this number of bytes.
  245.       */
  246.     virtual PINDEX GetWriteFrameSize(
  247.       unsigned line   /// Number of line
  248.     );
  249.  
  250.     /**Low level read of a frame from the device.
  251.      */
  252.     virtual BOOL ReadFrame(
  253.       unsigned line,    /// Number of line
  254.       void * buf,   /// Pointer to a block of memory to receive the read bytes.
  255.       PINDEX & count    /// Number of bytes read, <= GetReadFrameSize()
  256.     );
  257.  
  258.     /**Low level write frame to the device.
  259.      */
  260.     virtual BOOL WriteFrame(
  261.       unsigned line,    /// Number of line
  262.       const void * buf, /// Pointer to a block of memory to write.
  263.       PINDEX count,     /// Number of bytes to write, <= GetWriteFrameSize()
  264.       PINDEX & written  /// Number of bytes written, <= GetWriteFrameSize()
  265.     );
  266.  
  267.  
  268.     /**Set volume level for recording.
  269.        A value of 100 is the maximum volume possible for the hardware.
  270.        A value of 0 is the minimum volume possible for the hardware.
  271.       */
  272.     virtual BOOL SetRecordVolume(
  273.       unsigned line,    /// Number of line
  274.       unsigned volume   /// Volume level from 0 to 100%
  275.     );
  276.  
  277.     /**Set volume level for playing.
  278.        A value of 100 is the maximum volume possible for the hardware.
  279.        A value of 0 is the minimum volume possible for the hardware.
  280.       */
  281.     virtual BOOL SetPlayVolume(
  282.       unsigned line,    /// Number of line
  283.       unsigned volume   /// Volume level from 0 to 100%
  284.     );
  285.  
  286.     /**Return line handle
  287.       */
  288.     int GetOSHandle(
  289.       unsigned line     /// Number of line
  290.     );
  291.  
  292.     /**Read a DTMF digit detected.
  293.        This may be characters from the set 0-9, A-D, * or #. A null ('\0')
  294.        character indicates that there are no tones in the queue.
  295.  
  296.       */
  297.     virtual char ReadDTMF(
  298.       unsigned line   /// Number of line
  299.     );
  300.  
  301.     /**Play a DTMF digit.
  302.        Any characters that are not in the set 0-9, A-D, * or # will be ignored.
  303.       */
  304.     virtual BOOL PlayDTMF(
  305.       unsigned line,            /// Number of line
  306.       const char * digits,      /// DTMF digits to be played
  307.       DWORD onTime = 90,        /// Number of milliseconds to play each DTMF digit
  308.       DWORD offTime = 30        /// Number of milliseconds between digits
  309.     );
  310.  
  311.  
  312.     /**See if a tone is detected.
  313.       */
  314.     virtual unsigned IsToneDetected(
  315.       unsigned line   /// Number of line
  316.     );
  317.  
  318.     virtual BOOL PlayTone(
  319.       unsigned line,          /// Number of line
  320.       CallProgressTones tone  /// Tone to be played
  321.     );
  322.  
  323.     virtual BOOL StopTone(
  324.       unsigned line   /// Number of line
  325.     );
  326.     
  327.     virtual BOOL PlayAudio(
  328.       unsigned line,            /// Number of line
  329.       const PString & filename  /// File Name
  330.     );
  331.     
  332.     virtual BOOL StopAudio(
  333.       unsigned line   ///Number of line
  334.     );
  335.  
  336.   protected:
  337.     unsigned cardNumber;
  338.     unsigned lineCount;
  339.  
  340.     enum { MaxLineCount = 8 };
  341.  
  342.     struct LineState {
  343.       BOOL Open(unsigned cardNumber, unsigned lineNumber);
  344.       BOOL SetLineOffHook(BOOL newState);
  345.       BOOL IsLineRinging(DWORD *);
  346.  
  347.       int        handle;
  348.       BOOL       currentHookState;
  349.       PINDEX     readFormat,    writeFormat;
  350.       PINDEX     readFrameSize, writeFrameSize;
  351.       BOOL       readIdle,      writeIdle;
  352.       PMutex     DTMFmutex;
  353.       BOOL       DTMFplaying;
  354.       ToneThread *myToneThread;
  355.     } lineState[MaxLineCount];
  356. };
  357.  
  358.  
  359. #endif // __OPAL_VPBLID_H
  360.  
  361.  
  362. /////////////////////////////////////////////////////////////////////////////
  363.