MT#55283 dtmf_event_payload: canonicalise DTMF end event ts if start packet send was delayed

in some scenarios the start event ts can be before the *pts value, which
will result in a shortened DTMF event being transmitted than expected during
injection as the end event ts is calculated based on that initial dtmf start
value.
This change updates the end event ts by the amount the start ts was
behind, so that the resulting event has the right duration

Change-Id: Ia637d1e1c5d92de8b35317ec552c22eae23c0645
pull/1819/head
Tom Briden 1 year ago committed by Richard Fuchs
parent 6aa10931ad
commit c7fa81c764

@ -627,8 +627,8 @@ int dtmf_event_payload(str *buf, uint64_t *pts, uint64_t duration, struct dtmf_e
{
// do we have a relevant state change?
struct dtmf_event prev_event = *cur_event;
struct dtmf_event *ev = t_queue_peek_head(events);
while (events->length) {
struct dtmf_event *ev = t_queue_peek_head(events);
ilog(LOG_DEBUG, "Next DTMF event starts at %" PRIu64 ". PTS now %" PRIu64, ev->ts, *pts);
if (ev->ts > *pts)
break; // future event
@ -638,6 +638,14 @@ int dtmf_event_payload(str *buf, uint64_t *pts, uint64_t duration, struct dtmf_e
t_queue_pop_head(events);
*cur_event = *ev;
dtmf_event_free(ev);
ev = t_queue_peek_head(events);
if (ev && ev->code == 0 && cur_event->ts < *pts) {
// if the start event ts was before *pts we need
// to adjust the end event_ts to ensure we're not shortening
// the event
ilog(LOG_DEBUG, "Delayed send of DTMF, adjusting end event_ts by %lu - %lu = %lu", *pts, cur_event->ts, *pts - cur_event->ts);
ev->ts += *pts - cur_event->ts;
}
cur_event->ts = *pts; // canonicalise start TS
}

Loading…
Cancel
Save