Changeset 2018


Ignore:
Timestamp:
Jun 13, 2008 5:01:46 PM (11 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

Location:
pjproject/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r2008 r2018  
    202202    puts  ("  --capture-lat=N     Audio capture latency, in ms (default=10)"); 
    203203    puts  ("  --playback-lat=N    Audio playback latency, in ms (default=100)"); 
     204    puts  ("  --snd-auto-close=N  Auto close audio device when it is idle for N seconds."); 
     205    puts  ("                      Specify N=-1 (default) to disable this feature."); 
     206    puts  ("                      Specify N=0 for instant close when unused."); 
    204207 
    205208    puts  (""); 
     
    401404    int option_index; 
    402405    enum { OPT_CONFIG_FILE=127, OPT_LOG_FILE, OPT_LOG_LEVEL, OPT_APP_LOG_LEVEL,  
    403            OPT_HELP, OPT_VERSION, OPT_NULL_AUDIO,  
     406           OPT_HELP, OPT_VERSION, OPT_NULL_AUDIO, OPT_SND_AUTO_CLOSE, 
    404407           OPT_LOCAL_PORT, OPT_IP_ADDR, OPT_PROXY, OPT_OUTBOUND_PROXY,  
    405408           OPT_REGISTRAR, OPT_REG_TIMEOUT, OPT_PUBLISH, OPT_ID, OPT_CONTACT, 
     
    515518        { "stdout-refresh", 1, 0, OPT_STDOUT_REFRESH}, 
    516519        { "stdout-refresh-text", 1, 0, OPT_STDOUT_REFRESH_TEXT}, 
     520        { "snd-auto-close", 1, 0, OPT_SND_AUTO_CLOSE}, 
    517521        { NULL, 0, 0, 0} 
    518522    }; 
     
    11071111        case OPT_PLAYBACK_LAT: 
    11081112            cfg->playback_lat = atoi(pj_optarg); 
     1113            break; 
     1114 
     1115        case OPT_SND_AUTO_CLOSE: 
     1116            cfg->media_cfg.snd_auto_close_time = atoi(pj_optarg); 
    11091117            break; 
    11101118 
     
    15031511    if (config->playback_dev != PJSUA_INVALID_ID) { 
    15041512        pj_ansi_sprintf(line, "--playback-dev %d\n", config->playback_dev); 
     1513        pj_strcat2(&cfg, line); 
     1514    } 
     1515    if (config->media_cfg.snd_auto_close_time != -1) { 
     1516        pj_ansi_sprintf(line, "--snd-auto-close %d\n",  
     1517                        config->media_cfg.snd_auto_close_time); 
    15051518        pj_strcat2(&cfg, line); 
    15061519    } 
     
    37873800#endif 
    37883801 
    3789     if (app_config.capture_dev != PJSUA_INVALID_ID 
    3790         || app_config.playback_dev != PJSUA_INVALID_ID) { 
    3791         status 
    3792           = pjsua_set_snd_dev(app_config.capture_dev, app_config.playback_dev); 
     3802    if (app_config.capture_dev  != PJSUA_INVALID_ID || 
     3803        app_config.playback_dev != PJSUA_INVALID_ID)  
     3804    { 
     3805        status = pjsua_set_snd_dev(app_config.capture_dev,  
     3806                                   app_config.playback_dev); 
    37933807        if (status != PJ_SUCCESS) 
    37943808            goto on_error; 
  • pjproject/trunk/pjsip-apps/src/symbian_ua/ua.cpp

    r1979 r2018  
    335335    med_cfg.ec_tail_len = 0; 
    336336    med_cfg.enable_ice = USE_ICE; 
     337    med_cfg.snd_auto_close_time = 5; // wait for 5 seconds idle before sound dev get auto-closed 
    337338     
    338339    status = pjsua_init(&cfg, &log_cfg, &med_cfg); 
  • pjproject/trunk/pjsip-apps/src/symbian_ua_gui/src/symbian_ua.cpp

    r1979 r2018  
    327327    med_cfg.ec_tail_len = 0; 
    328328    med_cfg.enable_ice = USE_ICE; 
     329    med_cfg.snd_auto_close_time = 5; // wait for 5 seconds idle before sound dev get auto-closed 
    329330 
    330331    pjsua_logging_config log_cfg; 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r2004 r2018  
    39093909     */ 
    39103910    pj_stun_auth_cred   turn_auth_cred; 
     3911 
     3912    /** 
     3913     * Specify idle time of sound device before it is automatically closed, 
     3914     * in seconds. 
     3915     * 
     3916     * Default : -1 (Disable the auto-close feature of sound device) 
     3917     */ 
     3918    int                 snd_auto_close_time; 
    39113919}; 
    39123920 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_internal.h

    r1990 r2018  
    237237    int                  play_dev;  /**< Playback device ID.            */ 
    238238    pj_bool_t            no_snd;    /**< No sound (app will manage it)  */ 
     239    pj_pool_t           *snd_pool;  /**< Sound's private pool.          */ 
    239240    pjmedia_snd_port    *snd_port;  /**< Sound port.                    */ 
     241    pj_timer_entry       snd_idle_timer;/**< Sound device idle timer.   */ 
    240242    pjmedia_master_port *null_snd;  /**< Master port for null sound.    */ 
    241243    pjmedia_port        *null_port; /**< Null port.                     */ 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r1990 r2018  
    172172    cfg->ec_tail_len = PJSUA_DEFAULT_EC_TAIL_LEN; 
    173173    cfg->jb_init = cfg->jb_min_pre = cfg->jb_max_pre = cfg->jb_max = -1; 
     174    cfg->snd_auto_close_time = -1; 
    174175 
    175176    cfg->turn_conn_type = PJ_TURN_TP_UDP; 
  • 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.