Changeset 2747 for pjproject/trunk/pjmedia/src/pjmedia/echo_common.c
- Timestamp:
- Jun 4, 2009 6:48:49 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia/echo_common.c
r2728 r2747 20 20 21 21 #include <pjmedia/echo.h> 22 #include <pjmedia/delaybuf.h>23 22 #include <pjmedia/errno.h> 24 23 #include <pj/assert.h> … … 51 50 struct frame lat_buf; /* Frame queue for delayed playback */ 52 51 struct frame lat_free; /* Free frame list. */ 53 54 pjmedia_delay_buf *delay_buf;55 52 }; 56 53 … … 147 144 pjmedia_echo_state *ec; 148 145 pj_status_t status; 146 unsigned i; 149 147 150 148 /* Create new pool and instantiate and init the EC */ … … 192 190 /* Create latency buffers */ 193 191 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) { 196 194 latency_ms = ptime; 197 195 } 198 196 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); 220 203 } 221 204 … … 241 224 (*echo->op->ec_destroy)(echo->state); 242 225 243 if (echo->delay_buf) {244 pjmedia_delay_buf_destroy(echo->delay_buf);245 echo->delay_buf = NULL;246 }247 248 226 pj_pool_release(echo->pool); 249 227 return PJ_SUCCESS; … … 263 241 } 264 242 echo->lat_ready = PJ_FALSE; 265 pjmedia_delay_buf_reset(echo->delay_buf);266 243 echo->op->ec_reset(echo->state); 267 244 return PJ_SUCCESS; … … 275 252 pj_int16_t *play_frm ) 276 253 { 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 { 278 260 /* We've not built enough latency in the buffer, so put this frame 279 261 * in the latency buffer list. 280 262 */ 281 struct frame *frm;282 263 frm = echo->lat_free.prev; 264 pj_list_erase(frm); 283 265 if (pj_list_empty(&echo->lat_free)) { 284 266 echo->lat_ready = PJ_TRUE; 285 267 PJ_LOG(5,(echo->obj_name, "Latency bufferring complete")); 286 pjmedia_delay_buf_put(echo->delay_buf, play_frm);287 return PJ_SUCCESS;288 268 } 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); 302 274 303 275 return PJ_SUCCESS; … … 314 286 { 315 287 struct frame *oldest_frm; 316 pj_status_t status , rc;288 pj_status_t status; 317 289 318 290 if (!echo->lat_ready) { … … 324 296 /* Retrieve oldest frame from the latency buffer */ 325 297 oldest_frm = echo->lat_buf.next; 326 pj_list_erase(oldest_frm);327 298 328 299 /* Cancel echo using this reference frame */ … … 330 301 options, NULL); 331 302 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 342 303 return status; 343 304 }
Note: See TracChangeset
for help on using the changeset viewer.