⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdphandler.cxx

📁 Vovida 社区开源的 SIP 协议源码
💻 CXX
📖 第 1 页 / 共 2 页
字号:
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 + -