Ignore:
Timestamp:
Jun 7, 2009 4:49:42 PM (10 years ago)
Author:
nanang
Message:

Ticket #879: Reverted back changes in r2747, r2748, r2751.

File:
1 edited

Legend:

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

    r2747 r2755  
    2020 
    2121#include <pjmedia/echo.h> 
     22#include <pjmedia/delaybuf.h> 
    2223#include <pjmedia/errno.h> 
    2324#include <pj/assert.h> 
     
    5051    struct frame     lat_buf;       /* Frame queue for delayed playback     */ 
    5152    struct frame     lat_free;      /* Free frame list.                     */ 
     53 
     54    pjmedia_delay_buf   *delay_buf; 
    5255}; 
    5356 
     
    144147    pjmedia_echo_state *ec; 
    145148    pj_status_t status; 
    146     unsigned i; 
    147149 
    148150    /* Create new pool and instantiate and init the EC */ 
     
    190192    /* Create latency buffers */ 
    191193    ptime = samples_per_frame * 1000 / clock_rate; 
    192     /* Give at least one frame delay to simplify programming */ 
    193     if (latency_ms < ptime) { 
     194    if (latency_ms == 0) { 
     195        /* Give at least one frame delay to simplify programming */ 
    194196        latency_ms = ptime; 
    195197    } 
    196198    ec->lat_target_cnt = latency_ms / ptime; 
    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); 
     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; 
    203220    } 
    204221 
     
    224241    (*echo->op->ec_destroy)(echo->state); 
    225242 
     243    if (echo->delay_buf) { 
     244        pjmedia_delay_buf_destroy(echo->delay_buf); 
     245        echo->delay_buf = NULL; 
     246    } 
     247 
    226248    pj_pool_release(echo->pool); 
    227249    return PJ_SUCCESS; 
     
    241263    } 
    242264    echo->lat_ready = PJ_FALSE; 
     265    pjmedia_delay_buf_reset(echo->delay_buf); 
    243266    echo->op->ec_reset(echo->state); 
    244267    return PJ_SUCCESS; 
     
    252275                                           pj_int16_t *play_frm ) 
    253276{ 
    254     struct frame *frm; 
    255  
    256     if (echo->lat_ready) { 
    257         frm = echo->lat_buf.next; 
    258         pj_list_erase(frm); 
    259     } else { 
     277    if (!echo->lat_ready) { 
    260278        /* We've not built enough latency in the buffer, so put this frame 
    261279         * in the latency buffer list. 
    262280         */ 
    263         frm = echo->lat_free.prev; 
    264         pj_list_erase(frm); 
     281        struct frame *frm; 
     282 
    265283        if (pj_list_empty(&echo->lat_free)) { 
    266284            echo->lat_ready = PJ_TRUE; 
    267285            PJ_LOG(5,(echo->obj_name, "Latency bufferring complete")); 
     286            pjmedia_delay_buf_put(echo->delay_buf, play_frm); 
     287            return PJ_SUCCESS; 
    268288        } 
    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); 
     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    } 
    274302 
    275303    return PJ_SUCCESS; 
     
    286314{ 
    287315    struct frame *oldest_frm; 
    288     pj_status_t status; 
     316    pj_status_t status, rc; 
    289317 
    290318    if (!echo->lat_ready) { 
     
    296324    /* Retrieve oldest frame from the latency buffer */ 
    297325    oldest_frm = echo->lat_buf.next; 
     326    pj_list_erase(oldest_frm); 
    298327 
    299328    /* Cancel echo using this reference frame */ 
     
    301330                                 options, NULL); 
    302331 
     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     
    303342    return status; 
    304343} 
Note: See TracChangeset for help on using the changeset viewer.