Ignore:
Timestamp:
Jun 4, 2009 6:48:49 PM (15 years ago)
Author:
nanang
Message:

Ticket #879:

  • Added pjmedia synchronizer port.
  • Updated affected components, i.e: sound port, AEC, conference bridge.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/echo_common.c

    r2728 r2747  
    2020 
    2121#include <pjmedia/echo.h> 
    22 #include <pjmedia/delaybuf.h> 
    2322#include <pjmedia/errno.h> 
    2423#include <pj/assert.h> 
     
    5150    struct frame     lat_buf;       /* Frame queue for delayed playback     */ 
    5251    struct frame     lat_free;      /* Free frame list.                     */ 
    53  
    54     pjmedia_delay_buf   *delay_buf; 
    5552}; 
    5653 
     
    147144    pjmedia_echo_state *ec; 
    148145    pj_status_t status; 
     146    unsigned i; 
    149147 
    150148    /* Create new pool and instantiate and init the EC */ 
     
    192190    /* Create latency buffers */ 
    193191    ptime = samples_per_frame * 1000 / clock_rate; 
    194     if (latency_ms == 0) { 
    195         /* Give at least one frame delay to simplify programming */ 
     192    /* Give at least one frame delay to simplify programming */ 
     193    if (latency_ms < ptime) { 
    196194        latency_ms = ptime; 
    197195    } 
    198196    ec->lat_target_cnt = latency_ms / ptime; 
    199     if (ec->lat_target_cnt != 0) { 
    200         unsigned i; 
    201         for (i=0; i < ec->lat_target_cnt; ++i)  { 
    202             struct frame *frm; 
    203  
    204             frm = (struct frame*) pj_pool_alloc(pool, (samples_per_frame<<1) + 
    205                                                       sizeof(struct frame)); 
    206             pj_list_push_back(&ec->lat_free, frm); 
    207         } 
    208     } else { 
    209         ec->lat_ready = PJ_TRUE; 
    210     } 
    211  
    212     /* Create delay buffer to compensate drifts */ 
    213     status = pjmedia_delay_buf_create(ec->pool, ec->obj_name, clock_rate,  
    214                                       samples_per_frame, channel_count, 
    215                                       (PJMEDIA_SOUND_BUFFER_COUNT+1) * ptime, 
    216                                       0, &ec->delay_buf); 
    217     if (status != PJ_SUCCESS) { 
    218         pj_pool_release(pool); 
    219         return status; 
     197    for (i=0; i < ec->lat_target_cnt; ++i)  { 
     198        struct frame *frm; 
     199 
     200        frm = (struct frame*) pj_pool_alloc(pool, (samples_per_frame<<1) + 
     201                                                  sizeof(struct frame)); 
     202        pj_list_push_back(&ec->lat_free, frm); 
    220203    } 
    221204 
     
    241224    (*echo->op->ec_destroy)(echo->state); 
    242225 
    243     if (echo->delay_buf) { 
    244         pjmedia_delay_buf_destroy(echo->delay_buf); 
    245         echo->delay_buf = NULL; 
    246     } 
    247  
    248226    pj_pool_release(echo->pool); 
    249227    return PJ_SUCCESS; 
     
    263241    } 
    264242    echo->lat_ready = PJ_FALSE; 
    265     pjmedia_delay_buf_reset(echo->delay_buf); 
    266243    echo->op->ec_reset(echo->state); 
    267244    return PJ_SUCCESS; 
     
    275252                                           pj_int16_t *play_frm ) 
    276253{ 
    277     if (!echo->lat_ready) { 
     254    struct frame *frm; 
     255 
     256    if (echo->lat_ready) { 
     257        frm = echo->lat_buf.next; 
     258        pj_list_erase(frm); 
     259    } else { 
    278260        /* We've not built enough latency in the buffer, so put this frame 
    279261         * in the latency buffer list. 
    280262         */ 
    281         struct frame *frm; 
    282  
     263        frm = echo->lat_free.prev; 
     264        pj_list_erase(frm); 
    283265        if (pj_list_empty(&echo->lat_free)) { 
    284266            echo->lat_ready = PJ_TRUE; 
    285267            PJ_LOG(5,(echo->obj_name, "Latency bufferring complete")); 
    286             pjmedia_delay_buf_put(echo->delay_buf, play_frm); 
    287             return PJ_SUCCESS; 
    288268        } 
    289              
    290         frm = echo->lat_free.prev; 
    291         pj_list_erase(frm); 
    292  
    293         pjmedia_copy_samples(frm->buf, play_frm, echo->samples_per_frame); 
    294         pj_list_push_back(&echo->lat_buf, frm); 
    295  
    296     } else { 
    297         /* Latency buffer is ready (full), so we put this frame in the 
    298          * delay buffer. 
    299          */ 
    300         pjmedia_delay_buf_put(echo->delay_buf, play_frm); 
    301     } 
     269    } 
     270 
     271    /* Put the incoming frame into the end of latency buffer */ 
     272    pjmedia_copy_samples(frm->buf, play_frm, echo->samples_per_frame); 
     273    pj_list_push_back(&echo->lat_buf, frm); 
    302274 
    303275    return PJ_SUCCESS; 
     
    314286{ 
    315287    struct frame *oldest_frm; 
    316     pj_status_t status, rc; 
     288    pj_status_t status; 
    317289 
    318290    if (!echo->lat_ready) { 
     
    324296    /* Retrieve oldest frame from the latency buffer */ 
    325297    oldest_frm = echo->lat_buf.next; 
    326     pj_list_erase(oldest_frm); 
    327298 
    328299    /* Cancel echo using this reference frame */ 
     
    330301                                 options, NULL); 
    331302 
    332     /* Move one frame from delay buffer to the latency buffer. */ 
    333     rc = pjmedia_delay_buf_get(echo->delay_buf, oldest_frm->buf); 
    334     if (rc != PJ_SUCCESS) { 
    335         /* Ooops.. no frame! */ 
    336         PJ_LOG(5,(echo->obj_name,  
    337                   "No frame from delay buffer. This will upset EC later")); 
    338         pjmedia_zero_samples(oldest_frm->buf, echo->samples_per_frame); 
    339     } 
    340     pj_list_push_back(&echo->lat_buf, oldest_frm); 
    341      
    342303    return status; 
    343304} 
Note: See TracChangeset for help on using the changeset viewer.