Ignore:
Timestamp:
Feb 21, 2006 12:11:18 AM (18 years ago)
Author:
bennylp
Message:

Initial conference implementation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua/pjsua_inv.c

    r201 r205  
    4242    struct pjsua_inv_data *inv_data; 
    4343    pjsip_tx_data *tdata; 
     44    int med_sk_index = 0; 
    4445    pj_status_t status; 
    4546 
     
    4849    dest_uri = pj_str((char*)cstr_dest_uri); 
    4950 
     51    /* Find free socket. */ 
     52    for (med_sk_index=0; med_sk_index<PJSUA_MAX_CALLS; ++med_sk_index) { 
     53        if (!pjsua.med_sock_use[med_sk_index]) 
     54            break; 
     55    } 
     56 
     57    if (med_sk_index == PJSUA_MAX_CALLS) { 
     58        PJ_LOG(3,(THIS_FILE, "Error: too many calls!")); 
     59        return PJ_ETOOMANY; 
     60    } 
     61 
     62    pjsua.med_sock_use[med_sk_index] = 1; 
     63 
    5064    /* Create outgoing dialog: */ 
    5165 
     
    6175 
    6276    status = pjmedia_endpt_create_sdp( pjsua.med_endpt, dlg->pool, 
    63                                        1, &pjsua.med_skinfo, &offer); 
     77                                       1, &pjsua.med_sock_info[med_sk_index],  
     78                                       &offer); 
    6479    if (status != PJ_SUCCESS) { 
    6580        pjsua_perror(THIS_FILE, "pjmedia unable to create SDP", status); 
     
    8095    inv_data = pj_pool_zalloc( dlg->pool, sizeof(struct pjsua_inv_data)); 
    8196    inv_data->inv = inv; 
     97    inv_data->call_slot = med_sk_index; 
    8298    dlg->mod_data[pjsua.mod.id] = inv_data; 
    8399    inv->mod_data[pjsua.mod.id] = inv_data; 
     
    130146 
    131147    PJ_TODO(DESTROY_DIALOG_ON_FAIL); 
     148    pjsua.med_sock_use[med_sk_index] = 0; 
    132149    return status; 
    133150} 
     
    183200            struct pjsua_inv_data *inv_data; 
    184201            pjmedia_sdp_session *answer; 
    185  
     202            int med_sk_index; 
     203 
     204 
     205            /* Find free socket. */ 
     206            for (med_sk_index=0; med_sk_index<PJSUA_MAX_CALLS; ++med_sk_index) { 
     207                if (!pjsua.med_sock_use[med_sk_index]) 
     208                    break; 
     209            } 
     210 
     211            if (med_sk_index == PJSUA_MAX_CALLS) { 
     212                PJ_LOG(3,(THIS_FILE, "Error: too many calls!")); 
     213                return PJ_TRUE; 
     214            } 
     215 
     216 
     217            pjsua.med_sock_use[med_sk_index] = 1; 
    186218 
    187219            /* Get media capability from media endpoint: */ 
    188220 
    189221            status = pjmedia_endpt_create_sdp( pjsua.med_endpt, rdata->tp_info.pool, 
    190                                                1, &pjsua.med_skinfo, &answer ); 
     222                                               1, &pjsua.med_sock_info[med_sk_index],  
     223                                               &answer ); 
    191224            if (status != PJ_SUCCESS) { 
    192225 
    193226                pjsip_endpt_respond_stateless(pjsua.endpt, rdata, 500, NULL, 
    194227                                              NULL, NULL); 
     228                pjsua.med_sock_use[med_sk_index] = 0; 
    195229                return PJ_TRUE; 
    196230            } 
     
    200234            status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata, 
    201235                                           &pjsua.contact_uri, &dlg); 
    202             if (status != PJ_SUCCESS) 
     236            if (status != PJ_SUCCESS) { 
     237                pjsua.med_sock_use[med_sk_index] = 0; 
    203238                return PJ_TRUE; 
     239            } 
    204240 
    205241 
     
    215251                                                     pjsip_rdata_get_tsx(rdata), 
    216252                                                     response); 
     253                pjsua.med_sock_use[med_sk_index] = 0; 
    217254                return PJ_TRUE; 
    218255 
     
    224261            inv_data = pj_pool_zalloc(dlg->pool, sizeof(struct pjsua_inv_data)); 
    225262            inv_data->inv = inv; 
     263            inv_data->call_slot = inv_data->call_slot = med_sk_index; 
    226264            dlg->mod_data[pjsua.mod.id] = inv_data; 
    227265            inv->mod_data[pjsua.mod.id] = inv_data; 
     
    261299 
    262300        if (inv_data && inv_data->session) { 
     301            pjmedia_conf_remove_port(pjsua.mconf, inv_data->conf_slot); 
    263302            pjmedia_session_destroy(inv_data->session); 
     303            pjsua.med_sock_use[inv_data->call_slot] = 0; 
    264304            inv_data->session = NULL; 
    265305 
     
    313353    inv_data = inv->dlg->mod_data[pjsua.mod.id]; 
    314354    if (inv_data && inv_data->session) { 
     355        pjmedia_conf_remove_port(pjsua.mconf, inv_data->conf_slot); 
    315356        pjmedia_session_destroy(inv_data->session); 
     357        pjsua.med_sock_use[inv_data->call_slot] = 0; 
    316358        inv_data->session = NULL; 
    317359    } 
     
    336378    } 
    337379 
    338  
    339380    /* Create new media session.  
    340381     * The media session is active immediately. 
     
    342383 
    343384    if (!pjsua.null_audio) { 
    344  
    345         status = pjmedia_session_create( pjsua.med_endpt, 1, &pjsua.med_skinfo, 
     385        pjmedia_port *media_port; 
     386        pj_str_t port_name; 
     387        char tmp[PJSIP_MAX_URL_SIZE]; 
     388 
     389        status = pjmedia_session_create( pjsua.med_endpt, 1,  
     390                                         &pjsua.med_sock_info[inv_data->call_slot], 
    346391                                         local_sdp, remote_sdp,  
    347392                                         &inv_data->session ); 
     
    352397        } 
    353398 
     399        pjmedia_session_get_port(inv_data->session, 0, &media_port); 
     400 
     401        port_name.ptr = tmp; 
     402        port_name.slen = pjsip_uri_print(PJSIP_URI_IN_REQ_URI, 
     403                                         inv_data->inv->dlg->remote.info->uri, 
     404                                         tmp, sizeof(tmp)); 
     405        if (port_name.slen < 1) { 
     406            port_name = pj_str("call"); 
     407        } 
     408        status = pjmedia_conf_add_port( pjsua.mconf, inv->pool, 
     409                                        media_port,  
     410                                        &port_name, 
     411                                        &inv_data->conf_slot); 
     412        if (status != PJ_SUCCESS) { 
     413            pjsua_perror(THIS_FILE, "Unable to create conference slot",  
     414                         status); 
     415            pjmedia_session_destroy(inv_data->session); 
     416            inv_data->session = NULL; 
     417            return; 
     418        } 
     419 
     420        pjmedia_conf_connect_port( pjsua.mconf, 0, inv_data->conf_slot); 
     421        pjmedia_conf_connect_port( pjsua.mconf, inv_data->conf_slot, 0); 
     422 
    354423        PJ_LOG(3,(THIS_FILE,"Media has been started successfully")); 
    355424    } 
Note: See TracChangeset for help on using the changeset viewer.