Ignore:
Timestamp:
Jul 24, 2008 3:30:44 PM (16 years ago)
Author:
nanang
Message:

Ticket #577: Initial source of sound device wrapper with APS

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/symsndtest/app_main.cpp

    r1641 r2174  
    1717 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  
    1818 */ 
     19#include <pjmedia/delaybuf.h> 
    1920#include <pjmedia/sound.h> 
    2021#include <pj/errno.h> 
     
    2829#define CLOCK_RATE              8000 
    2930#define CHANNEL_COUNT           1 
    30 #define PTIME                   100 
    31 #define SAMPLES_PER_FRAME       (80) 
     31#define PTIME                   20 
     32#define SAMPLES_PER_FRAME       (CLOCK_RATE*PTIME/1000) 
    3233#define BITS_PER_SAMPLE         16 
    33 #define LOOPBACK_BUFF_COUNT 100 
    3434 
    3535extern CConsoleBase* console; 
     
    4040static pj_time_val t_start; 
    4141 
    42  
    43 static pj_int16_t buff_loopback[SAMPLES_PER_FRAME*LOOPBACK_BUFF_COUNT]; 
    44 static pj_uint32_t pointer_w, pointer_r; 
     42pj_pool_t *pool; 
     43pjmedia_delay_buf *delaybuf; 
    4544 
    4645/* Logging callback */ 
     
    7473    pj_log_set_log_func((void (*)(int,const char*,int)) &log_writer); 
    7574    pj_log_set_decor(PJ_LOG_HAS_NEWLINE); 
    76     pj_log_set_level(5); 
     75    pj_log_set_level(3); 
    7776     
    7877    /* Init pjlib */ 
     
    104103                   info->default_samples_per_sec));      
    105104    } 
     105 
     106    /* Create pool */ 
     107    pool = pj_pool_create(&cp.factory, THIS_FILE, 512, 512, NULL); 
     108    if (pool == NULL) { 
     109        app_perror("pj_pool_create()", status); 
     110        pj_caching_pool_destroy(&cp); 
     111        pj_shutdown(); 
     112        return status; 
     113    } 
     114 
     115    /* Init delay buffer */ 
     116    status = pjmedia_delay_buf_create(pool, THIS_FILE, CLOCK_RATE,  
     117                                      SAMPLES_PER_FRAME, CHANNEL_COUNT,  
     118                                      0, 0, &delaybuf); 
     119    if (status != PJ_SUCCESS) { 
     120        app_perror("pjmedia_delay_buf_create()", status); 
     121        //pj_caching_pool_destroy(&cp); 
     122        //pj_shutdown(); 
     123        //return status; 
     124    } 
    106125     
    107126    return PJ_SUCCESS; 
     
    117136    PJ_UNUSED_ARG(user_data); 
    118137    PJ_UNUSED_ARG(timestamp); 
    119     PJ_UNUSED_ARG(input); 
    120138    PJ_UNUSED_ARG(size); 
    121139 
    122     pj_memcpy(&buff_loopback[pointer_w*SAMPLES_PER_FRAME], input, size); 
     140    pjmedia_delay_buf_put(delaybuf, (pj_int16_t*)input); 
    123141 
    124142    if (size != SAMPLES_PER_FRAME*2) { 
    125143                PJ_LOG(3, (THIS_FILE, "Size captured = %u", 
    126144                           size)); 
    127                 pj_bzero(&buff_loopback[pointer_w*SAMPLES_PER_FRAME]+size/2, SAMPLES_PER_FRAME*2 - size); 
    128     } 
    129  
    130     if (++pointer_w >= LOOPBACK_BUFF_COUNT) { 
    131         pointer_w = 0; 
    132     } 
    133      
     145    } 
     146 
    134147    ++rec_cnt; 
    135148    return PJ_SUCCESS; 
     
    144157    PJ_UNUSED_ARG(user_data); 
    145158    PJ_UNUSED_ARG(timestamp); 
    146      
    147     //pj_bzero(output, size); 
    148     pj_memcpy(output, &buff_loopback[pointer_r*SAMPLES_PER_FRAME], SAMPLES_PER_FRAME*2); 
    149  
    150     if (++pointer_r >= LOOPBACK_BUFF_COUNT) { 
    151         pointer_r = 0; 
    152     } 
     159    PJ_UNUSED_ARG(size); 
     160     
     161    pjmedia_delay_buf_get(delaybuf, (pj_int16_t*)output); 
    153162     
    154163    ++play_cnt; 
     
    187196    pj_gettimeofday(&t_start); 
    188197 
     198    pjmedia_delay_buf_reset(delaybuf); 
     199 
    189200    status = pjmedia_snd_stream_start(strm); 
    190201    if (status != PJ_SUCCESS) { 
     
    195206    } 
    196207 
    197     pointer_w = LOOPBACK_BUFF_COUNT/2; 
    198     pointer_r = 0; 
    199      
    200208    return PJ_SUCCESS; 
    201209} 
     
    232240     
    233241    pjmedia_snd_deinit(); 
     242    pjmedia_delay_buf_destroy(delaybuf); 
     243    pj_pool_release(pool); 
    234244    pj_caching_pool_destroy(&cp); 
    235245    pj_shutdown(); 
     
    296306    PJ_LOG(3, (THIS_FILE, "\n\n" 
    297307            "Menu:\n" 
    298             "  b    Start bidir sound\n" 
    299             "  r    Start recorder\n" 
     308            "  a    Start bidir sound\n" 
     309            "  t    Start recorder\n" 
    300310            "  p    Start player\n" 
    301             "  c    Stop & close sound\n" 
    302             "  q    Quit\n")); 
     311            "  d    Stop & close sound\n" 
     312            "  w    Quit\n")); 
    303313} 
    304314 
     
    310320     
    311321    switch (kc) { 
    312     case 'q': 
     322    case 'w': 
    313323            asw_->AsyncStop(); 
    314324            reschedule = PJ_FALSE; 
    315325            break; 
    316     case 'b': 
     326    case 'a': 
    317327        snd_start(PJMEDIA_DIR_CAPTURE_PLAYBACK); 
    318328        break; 
    319     case 'r': 
     329    case 't': 
    320330        snd_start(PJMEDIA_DIR_CAPTURE); 
    321331        break; 
     
    323333        snd_start(PJMEDIA_DIR_PLAYBACK); 
    324334    break; 
    325     case 'c': 
     335    case 'd': 
    326336        snd_stop(); 
    327337        break; 
Note: See TracChangeset for help on using the changeset viewer.