Ignore:
Timestamp:
Jun 13, 2008 5:01:46 PM (16 years ago)
Author:
nanang
Message:

Ticket #540: Added pjsua-lib feature auto-close sound device on idle and new pjsua option --snd-auto-close=N

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r2004 r2018  
    2323#define THIS_FILE               "pjsua_media.c" 
    2424 
    25 #define DEFAULT_RTP_PORT                        4000 
     25#define DEFAULT_RTP_PORT        4000 
     26 
     27#define NULL_SND_DEV_ID         -99 
    2628 
    2729#ifndef PJSUA_REQUIRE_CONSECUTIVE_RTCP_PORT 
     
    424426} 
    425427 
     428/* Timer callback to close sound device */ 
     429static void close_snd_timer_cb( pj_timer_heap_t *th, 
     430                                pj_timer_entry *entry) 
     431{ 
     432    PJ_UNUSED_ARG(th); 
     433 
     434    PJ_LOG(4,(THIS_FILE,"Closing sound device after idle for %d seconds",  
     435              pjsua_var.media_cfg.snd_auto_close_time)); 
     436 
     437    entry->id = PJ_FALSE; 
     438 
     439    close_snd_dev(); 
     440} 
     441 
    426442 
    427443/* 
     
    445461    } 
    446462 
    447     /* Create sound port if none is created yet */ 
    448     if (pjsua_var.snd_port==NULL && pjsua_var.null_snd==NULL &&  
    449         !pjsua_var.no_snd)  
    450     { 
    451         status = pjsua_set_snd_dev(pjsua_var.cap_dev, pjsua_var.play_dev); 
    452         if (status != PJ_SUCCESS) { 
    453             pjsua_perror(THIS_FILE, "Error opening sound device", status); 
    454             return status; 
    455         } 
    456     } 
     463    pj_timer_entry_init(&pjsua_var.snd_idle_timer, PJ_FALSE, NULL,  
     464                        &close_snd_timer_cb); 
    457465 
    458466    return PJ_SUCCESS; 
     
    13281336                                        pjsua_conf_port_id sink) 
    13291337{ 
     1338    /* If sound device idle timer is active, cancel it first. */ 
     1339    if (pjsua_var.snd_idle_timer.id) { 
     1340        pjsip_endpt_cancel_timer(pjsua_var.endpt, &pjsua_var.snd_idle_timer); 
     1341        pjsua_var.snd_idle_timer.id = PJ_FALSE; 
     1342    } 
     1343 
     1344    /* Create sound port if none is instantiated */ 
     1345    if (pjsua_var.snd_port==NULL && pjsua_var.null_snd==NULL &&  
     1346        !pjsua_var.no_snd)  
     1347    { 
     1348        pj_status_t status; 
     1349 
     1350        status = pjsua_set_snd_dev(pjsua_var.cap_dev, pjsua_var.play_dev); 
     1351        if (status != PJ_SUCCESS) { 
     1352            pjsua_perror(THIS_FILE, "Error opening sound device", status); 
     1353            return status; 
     1354        } 
     1355    } 
     1356 
    13301357    return pjmedia_conf_connect_port(pjsua_var.mconf, source, sink, 0); 
    13311358} 
     
    13381365                                           pjsua_conf_port_id sink) 
    13391366{ 
    1340     return pjmedia_conf_disconnect_port(pjsua_var.mconf, source, sink); 
     1367    pj_status_t status; 
     1368 
     1369    status = pjmedia_conf_disconnect_port(pjsua_var.mconf, source, sink); 
     1370    if (status != PJ_SUCCESS) 
     1371        return status; 
     1372 
     1373    /* If no port is connected, sound device must be idle. Activate sound  
     1374     * device auto-close timer. 
     1375     */ 
     1376    if ((pjsua_var.snd_port!=NULL || pjsua_var.null_snd!=NULL) &&  
     1377        pjsua_var.snd_idle_timer.id==PJ_FALSE && 
     1378        pjmedia_conf_get_connect_count(pjsua_var.mconf) == 0 && 
     1379        pjsua_var.media_cfg.snd_auto_close_time >= 0) 
     1380    { 
     1381        pj_time_val delay; 
     1382 
     1383        delay.msec = 0; 
     1384        delay.sec = pjsua_var.media_cfg.snd_auto_close_time; 
     1385 
     1386        pjsua_var.snd_idle_timer.id = PJ_TRUE; 
     1387        pjsip_endpt_schedule_timer(pjsua_var.endpt, &pjsua_var.snd_idle_timer,  
     1388                                   &delay); 
     1389    } 
     1390 
     1391    return status; 
    13411392} 
    13421393 
     
    18441895        pjsua_var.null_snd = NULL; 
    18451896    } 
     1897 
     1898    if (pjsua_var.snd_pool)  
     1899        pj_pool_release(pjsua_var.snd_pool); 
     1900    pjsua_var.snd_pool = NULL; 
    18461901} 
    18471902 
     
    18641919    pj_status_t status = -1; 
    18651920 
     1921    /* Check if NULL sound device is used */ 
     1922    if (NULL_SND_DEV_ID == capture_dev || NULL_SND_DEV_ID == playback_dev) { 
     1923        return pjsua_set_null_snd_dev(); 
     1924    } 
     1925 
    18661926    /* Close existing sound port */ 
    18671927    close_snd_dev(); 
    18681928 
     1929    /* Create memory pool for sound device. */ 
     1930    pjsua_var.snd_pool = pjsua_pool_create("pjsua_snd", 4000, 4000); 
     1931    PJ_ASSERT_RETURN(pjsua_var.snd_pool, PJ_ENOMEM); 
    18691932 
    18701933    /* Set default clock rate */ 
     
    18881951        /* Create the sound device. Sound port will start immediately. */ 
    18891952        fps = 1000 / pjsua_var.media_cfg.audio_frame_ptime; 
    1890         status = pjmedia_snd_port_create(pjsua_var.pool, capture_dev, 
     1953        status = pjmedia_snd_port_create(pjsua_var.snd_pool, capture_dev, 
    18911954                                         playback_dev,  
    18921955                                         clock_rates[i],  
     
    19151978                } 
    19161979                 
    1917                 status = pjmedia_resample_port_create(pjsua_var.pool,  
     1980                status = pjmedia_resample_port_create(pjsua_var.snd_pool,  
    19181981                                                      conf_port, 
    19191982                                                      selected_clock_rate, 
     
    19492012 
    19502013    /* Set AEC */ 
    1951     pjmedia_snd_port_set_ec( pjsua_var.snd_port, pjsua_var.pool,  
     2014    pjmedia_snd_port_set_ec( pjsua_var.snd_port, pjsua_var.snd_pool,  
    19522015                             pjsua_var.media_cfg.ec_tail_len,  
    19532016                             pjsua_var.media_cfg.ec_options); 
     
    20202083    close_snd_dev(); 
    20212084 
     2085    /* Create memory pool for sound device. */ 
     2086    pjsua_var.snd_pool = pjsua_pool_create("pjsua_snd", 4000, 4000); 
     2087    PJ_ASSERT_RETURN(pjsua_var.snd_pool, PJ_ENOMEM); 
     2088 
    20222089    PJ_LOG(4,(THIS_FILE, "Opening null sound device..")); 
    20232090 
     
    20292096     * a null port. 
    20302097     */ 
    2031     status = pjmedia_master_port_create(pjsua_var.pool, pjsua_var.null_port, 
     2098    status = pjmedia_master_port_create(pjsua_var.snd_pool, pjsua_var.null_port, 
    20322099                                        conf_port, 0, &pjsua_var.null_snd); 
    20332100    if (status != PJ_SUCCESS) { 
     
    20402107    status = pjmedia_master_port_start(pjsua_var.null_snd); 
    20412108    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); 
     2109 
     2110    pjsua_var.cap_dev = NULL_SND_DEV_ID; 
     2111    pjsua_var.play_dev = NULL_SND_DEV_ID; 
    20422112 
    20432113    return PJ_SUCCESS; 
Note: See TracChangeset for help on using the changeset viewer.