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  
    109109    pa_usec_t sink_latency; 
    110110 
    111111    pa_usec_t last_rate_update; 
     112    pa_usec_t last_latency; 
    112113}; 
    113114 
    114115struct userdata { 
     
    311312 
    312313        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); 
    313314 
    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; 
    336320 
    337321        pa_assert(pa_sample_spec_valid(&s->sink_input->sample_spec)); 
    338322 
     
    346330    if (pa_memblockq_is_readable(s->memblockq) && 
    347331        s->sink_input->thread_info.underrun_for > 0) { 
    348332        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); 
    350336    } 
    351337 
    352338    return 1; 
     
    475461            PA_USEC_PER_SEC*5, 
    476462            PA_USEC_PER_SEC*2, 
    477463            TRUE, 
    478             TRUE, 
     464            FALSE, 
    479465            10, 
    480466            pa_timeval_load(&now), 
    481467            TRUE); 
    482468    s->last_rate_update = pa_timeval_load(&now); 
     469    s->last_latency = LATENCY_USEC; 
    483470    pa_atomic_store(&s->timestamp, (int) now.tv_sec); 
    484471 
    485472    if ((fd = mcast_socket((const struct sockaddr*) &sdp_info->sa, sdp_info->salen)) < 0)