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 __LIDS_LIDEP_H
00035 #define __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 PBoolean 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
00489 void setDialDelay(unsigned int uiDialDelay) { m_dialParams.m_dialStartDelay = uiDialDelay;}
00490
00494 unsigned int getDialDelay() const { return m_dialParams.m_dialStartDelay; }
00495
00496
00497 protected:
00498 OpalLineEndPoint & endpoint;
00499 OpalLine & line;
00500 bool wasOffHook;
00501 unsigned minimumRingCount;
00502 OpalLineInterfaceDevice::DialParams m_dialParams;
00503
00504 PDECLARE_NOTIFIER(PThread, OpalLineConnection, HandleIncoming);
00505 PThread * handlerThread;
00506 };
00507
00508
00512 class OpalLineMediaStream : public OpalMediaStream
00513 {
00514 PCLASSINFO(OpalLineMediaStream, OpalMediaStream);
00515 public:
00520 OpalLineMediaStream(
00521 OpalLineConnection & conn,
00522 const OpalMediaFormat & mediaFormat,
00523 unsigned sessionID,
00524 PBoolean isSource,
00525 OpalLine & line
00526 );
00528
00536 virtual PBoolean Open();
00537
00542 virtual PBoolean Close();
00543
00549 virtual PBoolean ReadPacket(
00550 RTP_DataFrame & packet
00551 );
00552
00558 virtual PBoolean WritePacket(
00559 RTP_DataFrame & packet
00560 );
00561
00565 virtual PBoolean ReadData(
00566 BYTE * data,
00567 PINDEX size,
00568 PINDEX & length
00569 );
00570
00574 virtual PBoolean WriteData(
00575 const BYTE * data,
00576 PINDEX length,
00577 PINDEX & written
00578 );
00579
00585 virtual PBoolean SetDataSize(
00586 PINDEX dataSize
00587 );
00588
00592 virtual PBoolean IsSynchronous() const;
00593
00603 virtual PBoolean RequiresPatchThread(
00604 OpalMediaStream * sinkStream
00605 ) const;
00607
00612 OpalLine & GetLine() { return line; }
00614
00615 protected:
00616 OpalLine & line;
00617 bool notUsingRTP;
00618 bool useDeblocking;
00619 unsigned missedCount;
00620 BYTE lastSID[4];
00621 bool lastFrameWasSignal;
00622 unsigned directLineNumber;
00623 };
00624
00625
00626 class OpalLineSilenceDetector : public OpalSilenceDetector
00627 {
00628 PCLASSINFO(OpalLineSilenceDetector, OpalSilenceDetector);
00629 public:
00634 OpalLineSilenceDetector(
00635 OpalLine & line,
00636 const Params & newParam
00637 );
00639
00650 virtual unsigned GetAverageSignalLevel(
00651 const BYTE * buffer,
00652 PINDEX size
00653 );
00655
00656 protected:
00657 OpalLine & line;
00658 };
00659
00660
00661 #endif // __LIDS_LIDEP_H
00662
00663
00664