📄 pcss.cxx
字号:
const PString & recordDevice,
void * /*userData*/)
{
return new OpalPCSSConnection(call, *this, playDevice, recordDevice);
}
PSoundChannel * OpalPCSSEndPoint::CreateSoundChannel(const OpalPCSSConnection & connection,
const OpalMediaFormat & mediaFormat,
BOOL isSource)
{
PString deviceName;
if (isSource)
deviceName = connection.GetSoundChannelRecordDevice();
else
deviceName = connection.GetSoundChannelPlayDevice();
PSoundChannel * soundChannel = new PSoundChannel;
if (soundChannel->Open(deviceName,
isSource ? PSoundChannel::Recorder
: PSoundChannel::Player,
1, mediaFormat.GetClockRate(), 16)) {
PTRACE(3, "PCSS\tOpened sound channel \"" << deviceName
<< "\" for " << (isSource ? "record" : "play") << "ing.");
return soundChannel;
}
PTRACE(1, "PCSS\tCould not open sound channel \"" << deviceName
<< "\" for " << (isSource ? "record" : "play")
<< "ing: " << soundChannel->GetErrorText());
delete soundChannel;
return NULL;
}
void OpalPCSSEndPoint::AcceptIncomingConnection(const PString & token)
{
PSafePtr<OpalPCSSConnection> connection = GetPCSSConnectionWithLock(token, PSafeReadOnly);
if (connection != NULL)
connection->AcceptIncoming();
}
BOOL OpalPCSSEndPoint::OnShowUserInput(const OpalPCSSConnection &, const PString &)
{
return TRUE;
}
void OpalPCSSEndPoint::OnPatchMediaStream(const OpalPCSSConnection & /*connection*/, BOOL /*isSource*/, OpalMediaPatch & /*patch*/)
{
}
BOOL OpalPCSSEndPoint::SetSoundChannelPlayDevice(const PString & name)
{
return SetDeviceName(name, PSoundChannel::Player, soundChannelPlayDevice);
}
BOOL OpalPCSSEndPoint::SetSoundChannelRecordDevice(const PString & name)
{
return SetDeviceName(name, PSoundChannel::Recorder, soundChannelRecordDevice);
}
void OpalPCSSEndPoint::SetSoundChannelBufferDepth(unsigned depth)
{
PAssert(depth > 1, PInvalidParameter);
soundChannelBuffers = depth;
}
/////////////////////////////////////////////////////////////////////////////
OpalPCSSConnection::OpalPCSSConnection(OpalCall & call,
OpalPCSSEndPoint & ep,
const PString & playDevice,
const PString & recordDevice)
: OpalConnection(call, ep, MakeToken(playDevice, recordDevice)),
endpoint(ep),
soundChannelPlayDevice(playDevice),
soundChannelRecordDevice(recordDevice),
soundChannelBuffers(ep.GetSoundChannelBufferDepth())
{
silenceDetector = new OpalPCM16SilenceDetector;
echoCanceler = new OpalEchoCanceler;
PTRACE(3, "PCSS\tCreated PC sound system connection.");
}
OpalPCSSConnection::~OpalPCSSConnection()
{
PTRACE(3, "PCSS\tDeleted PC sound system connection.");
}
BOOL OpalPCSSConnection::SetUpConnection()
{
remotePartyName = ownerCall.GetOtherPartyConnection(*this)->GetRemotePartyName();
remotePartyAddress = ownerCall.GetOtherPartyConnection(*this)->GetRemotePartyAddress();
remoteApplication = ownerCall.GetOtherPartyConnection(*this)->GetRemoteApplication();
PTRACE(3, "PCSS\tSetUpConnection(" << remotePartyName << ')');
phase = AlertingPhase;
endpoint.OnShowIncoming(*this);
OnAlerting();
return TRUE;
}
BOOL OpalPCSSConnection::SetAlerting(const PString & calleeName, BOOL)
{
PTRACE(3, "PCSS\tSetAlerting(" << calleeName << ')');
phase = AlertingPhase;
remotePartyName = calleeName;
return endpoint.OnShowOutgoing(*this);
}
BOOL OpalPCSSConnection::SetConnected()
{
PTRACE(3, "PCSS\tSetConnected()");
if (mediaStreams.IsEmpty())
phase = ConnectedPhase;
else {
phase = EstablishedPhase;
OnEstablished();
}
return TRUE;
}
PString OpalPCSSConnection::GetDestinationAddress()
{
return endpoint.OnGetDestination(*this);
}
OpalMediaFormatList OpalPCSSConnection::GetMediaFormats() const
{
OpalMediaFormatList formats;
formats += OpalPCM16; // Sound card can only do 16 bit PCM
AddVideoMediaFormats(formats);
return formats;
}
OpalMediaStream * OpalPCSSConnection::CreateMediaStream(const OpalMediaFormat & mediaFormat,
unsigned sessionID,
BOOL isSource)
{
if (sessionID != OpalMediaFormat::DefaultAudioSessionID)
return OpalConnection::CreateMediaStream(mediaFormat, sessionID, isSource);
PSoundChannel * soundChannel = CreateSoundChannel(mediaFormat, isSource);
if (soundChannel == NULL)
return NULL;
return new OpalAudioMediaStream(mediaFormat, sessionID, isSource, soundChannelBuffers, soundChannel);
}
void OpalPCSSConnection::OnPatchMediaStream(BOOL isSource,
OpalMediaPatch & patch)
{
PTRACE(3, "OpalCon\tNew patch created");
int clockRate;
if (patch.GetSource().GetSessionID() == OpalMediaFormat::DefaultAudioSessionID) {
if (isSource) {
silenceDetector->SetParameters(endpoint.GetManager().GetSilenceDetectParams());
patch.AddFilter(silenceDetector->GetReceiveHandler(), OpalPCM16);
}
clockRate = patch.GetSource().GetMediaFormat().GetClockRate();
echoCanceler->SetParameters(endpoint.GetManager().GetEchoCancelParams());
echoCanceler->SetClockRate(clockRate);
patch.AddFilter(isSource?echoCanceler->GetReceiveHandler():echoCanceler->GetSendHandler(), OpalPCM16);
}
endpoint.OnPatchMediaStream(*this, isSource, patch);
}
BOOL OpalPCSSConnection::OpenSourceMediaStream(const OpalMediaFormatList & mediaFormats,
unsigned sessionID)
{
if (sessionID == OpalMediaFormat::DefaultVideoSessionID && !endpoint.GetManager().CanAutoStartTransmitVideo())
return FALSE;
return OpalConnection::OpenSourceMediaStream(mediaFormats, sessionID);
}
OpalMediaStream * OpalPCSSConnection::OpenSinkMediaStream(OpalMediaStream & source)
{
if (source.GetSessionID() == OpalMediaFormat::DefaultVideoSessionID && !endpoint.GetManager().CanAutoStartReceiveVideo())
return NULL;
return OpalConnection::OpenSinkMediaStream(source);
}
PSoundChannel * OpalPCSSConnection::CreateSoundChannel(const OpalMediaFormat & mediaFormat, BOOL isSource)
{
return endpoint.CreateSoundChannel(*this, mediaFormat, isSource);
}
BOOL OpalPCSSConnection::SendUserInputString(const PString & value)
{
PTRACE(3, "PCSS\tSendUserInputString(" << value << ')');
return endpoint.OnShowUserInput(*this, value);
}
void OpalPCSSConnection::InitiateCall()
{
phase = SetUpPhase;
if (!OnIncomingConnection())
Release(EndedByCallerAbort);
else {
PTRACE(2, "PCSS\tOutgoing call routed to " << ownerCall.GetPartyB() << " for " << *this);
if (!ownerCall.OnSetUp(*this))
Release(EndedByNoAccept);
}
}
void OpalPCSSConnection::AcceptIncoming()
{
if (!LockReadOnly())
return;
if (phase != AlertingPhase) {
UnlockReadOnly();
return;
}
LockReadWrite();
phase = ConnectedPhase;
UnlockReadWrite();
UnlockReadOnly();
OnConnected();
if (!LockReadOnly())
return;
if (mediaStreams.IsEmpty()) {
UnlockReadOnly();
return;
}
LockReadWrite();
phase = EstablishedPhase;
UnlockReadWrite();
UnlockReadOnly();
OnEstablished();
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -