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