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 #ifndef OPAL_LIDS_LIDEP_H
00035 #define OPAL_LIDS_LIDEP_H
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041 #include <opal/buildopts.h>
00042
00043 #include <opal/endpoint.h>
00044 #include <lids/lid.h>
00045 #include <codec/silencedetect.h>
00046
00047
00048 class OpalLineConnection;
00049
00050
00055 class OpalLineEndPoint : public OpalEndPoint
00056 {
00057 PCLASSINFO(OpalLineEndPoint, OpalEndPoint);
00058
00059 public:
00064 OpalLineEndPoint(
00065 OpalManager & manager
00066 );
00067
00069 ~OpalLineEndPoint();
00071
00103 virtual PSafePtr<OpalConnection> MakeConnection(
00104 OpalCall & call,
00105 const PString & party,
00106 void * userData = NULL,
00107 unsigned int options = 0,
00108 OpalConnection::StringOptions * stringOptions = NULL
00109 );
00110
00120 virtual OpalMediaFormatList GetMediaFormats() const;
00122
00125 virtual OpalLineConnection * CreateConnection(
00126 OpalCall & call,
00127 OpalLine & line,
00128 void * userData,
00129 const PString & number
00130 );
00132
00139 PSafePtr<OpalLineConnection> GetLIDConnectionWithLock(
00140 const PString & token,
00141 PSafetyMode mode = PSafeReadWrite
00142 ) { return PSafePtrCast<OpalConnection, OpalLineConnection>(GetConnectionWithLock(token, mode)); }
00143
00151 PBoolean AddLine(
00152 OpalLine * line
00153 );
00154
00158 void RemoveLine(
00159 OpalLine * line
00160 );
00161
00162
00167 const PList<OpalLine> & GetLines() const { return lines;};
00168
00172 void RemoveLine(
00173 const PString & token
00174 );
00175
00180 void RemoveAllLines();
00181
00191 virtual PBoolean AddLinesFromDevice(
00192 OpalLineInterfaceDevice & device
00193 );
00194
00198 void RemoveLinesFromDevice(
00199 OpalLineInterfaceDevice & device
00200 );
00201
00207 PBoolean AddDeviceNames(
00208 const PStringArray & descriptors
00209 );
00210
00220 PBoolean AddDeviceName(
00221 const PString & descriptor
00222 );
00223
00226 const OpalLineInterfaceDevice * GetDeviceByName(
00227 const PString & descriptor
00228 );
00229
00241 virtual PBoolean AddDevice(
00242 OpalLineInterfaceDevice * device
00243 );
00244
00248 void RemoveDevice(
00249 OpalLineInterfaceDevice * device
00250 );
00251
00254 void RemoveDevices() { RemoveAllLines(); }
00255
00263 OpalLine * GetLine(
00264 const PString & lineName,
00265 bool enableAudio = false,
00266 bool terminating = true
00267 );
00268
00272 void SetDefaultLine(
00273 const PString & lineName
00274 );
00276
00277
00278 protected:
00279 PDECLARE_NOTIFIER(PThread, OpalLineEndPoint, MonitorLines);
00280 virtual void MonitorLine(OpalLine & line);
00281
00282 OpalLIDList devices;
00283 OpalLineList lines;
00284 PString defaultLine;
00285 PMutex linesMutex;
00286 PThread * monitorThread;
00287 PSyncPoint exitFlag;
00288 };
00289
00290
00293 class OpalLineConnection : public OpalConnection
00294 {
00295 PCLASSINFO(OpalLineConnection, OpalConnection);
00296
00297 public:
00302 OpalLineConnection(
00303 OpalCall & call,
00304 OpalLineEndPoint & endpoint,
00305 OpalLine & line,
00306 const PString & number
00307 );
00309
00314 virtual PString GetPrefixName() const;
00315
00324 virtual bool IsNetworkConnection() const { return !line.IsTerminal(); }
00325
00332 virtual PBoolean SetUpConnection();
00333
00344 virtual PBoolean SetAlerting(
00345 const PString & calleeName,
00346 PBoolean withMedia
00347 );
00348
00353 virtual PBoolean SetConnected();
00354
00373 virtual void OnReleased();
00374
00381 virtual PString GetDestinationAddress();
00382
00389 virtual OpalMediaFormatList GetMediaFormats() const;
00390
00405 virtual OpalMediaStream * CreateMediaStream(
00406 const OpalMediaFormat & mediaFormat,
00407 unsigned sessionID,
00408 PBoolean isSource
00409 );
00410
00423 virtual PBoolean OnOpenMediaStream(
00424 OpalMediaStream & stream
00425 );
00426
00429 virtual PBoolean SetAudioVolume(
00430 PBoolean source,
00431 unsigned percentage
00432 );
00433
00437 virtual unsigned GetAudioSignalLevel(
00438 PBoolean source
00439 );
00440
00448 virtual PBoolean SendUserInputString(
00449 const PString & value
00450 );
00451
00458 virtual PBoolean SendUserInputTone(
00459 char tone,
00460 int duration
00461 );
00462
00469 virtual PBoolean PromptUserInput(
00470 PBoolean play
00471 );
00473
00478 void StartIncoming();
00479
00482 virtual void Monitor();
00484
00485
00490 OpalLine & GetLine() { return line; }
00491
00495 OpalLineInterfaceDevice::CallProgressTones GetPromptTone() const { return m_promptTone; }
00496
00499 void SetPromptTone(OpalLineInterfaceDevice::CallProgressTones tone) { m_promptTone = tone; }
00500
00504 void setDialDelay(unsigned int uiDialDelay) { m_dialParams.m_dialStartDelay = uiDialDelay;}
00505
00509 unsigned int getDialDelay() const { return m_dialParams.m_dialStartDelay; }
00511
00512 protected:
00513 OpalLineEndPoint & endpoint;
00514 OpalLine & line;
00515 bool wasOffHook;
00516 unsigned minimumRingCount;
00517 OpalLineInterfaceDevice::DialParams m_dialParams;
00518 OpalLineInterfaceDevice::CallProgressTones m_promptTone;
00519
00520 PDECLARE_NOTIFIER(PThread, OpalLineConnection, HandleIncoming);
00521 PThread * handlerThread;
00522 };
00523
00524
00528 class OpalLineMediaStream : public OpalMediaStream
00529 {
00530 PCLASSINFO(OpalLineMediaStream, OpalMediaStream);
00531 public:
00536 OpalLineMediaStream(
00537 OpalLineConnection & conn,
00538 const OpalMediaFormat & mediaFormat,
00539 unsigned sessionID,
00540 PBoolean isSource,
00541 OpalLine & line
00542 );
00544
00545 ~OpalLineMediaStream();
00546
00547
00555 virtual PBoolean Open();
00556
00561 virtual PBoolean Close();
00562
00568 virtual PBoolean ReadPacket(
00569 RTP_DataFrame & packet
00570 );
00571
00577 virtual PBoolean WritePacket(
00578 RTP_DataFrame & packet
00579 );
00580
00584 virtual PBoolean ReadData(
00585 BYTE * data,
00586 PINDEX size,
00587 PINDEX & length
00588 );
00589
00593 virtual PBoolean WriteData(
00594 const BYTE * data,
00595 PINDEX length,
00596 PINDEX & written
00597 );
00598
00604 virtual PBoolean SetDataSize(
00605 PINDEX dataSize,
00606 PINDEX frameTime
00607 );
00608
00612 virtual PBoolean IsSynchronous() const;
00613
00624 virtual PBoolean RequiresPatchThread(
00625 OpalMediaStream * stream
00626 ) const;
00628
00633 OpalLine & GetLine() { return line; }
00635
00636 protected:
00637 OpalLine & line;
00638 bool notUsingRTP;
00639 bool useDeblocking;
00640 unsigned missedCount;
00641 BYTE lastSID[4];
00642 bool lastFrameWasSignal;
00643 unsigned directLineNumber;
00644 };
00645
00646
00647 class OpalLineSilenceDetector : public OpalSilenceDetector
00648 {
00649 PCLASSINFO(OpalLineSilenceDetector, OpalSilenceDetector);
00650 public:
00655 OpalLineSilenceDetector(
00656 OpalLine & line,
00657 const Params & newParam
00658 );
00660
00671 virtual unsigned GetAverageSignalLevel(
00672 const BYTE * buffer,
00673 PINDEX size
00674 );
00676
00677 protected:
00678 OpalLine & line;
00679 };
00680
00681
00682 #endif // OPAL_LIDS_LIDEP_H
00683
00684
00685