00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 #ifndef __OPAL_IXJLID_H
00286 #define __OPAL_IXJLID_H
00287
00288 #ifdef P_USE_PRAGMA
00289 #pragma interface
00290 #endif
00291
00292
00293 #include <opal/buildopts.h>
00294
00295 #ifdef HAS_IXJ
00296
00297 #include <lids/lid.h>
00298
00299 #ifdef P_LINUX
00300 #include <linux/telephony.h>
00301 #include <linux/ixjuser.h>
00302 #endif
00303 #ifdef P_FREEBSD
00304 #include <sys/telephony.h>
00305 #include <sys/ixjuser.h>
00306 #endif
00307
00308
00310
00313 class OpalIxJDevice : public OpalLineInterfaceDevice
00314 {
00315 PCLASSINFO(OpalIxJDevice, OpalLineInterfaceDevice);
00316
00317 enum { MaxIxjDevices = 10 };
00318
00319 public:
00322 OpalIxJDevice();
00323
00327 ~OpalIxJDevice() { Close(); }
00328
00331 virtual BOOL Open(
00332 const PString & device
00333 );
00334
00337 virtual BOOL Close();
00338
00342 virtual PString GetDeviceType() const;
00343
00346 virtual PString GetDeviceName() const;
00347
00350 virtual PStringArray GetAllNames() const;
00351
00354 virtual PString GetDescription() const;
00355
00356
00357 enum {
00358 POTSLine,
00359 PSTNLine,
00360 NumLines
00361 };
00362
00365 virtual unsigned GetLineCount();
00366
00367
00370 virtual BOOL IsLineTerminal(
00371 unsigned line
00372 ) { return line == POTSLine; }
00373
00374
00377 virtual BOOL IsLinePresent(
00378 unsigned line,
00379 BOOL force = FALSE
00380 );
00381
00382
00387 virtual BOOL IsLineOffHook(
00388 unsigned line
00389 );
00390
00394 virtual BOOL SetLineOffHook(
00395 unsigned line,
00396 BOOL newState = TRUE
00397 );
00398
00399
00402 virtual BOOL IsLineRinging(
00403 unsigned line,
00404 DWORD * cadence = NULL
00405 );
00406
00410 virtual BOOL RingLine(
00411 unsigned line,
00412 DWORD cadence
00413 );
00414
00429 virtual BOOL RingLine(
00430 unsigned line,
00431 PINDEX nCadence,
00432 unsigned * pattern
00433 );
00434
00435
00438 virtual BOOL IsLineDisconnected(
00439 unsigned line,
00440 BOOL checkForWink = TRUE
00441 );
00442
00443
00446 BOOL SetLineToLineDirect(
00447 unsigned line1,
00448 unsigned line2,
00449 BOOL connect
00450 );
00451
00454 BOOL IsLineToLineDirect(
00455 unsigned line1,
00456 unsigned line2
00457 );
00458
00459
00462 virtual OpalMediaFormatList GetMediaFormats() const;
00463
00466 virtual BOOL SetReadFormat(
00467 unsigned line,
00468 const OpalMediaFormat & mediaFormat
00469 );
00470
00473 virtual BOOL SetWriteFormat(
00474 unsigned line,
00475 const OpalMediaFormat & mediaFormat
00476 );
00477
00480 virtual OpalMediaFormat GetReadFormat(
00481 unsigned line
00482 );
00483
00486 virtual OpalMediaFormat GetWriteFormat(
00487 unsigned line
00488 );
00489
00500 virtual BOOL SetRawCodec(
00501 unsigned line
00502 );
00503
00506 virtual BOOL StopRawCodec(
00507 unsigned line
00508 );
00509
00512 virtual BOOL StopReadCodec(
00513 unsigned line
00514 );
00515
00518 virtual BOOL StopWriteCodec(
00519 unsigned line
00520 );
00521
00525 virtual PINDEX GetReadFrameSize(
00526 unsigned line
00527 );
00528
00529 virtual BOOL SetReadFrameSize(unsigned, PINDEX);
00530
00534 virtual PINDEX GetWriteFrameSize(
00535 unsigned line
00536 );
00537
00538 virtual BOOL SetWriteFrameSize(unsigned, PINDEX);
00539
00542 virtual BOOL ReadFrame(
00543 unsigned line,
00544 void * buf,
00545 PINDEX & count
00546 );
00547
00550 virtual BOOL WriteFrame(
00551 unsigned line,
00552 const void * buf,
00553 PINDEX count,
00554 PINDEX & written
00555 );
00556
00559 virtual unsigned GetAverageSignalLevel(
00560 unsigned line,
00561 BOOL playback
00562 );
00563
00564
00567 virtual BOOL EnableAudio(
00568 unsigned line,
00569 BOOL enable = TRUE
00570 );
00571
00574 virtual BOOL IsAudioEnabled(
00575 unsigned line
00576 );
00577
00578
00583 virtual BOOL SetRecordVolume(
00584 unsigned line,
00585 unsigned volume
00586 );
00587
00592 virtual BOOL SetPlayVolume(
00593 unsigned line,
00594 unsigned volume
00595 );
00596
00601 virtual BOOL GetRecordVolume(
00602 unsigned line,
00603 unsigned & volume
00604 );
00605
00610 virtual BOOL GetPlayVolume(
00611 unsigned line,
00612 unsigned & volume
00613 );
00614
00617 AECLevels GetAEC(
00618 unsigned line
00619 );
00620
00623 BOOL SetAEC(
00624 unsigned line,
00625 AECLevels level
00626 );
00627
00631 unsigned GetWinkDuration(
00632 unsigned line
00633 );
00634
00638 BOOL SetWinkDuration(
00639 unsigned line,
00640 unsigned winkDuration
00641 );
00642
00646 virtual BOOL GetVAD(
00647 unsigned line
00648 );
00649
00653 virtual BOOL SetVAD(
00654 unsigned line,
00655 BOOL enable
00656 );
00657
00658
00666 virtual BOOL GetCallerID(
00667 unsigned line,
00668 PString & idString,
00669 BOOL full = FALSE
00670 );
00671
00680 virtual BOOL SetCallerID(
00681 unsigned line,
00682 const PString & idString
00683 );
00684
00687 virtual BOOL SendCallerIDOnCallWaiting(
00688 unsigned line,
00689 const PString & idString
00690 );
00691
00694 virtual BOOL SendVisualMessageWaitingIndicator(
00695 unsigned line,
00696 BOOL on
00697 );
00698
00699
00700
00704 virtual BOOL PlayDTMF(
00705 unsigned line,
00706 const char * digits,
00707 DWORD onTime = DefaultDTMFOnTime,
00708 DWORD offTime = DefaultDTMFOffTime
00709 );
00710
00716 virtual char ReadDTMF(
00717 unsigned line
00718 );
00719
00724 virtual BOOL GetRemoveDTMF(
00725 unsigned line
00726 );
00727
00732 virtual BOOL SetRemoveDTMF(
00733 unsigned line,
00734 BOOL removeTones
00735 );
00736
00737
00740 virtual unsigned IsToneDetected(
00741 unsigned line
00742 );
00743
00749 virtual BOOL SetToneFilterParameters(
00750 unsigned line,
00751 CallProgressTones tone,
00752 unsigned lowFrequency,
00753 unsigned highFrequency,
00754 PINDEX numCadences,
00755 const unsigned * onTimes,
00756 const unsigned * offTimes
00757 );
00758
00761 virtual BOOL PlayTone(
00762 unsigned line,
00763 CallProgressTones tone
00764 );
00765
00768 virtual BOOL IsTonePlaying(
00769 unsigned line
00770 );
00771
00774 virtual BOOL StopTone(
00775 unsigned line
00776 );
00777
00780 virtual BOOL HasHookFlash(unsigned line);
00781
00787 virtual BOOL SetCountryCode(
00788 T35CountryCodes country
00789 );
00790
00791
00794 virtual DWORD GetSerialNumber();
00795
00796 enum CardTypes {
00797 PhoneJACK = 1,
00798 LineJACK = 3,
00799 PhoneJACK_Lite,
00800 PhoneJACK_PCI,
00801 PhoneCARD,
00802 PhoneJACK_PCI_TJ
00803 };
00804
00807 DWORD GetCardType() const { return dwCardType; }
00808
00809
00812 static PStringArray GetDeviceNames();
00813
00814
00815 protected:
00816
00817 PINDEX LogScaleVolume(unsigned line, PINDEX volume, BOOL isPlay);
00818
00819 PString deviceName;
00820 DWORD dwCardType;
00821 PMutex readMutex, writeMutex;
00822 BOOL readStopped, writeStopped;
00823 PINDEX readFrameSize, writeFrameSize;
00824 PINDEX readCodecType, writeCodecType;
00825 BOOL lastHookState, currentHookState;
00826 PTimer hookTimeout;
00827 BOOL inRawMode;
00828 unsigned enabledAudioLine;
00829 BOOL exclusiveAudioMode;
00830
00831 #if defined(WIN32)
00832 BOOL InternalSetVolume(BOOL record, unsigned id, int volume, int mute);
00833 BOOL InternalPlayTone(unsigned line,
00834 DWORD toneIndex,
00835 DWORD onTime, DWORD offTime,
00836 BOOL synchronous);
00837 BOOL IoControl(DWORD dwIoControlCode,
00838 DWORD inParam = 0,
00839 DWORD * outParam = NULL);
00840 BOOL IoControl(DWORD dwIoControlCode,
00841 LPVOID lpInBuffer,
00842 DWORD nInBufferSize,
00843 LPVOID lpOutBuffer,
00844 DWORD nOutBufferSize,
00845 LPDWORD lpdwBytesReturned,
00846 PWin32Overlapped * overlap = NULL);
00847
00848 HANDLE hDriver;
00849 DWORD driverVersion;
00850 PTimer ringTimeout;
00851 DWORD lastDTMFDigit;
00852 DWORD lastFlashState;
00853 PTimeInterval toneSendCompletionTime;
00854 BOOL vadEnabled;
00855 HANDLE hReadEvent, hWriteEvent;
00856
00857 #elif defined(HAS_IXJ)
00858
00859 public:
00860 class ExceptionInfo {
00861 public:
00862 int fd;
00863
00864 BOOL hasRing;
00865 BOOL hookState;
00866 BOOL hasWink;
00867 BOOL hasFlash;
00868 char dtmf[16];
00869 int dtmfIn;
00870 int dtmfOut;
00871 #ifdef IXJCTL_VMWI
00872 BOOL hasCid;
00873 PHONE_CID cid;
00874 #endif
00875 BOOL filter[4];
00876 BOOL cadence[4];
00877 telephony_exception data;
00878 timeval lastHookChange;
00879 };
00880
00881 static void SignalHandler(int sig);
00882 ExceptionInfo * GetException();
00883 int GetOSHandle() { return os_handle; }
00884
00885 protected:
00886 BOOL ConvertOSError(int err);
00887
00888 static ExceptionInfo exceptionInfo[MaxIxjDevices];
00889 static PMutex exceptionMutex;
00890 static BOOL exceptionInit;
00891
00892 AECLevels aecLevel;
00893 BOOL removeDTMF;
00894 PMutex toneMutex;
00895 BOOL tonePlaying;
00896 PTimer lastRingTime;
00897 BOOL pstnIsOffHook;
00898 BOOL gotWink;
00899 int userPlayVol, userRecVol;
00900
00901 int savedPlayVol, savedRecVol;
00902 AECLevels savedAEC;
00903
00904 #ifdef IXJCTL_VMWI
00905 PHONE_CID callerIdInfo;
00906 #endif
00907
00908 #endif
00909 };
00910
00911
00912 #define OPAL_IXJ_TYPE_NAME "Quicknet"
00913 #define OPAL_REGISTER_IXJ() OPAL_REGISTER_LID(OpalIxJDevice, OPAL_IXJ_TYPE_NAME)
00914
00915 #else // HAS_IXJ
00916
00917 #define OPAL_REGISTER_IXJ()
00918
00919 #endif // HAS_IXJ
00920
00921 #endif // __OPAL_IXJLID_H
00922
00923