📄 main.cxx
字号:
if (args.HasOption('j')) {
unsigned minJitter;
unsigned maxJitter;
PStringArray delays = args.GetOptionString('j').Tokenise(",-");
if (delays.GetSize() < 2) {
maxJitter = delays[0].AsUnsigned();
minJitter = PMIN(GetMinAudioJitterDelay(), maxJitter);
}
else {
minJitter = delays[0].AsUnsigned();
maxJitter = delays[1].AsUnsigned();
}
if (minJitter >= 20 && minJitter <= maxJitter && maxJitter <= 1000)
SetAudioJitterDelay(minJitter, maxJitter);
else {
cerr << "Jitter should be between 20 and 1000 milliseconds." << endl;
return FALSE;
}
}
if (!SetSoundDevice(args, "sound", PSoundChannel::Recorder))
return FALSE;
if (!SetSoundDevice(args, "sound", PSoundChannel::Player))
return FALSE;
if (!SetSoundDevice(args, "sound-in", PSoundChannel::Recorder))
return FALSE;
if (!SetSoundDevice(args, "sound-out", PSoundChannel::Player))
return FALSE;
// Set the default codecs available on sound cards.
AddAllCapabilities(0, 0, "*");
AddAllUserInputCapabilities(0, 1);
RemoveCapabilities(args.GetOptionString('D').Lines());
ReorderCapabilities(args.GetOptionString('P').Lines());
cout << "Local username: " << GetLocalUserName() << "\n"
<< "Silence compression is " << (GetSilenceDetectionMode() == H323AudioCodec::NoSilenceDetection ? "Dis" : "En") << "abled\n"
<< "Auto answer is " << autoAnswer << "\n"
<< "FastConnect is " << (IsFastStartDisabled() ? "Dis" : "En") << "abled\n"
<< "H245Tunnelling is " << (IsH245TunnelingDisabled() ? "Dis" : "En") << "abled\n"
<< "Jitter buffer: " << GetMinAudioJitterDelay() << '-' << GetMaxAudioJitterDelay() << " ms\n"
<< "Sound output device: \"" << GetSoundChannelPlayDevice() << "\"\n"
"Sound input device: \"" << GetSoundChannelRecordDevice() << "\"\n"
<< "Codecs (in preference order):\n" << setprecision(2) << GetCapabilities() << endl;
// Start the listener thread for incoming calls.
H323TransportAddress iface = args.GetOptionString('i');
if (iface.IsEmpty())
iface = "*";
if (!StartListener(iface)) {
cerr << "Could not open H.323 listener port on \"" << iface << '"' << endl;
return FALSE;
}
// Initialise the security info
if (args.HasOption('p')) {
SetGatekeeperPassword(args.GetOptionString('p'));
cout << "Enabling H.235 security access to gatekeeper." << endl;
}
#ifdef H323_TRANSNEXUS_OSP
if (args.HasOption("osp")) {
PDirectory ospDir;
if (args.HasOption("ospdir"))
ospDir = args.GetOptionString("ospdir");
SetOSPProvider(args.GetOptionString("osp"));
}
else
#endif
// Establish link with gatekeeper if required.
if (args.HasOption('g') || !args.HasOption('n')) {
H323TransportUDP * rasChannel;
if (args.GetOptionString('i').IsEmpty())
rasChannel = new H323TransportUDP(*this);
else {
PIPSocket::Address interfaceAddress(args.GetOptionString('i'));
rasChannel = new H323TransportUDP(*this, interfaceAddress);
}
if (args.HasOption('g')) {
PString gkName = args.GetOptionString('g');
if (SetGatekeeper(gkName, rasChannel))
cout << "Gatekeeper set: " << *gatekeeper << endl;
else {
cerr << "Error registering with gatekeeper at \"" << gkName << '"' << endl;
return FALSE;
}
}
else {
cout << "Searching for gatekeeper..." << flush;
if (DiscoverGatekeeper(rasChannel))
cout << "\nGatekeeper found: " << *gatekeeper << endl;
else {
cerr << "\nNo gatekeeper found." << endl;
if (args.HasOption('r'))
return FALSE;
}
}
}
// osptoken option only makes sense if gatekeeper is being used
if ((gatekeeper != NULL) && args.HasOption("osptoken"))
SetGkAccessTokenOID(OpalOSP::ETSIXMLTokenOID);
return TRUE;
}
BOOL SimpleH323EndPoint::SetSoundDevice(PArgList & args,
const char * optionName,
PSoundChannel::Directions dir)
{
if (!args.HasOption(optionName))
return TRUE;
PString dev = args.GetOptionString(optionName);
if (dir == PSoundChannel::Player) {
if (SetSoundChannelPlayDevice(dev))
return TRUE;
}
else {
if (SetSoundChannelRecordDevice(dev))
return TRUE;
}
cerr << "Device for " << optionName << " (\"" << dev << "\") must be one of:\n";
PStringArray names = PSoundChannel::GetDeviceNames(dir);
for (PINDEX i = 0; i < names.GetSize(); i++)
cerr << " \"" << names[i] << "\"\n";
return FALSE;
}
H323Connection * SimpleH323EndPoint::CreateConnection(unsigned callReference)
{
return new SimpleH323Connection(*this, callReference);
}
BOOL SimpleH323EndPoint::OnIncomingCall(H323Connection & connection,
const H323SignalPDU &,
H323SignalPDU &)
{
if (currentCallToken.IsEmpty())
return TRUE;
if (busyForwardParty.IsEmpty()) {
cout << "Incoming call from \"" << connection.GetRemotePartyName() << "\" rejected, line busy!" << endl;
return FALSE;
}
cout << "Forwarding call to \"" << busyForwardParty << "\"." << endl;
return !connection.ForwardCall(busyForwardParty);
}
H323Connection::AnswerCallResponse
SimpleH323EndPoint::OnAnswerCall(H323Connection & connection,
const PString & caller,
const H323SignalPDU &,
H323SignalPDU &)
{
currentCallToken = connection.GetCallToken();
if (autoAnswer) {
cout << "Automatically accepting call." << endl;
return H323Connection::AnswerCallNow;
}
cout << "Incoming call from \""
<< caller
<< "\", answer call (Y/n)? "
<< flush;
return H323Connection::AnswerCallPending;
}
BOOL SimpleH323EndPoint::OnConnectionForwarded(H323Connection & /*connection*/,
const PString & forwardParty,
const H323SignalPDU & /*pdu*/)
{
if (MakeCall(forwardParty, currentCallToken)) {
cout << "Call is being forwarded to host " << forwardParty << endl;
return TRUE;
}
cout << "Error forwarding call to \"" << forwardParty << '"' << endl;
return FALSE;
}
void SimpleH323EndPoint::OnConnectionEstablished(H323Connection & connection,
const PString & token)
{
currentCallToken = token;
cout << "In call with " << connection.GetRemotePartyName() << endl;
}
void SimpleH323EndPoint::OnConnectionCleared(H323Connection & connection,
const PString & clearedCallToken)
{
if (currentCallToken == clearedCallToken)
currentCallToken = PString();
PString remoteName = '"' + connection.GetRemotePartyName() + '"';
switch (connection.GetCallEndReason()) {
case H323Connection::EndedByRemoteUser :
cout << remoteName << " has cleared the call";
break;
case H323Connection::EndedByCallerAbort :
cout << remoteName << " has stopped calling";
break;
case H323Connection::EndedByRefusal :
cout << remoteName << " did not accept your call";
break;
case H323Connection::EndedByNoAnswer :
cout << remoteName << " did not answer your call";
break;
case H323Connection::EndedByTransportFail :
cout << "Call with " << remoteName << " ended abnormally";
break;
case H323Connection::EndedByCapabilityExchange :
cout << "Could not find common codec with " << remoteName;
break;
case H323Connection::EndedByNoAccept :
cout << "Did not accept incoming call from " << remoteName;
break;
case H323Connection::EndedByAnswerDenied :
cout << "Refused incoming call from " << remoteName;
break;
case H323Connection::EndedByNoUser :
cout << "Gatekeeper could find user " << remoteName;
break;
case H323Connection::EndedByNoBandwidth :
cout << "Call to " << remoteName << " aborted, insufficient bandwidth.";
break;
case H323Connection::EndedByUnreachable :
cout << remoteName << " could not be reached.";
break;
case H323Connection::EndedByHostOffline :
cout << remoteName << " is not online.";
break;
case H323Connection::EndedByNoEndPoint :
cout << "No phone running for " << remoteName;
break;
case H323Connection::EndedByConnectFail :
cout << "Transport error calling " << remoteName;
break;
default :
cout << "Call with " << remoteName << " completed";
}
PTime connectTime = connection.GetConnectionStartTime();
if (connectTime.GetTimeInSeconds() != 0)
cout << ", duration "
<< setprecision(0) << setw(5)
<< (PTime() - connectTime);
cout << endl;
}
BOOL SimpleH323EndPoint::OpenAudioChannel(H323Connection & connection,
BOOL isEncoding,
unsigned bufferSize,
H323AudioCodec & codec)
{
if (H323EndPoint::OpenAudioChannel(connection, isEncoding, bufferSize, codec))
return TRUE;
cerr << "Could not open sound device ";
if (isEncoding)
cerr << GetSoundChannelRecordDevice();
else
cerr << GetSoundChannelPlayDevice();
cerr << " - Check permissions or full duplex capability." << endl;
return FALSE;
}
///////////////////////////////////////////////////////////////
SimpleH323Connection::SimpleH323Connection(SimpleH323EndPoint & ep, unsigned ref)
: H323Connection(ep, ref)
{
}
BOOL SimpleH323Connection::OnStartLogicalChannel(H323Channel & channel)
{
if (!H323Connection::OnStartLogicalChannel(channel))
return FALSE;
cout << "Started logical channel: ";
switch (channel.GetDirection()) {
case H323Channel::IsTransmitter :
cout << "sending ";
break;
case H323Channel::IsReceiver :
cout << "receiving ";
break;
default :
break;
}
cout << channel.GetCapability() << endl;
return TRUE;
}
void SimpleH323Connection::OnUserInputString(const PString & value)
{
cout << "User input received: \"" << value << '"' << endl;
}
// End of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -