📄 sdphandler.cxx
字号:
bool validUlaw(SipSdp& sdp){ assert(0); return false;}voidsetupMedia(SipSdp& sipSdp, Data hostAddr, int port){ setHost(sipSdp, hostAddr); // guarantees a valid SDP, at least vaguely. // do the media stuff SdpSession sdpDesc = sipSdp.getSdpDescriptor(); // declare the media list pointer list < SdpMedia* > mediaList; // get the media list pointer from the session object mediaList = sdpDesc.getMediaList(); list < SdpMedia* > ::iterator mediaIterator = mediaList.begin(); SdpMedia* media = 0; if(mediaIterator != mediaList.end()) { // xxx this should probably be more careful here // use the first one by default media = *mediaIterator; } else { media = new SdpMedia; media->setPort( port ); sdpDesc.addMedia( media ); } MediaAttributes* mediaAttrib; mediaAttrib = media->getMediaAttributes(); if(!mediaAttrib) { mediaAttrib = new MediaAttributes(); media->setMediaAttributes(mediaAttrib); } sipSdp.setSdpDescriptor( sdpDesc );}voidsetAvt(SdpSession& sdpDesc, int payloadType){ // declare the media list pointer list < SdpMedia* > mediaList; // get the media list pointer from the session object mediaList = sdpDesc.getMediaList(); list < SdpMedia* > ::iterator mediaIterator = mediaList.begin(); assert(mediaIterator != mediaList.end()); SdpMedia* media = *mediaIterator; MediaAttributes* mediaAttrib; mediaAttrib = media->getMediaAttributes(); assert(mediaAttrib != 0); media->addFormat(payloadType); SdpRtpMapAttribute* rtpMapAttribDtmf = new SdpRtpMapAttribute(); rtpMapAttribDtmf->setPayloadType(payloadType); rtpMapAttribDtmf->setEncodingName("telephone-event"); rtpMapAttribDtmf->setClockRate(8000); // add the value attribute for telephone-event ValueAttribute* eventAttrib = new ValueAttribute(); eventAttrib->setAttribute( "fmtp" ); char buf[256]; sprintf(buf, "%d 0-15", payloadType); eventAttrib->setValue( buf ); mediaAttrib->addmap(rtpMapAttribDtmf); mediaAttrib->addValueAttribute( eventAttrib );}voidsetAvt(SipSdp& sipSdp, int payloadType){ setupMedia(sipSdp, theSystem.gethostAddress(), UaDevice::instance()->getRtpPort()); // do the media stuff SdpSession sdpDesc = sipSdp.getSdpDescriptor(); setAvt(sdpDesc, payloadType); sipSdp.setSdpDescriptor(sdpDesc);}bool checkType(SipSdp& sdp, int& realPayloadType, Data eventName){ list < SdpMedia* > remoteMediaList = sdp.getSdpDescriptor().getMediaList(); if (remoteMediaList.size() < 1) { cpLog(LOG_ERR, "did not find any media lists"); return false; } if (remoteMediaList.size() > 1) { cpLog(LOG_WARNING, "Found %d media descriptors. Only using first one!", remoteMediaList.size()); } MediaAttributes *mediaAttributes = (*remoteMediaList.begin())->getMediaAttributes(); if(mediaAttributes) { cpLog( LOG_DEBUG, "Has Media Attribute(s)" ); vector < SdpRtpMapAttribute* > *rtpMaps = mediaAttributes->getmap(); if(rtpMaps->size() == 0) { cpLog(LOG_ERR, "Empty RTP MAP attribute"); return false; } vector < SdpRtpMapAttribute* > ::iterator rtpMap; //As suggested by Steve Frare, though this is just a hack //I am putting it till we investigate more and see why it //should throw an exception in some cases on Windows try { rtpMap = rtpMaps->begin(); while (rtpMap != rtpMaps->end()) { Data encodingName = (*rtpMap)->getEncodingName(); if (isEqualNoCase(encodingName, eventName)) { realPayloadType = (*rtpMap)->getPayloadType(); cpLog(LOG_DEBUG, "Has payload type %s, value %d", encodingName.logData(), realPayloadType); return true; } else { LocalScopeAllocator lo1; LocalScopeAllocator lo2; cpLog(LOG_DEBUG, "payload type %s != %s", eventName.getData(lo1), encodingName.getData(lo2)); } ++rtpMap; } } catch(...) { cpLog( LOG_ERR, "SdpHandler::checkType exception."); } } else { cpLog( LOG_DEBUG, "No Media Attribute" ); return false; } return false;}voiddoAnswerStuff(SipSdp& local, Sptr<SipSdp> remote, Data hostAddr, int port){ SdpSession sdpDesc; SdpMedia* media = new SdpMedia; media->setPort( port ); // which port to use when making a call // RTP doesn't have a suggested number sdpDesc.addMedia( media ); //To further perform any other operation on that particular media //item, use loc. MediaAttributes* mediaAttrib = new MediaAttributes(); assert(mediaAttrib); media->setMediaAttributes(mediaAttrib); // create the new value attribute object ValueAttribute* attrib = new ValueAttribute(); // set the attribute and its value attrib->setAttribute("ptime"); LocalScopeAllocator lo; attrib->setValue( Data( UaConfiguration::instance()->getNetworkRtpRate() ).getData(lo) ); mediaAttrib->addValueAttribute(attrib); setUlaw(sdpDesc, 8000); if(remote != 0) { // Add RTP formats 'PCMU' and 'telephone-event' to local session // description, if supported by remote session description. int payloadType; if(checkType(*remote, payloadType, "telephone-event")) { cpLog(LOG_DEBUG, "Has DTMF NTE (RFC2833) in payload type: %d.", payloadType); if(payloadType == 100) { // there's ULAW in the remote setAvt(sdpDesc, payloadType); } else { // xxx fix this when dynamic payload types work. cpLog(LOG_DEBUG, "%d != 100, so will not respond", payloadType); } } } // always accept AVT tones. setAvt(sdpDesc, 100); local.setSdpDescriptor( sdpDesc ); local.setUserName( theSystem.getUserName() ); local.setSessionName( theSystem.getSessionName() ); setHost(local, hostAddr);}void setAudioRequest( struct Vocal::HardwareAudioRequest* request, SipSdp& remoteSdp, SipSdp& localSdp){ request->type = AudioStart; // Set remote host and port LocalScopeAllocator lo; strcpy( request->remoteHost, remoteSdp.getConnAddress().getData(lo) ); request->remotePort = remoteSdp.getRtpPort(); // set the local host and port request->localPort = localSdp.getRtpPort(); strcpy( request->localHost, localSdp.getConnAddress().getData(lo) ); // set the audio rate (should I use the remote rate?) request->rtpPacketSize = UaConfiguration::instance()->getNetworkRtpRate(); //TODO Why echo cancellation always true? request->echoCancellation = true; //TODO: this will be removed once 183 is integrated. request->sendRingback = false; cpLog( LOG_DEBUG, "Start audio( duplex ):" ); cpLog( LOG_DEBUG, "localHost = %s", request->localHost); cpLog( LOG_DEBUG, "localPort = %d", request->localPort); cpLog( LOG_DEBUG, "remoteHost = %s", request->remoteHost); cpLog( LOG_DEBUG, "remotePort = %d", request->remotePort); cpLog( LOG_DEBUG, "rtpPacketSize = %d", request->rtpPacketSize);}void sendRemoteRingback(SipSdp& remoteSdp){ LocalScopeAllocator lo; Sptr < UaHardwareEvent > ringbackSignal = new UaHardwareEvent( UaDevice::getDeviceQueue() ); ringbackSignal->type = HardwareAudioType; ringbackSignal->signalOrRequest.request.type = AudioStart; ringbackSignal->signalOrRequest.request.localPort = 0; ringbackSignal->signalOrRequest.request.remotePort = remoteSdp.getRtpPort(); strcpy(ringbackSignal->signalOrRequest.request.remoteHost, remoteSdp.getConnAddress().getData(lo)); ringbackSignal->signalOrRequest.request.echoCancellation = true; ringbackSignal->signalOrRequest.request.sendRingback = true; ringbackSignal->signalOrRequest.request.rtpPacketSize = getRtpPacketSize(remoteSdp); if(ringbackSignal->signalOrRequest.request.rtpPacketSize <= 0) { ringbackSignal->signalOrRequest.request.rtpPacketSize = UaConfiguration::instance()->getNetworkRtpRate(); } UaDevice::getDeviceQueue()->add( ringbackSignal );}void startAudio( Sptr < SipSdp > localSdp, Sptr < SipSdp > remoteSdp ){ Sptr < UaHardwareEvent > signal = new UaHardwareEvent( UaDevice::getDeviceQueue() ); signal->type = HardwareAudioType; struct HardwareAudioRequest* request = &(signal->signalOrRequest.request); if(remoteSdp->getSdpDescriptor().isHold()) { cpLog( LOG_DEBUG, "Stopping audio (remote SDP == hold)"); signal->signalOrRequest.request.type = AudioStop; } else { request->type = AudioStart; // Set remote host and port LocalScopeAllocator lo; strcpy( request->remoteHost, remoteSdp->getConnAddress().getData(lo) ); request->remotePort = remoteSdp->getRtpPort(); // Set local host and port request->localPort = localSdp->getRtpPort(); strcpy( request->localHost, localSdp->getConnAddress().getData(lo) ); /** * Echo cancellation is always true, since there is no code to * handle SDP echo cancellation negotiation. */ request->echoCancellation = true; // Set rtpPacketSize to default in ua.cfg file int rtpPacketSize = getRtpPacketSize(*localSdp); if(rtpPacketSize <= 0) { rtpPacketSize = UaConfiguration::instance()->getNetworkRtpRate(); } request->rtpPacketSize = rtpPacketSize; request->sendRingback = false; cpLog( LOG_DEBUG, "Start audio( duplex ):" ); cpLog( LOG_DEBUG, "localHost = %s", request->localHost); cpLog( LOG_DEBUG, "localPort = %d", request->localPort); cpLog( LOG_DEBUG, "remoteHost = %s", request->remoteHost); cpLog( LOG_DEBUG, "remotePort = %d", request->remotePort); cpLog( LOG_DEBUG, "rtpPacketSize = %d", request->rtpPacketSize ); } UaDevice::getDeviceQueue()->add( signal );}/* Local Variables: *//* c-file-style: "stroustrup" *//* indent-tabs-mode: nil *//* c-file-offsets: ((access-label . -) (inclass . ++)) *//* c-basic-offset: 4 *//* End: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -