Ticket #477: module-rtp-recv.patch
| File module-rtp-recv.patch, 3.2 KB (added by mkbosmans, 16 months ago) |
|---|
-
src/modules/rtp/module-rtp-recv.c
diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c index 7635a80..754bfd8 100644
a b 109 109 pa_usec_t sink_latency; 110 110 111 111 pa_usec_t last_rate_update; 112 pa_usec_t last_latency; 112 113 }; 113 114 114 115 struct userdata { … … 311 312 312 313 pa_log_debug("Write index deviates by %0.2f ms, expected %0.2f ms", (double) latency/PA_USEC_PER_MSEC, (double) s->intended_latency/PA_USEC_PER_MSEC); 313 314 314 /* Calculate deviation */ 315 if (latency < s->intended_latency) 316 fix = s->intended_latency - latency; 317 else 318 fix = latency - s->intended_latency; 319 320 /* How many samples is this per second? */ 321 fix_samples = (unsigned) (fix * (pa_usec_t) s->sink_input->thread_info.sample_spec.rate / (pa_usec_t) RATE_UPDATE_INTERVAL); 322 323 /* Check if deviation is in bounds */ 324 if (fix_samples > s->sink_input->sample_spec.rate*.50) 325 pa_log_debug("Hmmm, rate fix is too large (%lu Hz), not applying.", (unsigned long) fix_samples); 326 else { 327 /* Fix up rate */ 328 if (latency < s->intended_latency) 329 s->sink_input->sample_spec.rate -= fix_samples; 330 else 331 s->sink_input->sample_spec.rate += fix_samples; 332 333 if (s->sink_input->sample_spec.rate > PA_RATE_MAX) 334 s->sink_input->sample_spec.rate = PA_RATE_MAX; 335 } 315 /* This is where the magic happens */ 316 s->sink_input->sample_spec.rate = PA_CLAMP((uint32_t) ( ((double) RATE_UPDATE_INTERVAL - 0.4 * ((double) s->intended_latency - (double) latency)) 317 / (double) (RATE_UPDATE_INTERVAL + s->last_latency - latency) * (double) s->sink_input->sample_spec.rate ), 318 s->sink_input->sample_spec.rate-96, s->sink_input->sample_spec.rate+96); 319 s->last_latency = latency; 336 320 337 321 pa_assert(pa_sample_spec_valid(&s->sink_input->sample_spec)); 338 322 … … 346 330 if (pa_memblockq_is_readable(s->memblockq) && 347 331 s->sink_input->thread_info.underrun_for > 0) { 348 332 pa_log_debug("Requesting rewind due to end of underrun"); 349 pa_sink_input_request_rewind(s->sink_input, 0, FALSE, TRUE, FALSE); 333 pa_sink_input_request_rewind(s->sink_input, 334 (size_t) (s->sink_input->thread_info.underrun_for == (uint64_t) -1 ? 0 : s->sink_input->thread_info.underrun_for), 335 FALSE, TRUE, FALSE); 350 336 } 351 337 352 338 return 1; … … 475 461 PA_USEC_PER_SEC*5, 476 462 PA_USEC_PER_SEC*2, 477 463 TRUE, 478 TRUE,464 FALSE, 479 465 10, 480 466 pa_timeval_load(&now), 481 467 TRUE); 482 468 s->last_rate_update = pa_timeval_load(&now); 469 s->last_latency = LATENCY_USEC; 483 470 pa_atomic_store(&s->timestamp, (int) now.tv_sec); 484 471 485 472 if ((fd = mcast_socket((const struct sockaddr*) &sdp_info->sa, sdp_info->salen)) < 0)
