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 / vblasterlid.h < prev    next >
C/C++ Source or Header  |  2002-09-15  |  18KB  |  628 lines

  1. /*
  2.  * vblasterlid.h
  3.  *
  4.  * Creative Labs VOIP Blaster codec interface
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 2001 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Open H323 Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Contributor(s): ______________________________________.
  25.  *
  26.  * $Log: vblasterlid.h,v $
  27.  * Revision 1.5  2002/09/16 01:14:15  robertj
  28.  * Added #define so can select if #pragma interface/implementation is used on
  29.  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
  30.  *
  31.  * Revision 1.4  2002/09/03 06:19:37  robertj
  32.  * Normalised the multi-include header prevention ifdef/define symbol.
  33.  *
  34.  * Revision 1.3  2002/08/05 10:03:47  robertj
  35.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  36.  *
  37.  * Revision 1.2  2002/01/15 07:23:24  craigs
  38.  * Added IsDevicePresent command
  39.  *
  40.  * Revision 1.1  2002/01/15 04:16:32  craigs
  41.  * Initial version
  42.  *
  43.  *
  44.  */
  45.  
  46. #ifndef __OPAL_VBLASTERLID_H
  47. #define __OPAL_VBLASTERLID_H
  48.  
  49. #ifdef P_USE_PRAGMA
  50. #pragma interface
  51. #endif
  52.  
  53.  
  54. #define HAS_VBLASTER
  55.  
  56. #include "lid.h"
  57. #include "h323caps.h"
  58.  
  59. #include <ptclib/delaychan.h>
  60.  
  61.  
  62.  
  63. ///////////////////////////////////////////////////////////////////////////////
  64.  
  65. class VoipBlasterInterface : public PObject
  66. {
  67.   PCLASSINFO(VoipBlasterInterface, PObject)
  68.   public:
  69.     enum Command {
  70.       Command_PHONE_OFF  = 0x01, // drop loop current
  71.       Command_PHONE_ON   = 0x02, // used on startup
  72.       Command_RING_ON    = 0x03, // start ringing
  73.       Command_RING_OFF   = 0x04, // used on startup & to stop ringing
  74.       Command_VOUT_START = 0x05, // start audio output
  75.       Command_VOUT_STOP  = 0x06, // stop audio output
  76.       Command_VINP_START = 0x07, // start audio input
  77.       Command_VINP_STOP  = 0x08, // stop audio input
  78.       Command_UNKNOWN_1  = 0x09, // Unknown (TESTSTART)
  79.       Command_UNKNOWN_2  = 0x0a, // Unknown (TESTSTOP)
  80.       Command_UNKNOWN_3  = 0x0b, // Unknown (SENDFAXTONE)
  81.       Command_0x0c       = 0x0c, // Go offhook for headset
  82.       Command_0x0d       = 0x0d, // Go onhook for headset
  83.       Command_SETUP_MODE = 0x0e, // Unknown(goto setup mode)
  84.       Command_VOUT_DONE  = 0x0f, // voice in/out off, report output drained
  85.       Command_0x10       = 0x10, // Unknown (used in file output, seems ok without)
  86.       Command_0x11       = 0x11, // Unknown (used in file output, seems ok without)
  87.       Command_MUTE_ON    = 0x12, // Audio mute on
  88.       Command_MUTE_OFF   = 0x13, // Audio mute off
  89.       Command_VOL_0      = 0x34, // Set volume (min)
  90.       Command_VOL_1      = 0x35, // Set volume
  91.       Command_VOL_2      = 0x36, // Set volume
  92.       Command_VOL_3      = 0x37, // Set volume (default)
  93.       Command_VOL_4      = 0x38, // Set volume
  94.       Command_VOL_5      = 0x39, // Set volume
  95.       Command_VOL_6      = 0x3a, // Set volume (max)
  96.     };
  97.  
  98.     enum Status {
  99.       Status_NONE        = 0x00, // No status
  100.       Status_HOOK_OFF    = 0x01, // Offhook
  101.       Status_HOOK_ON     = 0x02, // Onhook
  102.       //Status_DEBUG       = 0x03, // Not used (DEBUG)
  103.       //Status_RINGDETECT  = 0x04, // Not used (RINGDETECT)
  104.       Status_RINGING_ON  = 0x05, // Ring started 
  105.       Status_RINGING_OFF = 0x06, // Ring stopped
  106.       Status_HEADSET_IN  = 0x08, // Headset plugged in
  107.       Status_HEADSET_OUT = 0x09, // Headset unplugged
  108.       Status_0x0a        = 0x0a, // Unknown (setup accepted?)
  109.       Status_VOUT_DONE   = 0x0c, // Voice output done
  110.       Status_Empty
  111.     };
  112.  
  113.     VoipBlasterInterface();
  114.  
  115.     BOOL IsDevicePresent(PINDEX deviceIndex);
  116.  
  117.     BOOL OpenCommand(PINDEX deviceIndex);
  118.     BOOL WriteCommand(Command cmd);
  119.     Status ReadStatus();
  120.     BOOL CloseCommand();
  121.  
  122.     BOOL OpenData();
  123.     BOOL WriteData(const void * data, PINDEX len);
  124.     int  ReadData (void * data,       PINDEX len);
  125.     void FlushData(PTimeInterval wait = 100);
  126.     BOOL CloseData();
  127.  
  128.     PDECLARE_NOTIFIER(PTimer, VoipBlasterInterface, CloseTimeout);
  129.  
  130.   protected:
  131.     PINDEX deviceIndex;
  132.  
  133. // Linux specific defines are included here
  134. #ifdef P_LINUX
  135. #endif
  136.  
  137. // Windows specific defines are included here
  138. #ifdef _WIN32
  139.     enum Pipe {
  140.       VoiceOutPipe = 0,
  141.       VoiceInPipe  = 1,
  142.       CommandPipe  = 2,
  143.       StatusPipe   = 3,
  144.       NumPipes
  145.     };
  146.  
  147.     enum ReadBufferIndex {
  148.       VoiceReadBuffer  = 0,
  149.       StatusReadBuffer = 1,
  150.       NumReadBuffers
  151.     };
  152.  
  153.   protected:
  154.     int WritePipe(HANDLE fd, const void *bp, DWORD len);
  155.     int ReadPipe (HANDLE fd, void *bp,       DWORD len);
  156.     BOOL OpenVOIPPipe(Pipe pipeIndex);
  157.  
  158.     HANDLE pipes[4];
  159. #endif
  160. };
  161.  
  162. ///////////////////////////////////////////////////////////////////////////////
  163.  
  164. /**This class describes the VoIPBlaster line interface device.
  165.  */
  166. class OpalVoipBlasterDevice : public OpalLineInterfaceDevice
  167. {
  168.   PCLASSINFO(OpalVoipBlasterDevice, OpalLineInterfaceDevice);
  169.  
  170.   public:
  171.  
  172.     enum { DTMFQueueSize = 10 };
  173.  
  174.     class ByteQueue : public PObject {
  175.       PCLASSINFO(ByteQueue, PObject);
  176.       public:
  177.         ByteQueue(PINDEX size);
  178.         int Dequeue();
  179.         BOOL Enqueue(BYTE ch);
  180.  
  181.       protected:
  182.         PBYTEArray queue;
  183.         PINDEX qLen, qOut, qMax;
  184.         PMutex mutex;
  185.     };
  186.  
  187.     /**Create a new, closed, device for a VoipBlaster device.
  188.       */
  189.     OpalVoipBlasterDevice();
  190.  
  191.     /**Destroy line interface device.
  192.        This calls Close() on the device.
  193.       */
  194.     ~OpalVoipBlasterDevice();
  195.  
  196.     /**Open the VoIPBlaster device.
  197.       */
  198.     virtual BOOL Open(
  199.       const PString & device  /// Device identifier name.
  200.     );
  201.  
  202.     /**Close the VoIPBlaster device.
  203.       */
  204.     virtual BOOL Close();
  205.  
  206.     /**Get the device name.
  207.       */
  208.     virtual PString GetName() const;
  209.  
  210.     /**Get the total number of lines supported by this device.
  211.       */
  212.     virtual unsigned GetLineCount()
  213.       { return 1; }
  214.  
  215.     /**Get the type of the line.
  216.       */
  217.     virtual BOOL IsLineTerminal(
  218.       unsigned /*line*/   /// Number of line
  219.     ) { return TRUE; }
  220.  
  221.  
  222.     /**Determine if a physical line is present on the logical line.
  223.       */
  224.     virtual BOOL IsLinePresent(
  225.       unsigned /*line*/,      /// Number of line
  226.       BOOL /*force*/ = FALSE  /// Force test, do not optimise
  227.     )
  228.       { return FALSE; }
  229.  
  230.  
  231.     /**Determine if line is currently off hook.
  232.        This returns TRUE if GetLineState() is a state that implies the line is
  233.        off hook (eg OffHook or LineBusy).
  234.       */
  235.     virtual BOOL IsLineOffHook(
  236.       unsigned line   /// Number of line
  237.     );
  238.  
  239.     /**Set the state of the line.
  240.        Note that not be possible on a given line.
  241.       */
  242.     virtual BOOL SetLineOffHook(
  243.       unsigned line,        /// Number of line
  244.       BOOL newState = TRUE  /// New state to set
  245.     );
  246.  
  247.  
  248.     /**Determine if line is ringing.
  249.       */
  250.     virtual BOOL IsLineRinging(
  251.       unsigned line,          /// Number of line
  252.       DWORD * cadence = NULL  /// Cadence of incoming ring
  253.     );
  254.  
  255.     /**Begin ringing local phone set with specified cadence.
  256.        If cadence is zero then stops ringing.
  257.       */
  258.     virtual BOOL RingLine(
  259.       unsigned line,    /// Number of line
  260.       DWORD cadence     /// Cadence bit map for ring pattern
  261.     );
  262.  
  263.  
  264.     /**Determine if line has been disconnected from a call.
  265.       */
  266.     virtual BOOL IsLineDisconnected(
  267.       unsigned line,   /// Number of line
  268.       BOOL checkForWink = TRUE
  269.     );
  270.  
  271.  
  272.     /**Directly connect the two lines.
  273.       */
  274.     BOOL SetLineToLineDirect(
  275.       unsigned line1,   /// Number of first line
  276.       unsigned line2,   /// Number of second line
  277.       BOOL connect      /// Flag for connect/disconnect
  278.     );
  279.  
  280.     /**Determine if the two lines are directly connected.
  281.       */
  282.     BOOL IsLineToLineDirect(
  283.       unsigned line1,   /// Number of first line
  284.       unsigned line2    /// Number of second line
  285.     );
  286.  
  287.  
  288.     /**Get the media formats this device is capable of using.
  289.       */
  290.     virtual OpalMediaFormat::List GetMediaFormats() const;
  291.  
  292.     /**Set the VoIPBlaster codec for reading.
  293.       */
  294.     virtual BOOL SetReadFormat(
  295.       unsigned line,    /// Number of line
  296.       const OpalMediaFormat & mediaFormat   /// Codec type
  297.     );
  298.  
  299.     /**Set the VoIPBlaster codec for writing.
  300.       */
  301.     virtual BOOL SetWriteFormat(
  302.       unsigned line,    /// Number of line
  303.       const OpalMediaFormat & mediaFormat   /// Codec type
  304.     );
  305.  
  306.     /**Get the media format (codec) for reading on the specified line.
  307.       */
  308.     virtual OpalMediaFormat GetReadFormat(
  309.       unsigned line    /// Number of line
  310.     );
  311.  
  312.     /**Get the media format (codec) for writing on the specified line.
  313.       */
  314.     virtual OpalMediaFormat GetWriteFormat(
  315.       unsigned line    /// Number of line
  316.     );
  317.  
  318.     /**Set the line codec for reading/writing raw PCM data.
  319.        A descendent may use this to do anything special to the device before
  320.        beginning special PCM output. For example disabling AEC and set
  321.        volume levels to standard values. This can then be used for generating
  322.        standard tones using PCM if the driver is not capable of generating or
  323.        detecting them directly.
  324.  
  325.        The default behaviour simply does a SetReadCodec and SetWriteCodec for
  326.        PCM data.
  327.       */
  328.     virtual BOOL SetRawCodec(
  329.       unsigned line    /// Number of line
  330.     );
  331.  
  332.     /**Stop the raw PCM mode codec.
  333.       */
  334.     virtual BOOL StopRawCodec(
  335.       unsigned line   /// Number of line
  336.     );
  337.  
  338.     /**Stop the read codec.
  339.       */
  340.     virtual BOOL StopReadCodec(
  341.       unsigned line   /// Number of line
  342.     );
  343.  
  344.     /**Stop the write codec.
  345.       */
  346.     virtual BOOL StopWriteCodec(
  347.       unsigned line   /// Number of line
  348.     );
  349.  
  350.     /**Get the read frame size in bytes.
  351.        All calls to ReadFrame() will return this number of bytes.
  352.       */
  353.     virtual PINDEX GetReadFrameSize(
  354.       unsigned line   /// Number of line
  355.     );
  356.  
  357.     virtual BOOL SetReadFrameSize(unsigned, PINDEX);
  358.  
  359.     /**Get the write frame size in bytes.
  360.        All calls to WriteFrame() must be this number of bytes.
  361.       */
  362.     virtual PINDEX GetWriteFrameSize(
  363.       unsigned line   /// Number of line
  364.     );
  365.  
  366.     virtual BOOL SetWriteFrameSize(unsigned, PINDEX);
  367.  
  368.     /**Low level read of a frame from the device.
  369.      */
  370.     virtual BOOL ReadFrame(
  371.       unsigned line,    /// Number of line
  372.       void * buf,       /// Pointer to a block of memory to receive data.
  373.       PINDEX & count    /// Number of bytes read, <= GetReadFrameSize()
  374.     );
  375.  
  376.     /**Low level write frame to the device.
  377.      */
  378.     virtual BOOL WriteFrame(
  379.       unsigned line,    /// Number of line
  380.       const void * buf, /// Pointer to a block of memory to write.
  381.       PINDEX count,     /// Number of bytes to write, <= GetWriteFrameSize()
  382.       PINDEX & written  /// Number of bytes written, <= GetWriteFrameSize()
  383.     );
  384.  
  385.     /**Get average signal level in last frame.
  386.       */
  387.     virtual unsigned GetAverageSignalLevel(
  388.       unsigned line,  /// Number of line
  389.       BOOL playback   /// Get average playback or record level.
  390.     );
  391.  
  392.  
  393.     /**Enable audio for the line.
  394.       */
  395.     virtual BOOL EnableAudio(
  396.       unsigned line,      /// Number of line
  397.       BOOL enable = TRUE
  398.     );
  399.  
  400.  
  401.     /**Set volume level for recording.
  402.        A value of 100 is the maximum volume possible for the hardware.
  403.        A value of 0 is the minimum volume possible for the hardware.
  404.       */
  405.     virtual BOOL SetRecordVolume(
  406.       unsigned line,    /// Number of line
  407.       unsigned volume   /// Volume level from 0 to 100%
  408.     );
  409.  
  410.     /**Set volume level for playing.
  411.        A value of 100 is the maximum volume possible for the hardware.
  412.        A value of 0 is the minimum volume possible for the hardware.
  413.       */
  414.     virtual BOOL SetPlayVolume(
  415.       unsigned line,    /// Number of line
  416.       unsigned volume   /// Volume level from 0 to 100%
  417.     );
  418.  
  419.     /**Get volume level for recording.
  420.        A value of 100 is the maximum volume possible for the hardware.
  421.        A value of 0 is the minimum volume possible for the hardware.
  422.       */
  423.     virtual BOOL GetRecordVolume(
  424.       unsigned line,      /// Number of line
  425.       unsigned & volume   /// Volume level from 0 to 100%
  426.     );
  427.  
  428.     /**Set volume level for playing.
  429.        A value of 100 is the maximum volume possible for the hardware.
  430.        A value of 0 is the minimum volume possible for the hardware.
  431.       */
  432.     virtual BOOL GetPlayVolume(
  433.       unsigned line,      /// Number of line
  434.       unsigned & volume   /// Volume level from 0 to 100%
  435.     );
  436.  
  437.  
  438.     /**Set acoustic echo cancellation.
  439.       */
  440.     AECLevels GetAEC(
  441.       unsigned line    /// Number of line
  442.     );
  443.  
  444.     /**Set acoustic echo cancellation.
  445.       */
  446.     BOOL SetAEC(
  447.       unsigned line,    /// Number of line
  448.       AECLevels level  /// AEC level
  449.     );
  450.  
  451.  
  452.     /**Get voice activity detection.
  453.        Note, not all devices, or selected codecs, may support this function.
  454.       */
  455.     virtual BOOL GetVAD(
  456.       unsigned line    /// Number of line
  457.     );
  458.  
  459.     /**Set voice activity detection.
  460.        Note, not all devices, or selected codecs, may support this function.
  461.       */
  462.     virtual BOOL SetVAD(
  463.       unsigned line,    /// Number of line
  464.       BOOL enable       /// Flag for enabling VAD
  465.     );
  466.  
  467.  
  468.     /**Get Caller ID from the last incoming ring.
  469.        The idString parameter is either simply the "number" field of the caller
  470.        ID data, or if full is TRUE, all of the fields in the caller ID data.
  471.  
  472.        The full data of the caller ID string consists of the number field, the
  473.        time/date and the name field separated by tabs ('\t').
  474.       */
  475.     virtual BOOL GetCallerID(
  476.       unsigned line,      /// Number of line
  477.       PString & idString, /// ID string returned
  478.       BOOL full = FALSE   /// Get full information in idString
  479.     );
  480.  
  481.     /**Set Caller ID for use in next RingLine() call.
  482.        The full data of the caller ID string consists of the number field, the
  483.        time/date and the name field separated by tabs ('\t').
  484.  
  485.        If the date field is missing (two consecutive tabs) then the current
  486.        time and date is used. Using an empty string will clear the caller ID
  487.        so that no caller ID is sent on the next RingLine() call.
  488.       */
  489.     virtual BOOL SetCallerID(
  490.       unsigned line,            /// Number of line
  491.       const PString & idString  /// ID string to use
  492.     );
  493.  
  494.     /**Send Caller ID during call
  495.      */
  496.     virtual BOOL SendCallerIDOnCallWaiting(
  497.       unsigned line,            /// Number of line
  498.       const PString & idString  /// ID string to use
  499.     );
  500.  
  501.     /**Send a Visual Message Waiting Indicator
  502.       */
  503.     virtual BOOL SendVisualMessageWaitingIndicator(
  504.       unsigned line,            /// Number of line
  505.       BOOL on
  506.     );
  507.  
  508.  
  509.  
  510.     /**Play a DTMF digit.
  511.        Any characters that are not in the set 0-9, A-D, * or # will be ignored.
  512.       */
  513.     virtual BOOL PlayDTMF(
  514.       unsigned line,            /// Number of line
  515.       const char * digits,      /// DTMF digits to be played
  516.       DWORD onTime = DefaultDTMFOnTime,  /// Number of milliseconds to play each DTMF digit
  517.       DWORD offTime = DefaultDTMFOffTime /// Number of milliseconds between digits
  518.     );
  519.  
  520.     /**Read a DTMF digit detected.
  521.        This may be characters from the set 0-9, A-D, * or #. A null ('\0')
  522.        character indicates that there are no tones in the queue.
  523.  
  524.       */
  525.     virtual char ReadDTMF(
  526.       unsigned line   /// Number of line
  527.     );
  528.  
  529.     /**Get DTMF removal mode.
  530.        When set in this mode the DTMF tones detected are removed from the
  531.        encoded data stream as returned by ReadFrame().
  532.       */
  533.     virtual BOOL GetRemoveDTMF(
  534.       unsigned line            /// Number of line
  535.     );
  536.  
  537.     /**Set DTMF removal mode.
  538.        When set in this mode the DTMF tones detected are removed from the
  539.        encoded data stream as returned by ReadFrame().
  540.       */
  541.     virtual BOOL SetRemoveDTMF(
  542.       unsigned line,            /// Number of line
  543.       BOOL removeTones   /// Flag for removing DTMF tones.
  544.     );
  545.  
  546.  
  547.     /**See if a tone is detected.
  548.       */
  549.     virtual unsigned IsToneDetected(
  550.       unsigned line   /// Number of line
  551.     );
  552.  
  553.     /**Play a tone.
  554.       */
  555.     virtual BOOL PlayTone(
  556.       unsigned line,          /// Number of line
  557.       CallProgressTones tone  /// Tone to be played
  558.     );
  559.  
  560.     /**Determine if a tone is still playing
  561.       */
  562.     virtual BOOL IsTonePlaying(
  563.       unsigned line   /// Number of line
  564.     );
  565.  
  566.     /**Stop playing a tone.
  567.       */
  568.     virtual BOOL StopTone(
  569.       unsigned line   /// Number of line
  570.     );
  571.  
  572.    /**Return TRUE if a hook flash has been detected
  573.       */
  574.     virtual BOOL HasHookFlash(unsigned line);
  575.  
  576.     /**Set the country code set for the device.
  577.        This may change the line analogue coefficients, ring detect, call
  578.        disconnect detect and call progress tones to fit the countries
  579.        telephone network.
  580.       */
  581.     virtual BOOL SetCountryCode(
  582.       T35CountryCodes country   /// COuntry code for device
  583.     );
  584.  
  585.  
  586.     /**Get the serial number for the VoIPBlaster card.
  587.       */
  588.     virtual DWORD GetSerialNumber();
  589.  
  590.     /**Get all the VoIPBlaster devices.
  591.       */
  592.     static PStringArray GetDeviceNames();
  593.  
  594.     /**
  595.       * entry point for status handler thread
  596.       */
  597.     PDECLARE_NOTIFIER(PThread, OpalVoipBlasterDevice, StatusHandler);
  598.  
  599.   protected:
  600.     PThread * statusThread;
  601.     BOOL statusRunning;
  602.     BOOL hookState;
  603.     BOOL headset;
  604.     BOOL ringOn;
  605.     BOOL firstTime;
  606.  
  607.     ByteQueue dtmfQueue;
  608.  
  609.     PAdaptiveDelay writeDelay;
  610.     PAdaptiveDelay readDelay;
  611.  
  612.     PString   deviceName;
  613.     PMutex    readMutex, writeMutex;
  614.     BOOL      readStopped, writeStopped;
  615.     PINDEX    readFrameSize, writeFrameSize;
  616.     PINDEX    readCodecType, writeCodecType;
  617.     BOOL      lastHookStatus;
  618.  
  619.     PMutex               vbMutex;
  620.     VoipBlasterInterface vBlaster;
  621. };
  622.  
  623.  
  624. #endif // __OPAL_VBLASTERLID_H
  625.  
  626.  
  627. /////////////////////////////////////////////////////////////////////////////
  628.