From 35740cda35c8ef66d79fded8e1376c6dec50ba8a Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 16 Aug 2019 09:56:27 -0400 Subject: [PATCH] TT#64259 add function to inject DTMF events Change-Id: Ie84e2e8cad11e686c6e7010ca78ecba37c5dbf7e --- daemon/codec.c | 13 +++++++++---- include/codec.h | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index f1314b621..266c04154 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -1231,12 +1231,17 @@ static struct ssrc_entry *__ssrc_handler_new(void *p) { static void __dtmf_dsp_callback(void *ptr, int code, int level, int delay) { struct codec_ssrc_handler *ch = ptr; + uint64_t ts = ch->last_dtmf_event_ts + delay; + ch->last_dtmf_event_ts = ts; + ts = av_rescale(ts, ch->encoder_format.clockrate, ch->dtmf_format.clockrate); + codec_add_dtmf_event(ch, code, level, ts); +} + +void codec_add_dtmf_event(struct codec_ssrc_handler *ch, int code, int level, uint64_t ts) { struct dtmf_event *ev = g_slice_alloc(sizeof(*ev)); - *ev = (struct dtmf_event) { .code = code, .volume = level, .ts = ch->last_dtmf_event_ts + delay }; - ch->last_dtmf_event_ts = ev->ts; - ev->ts = av_rescale(ev->ts, ch->encoder_format.clockrate, ch->dtmf_format.clockrate); + *ev = (struct dtmf_event) { .code = code, .volume = level, .ts = ts }; ilog(LOG_DEBUG, "DTMF event state change: code %i, volume %i, TS %lu", - ev->code, ev->volume, (unsigned long) ev->ts); + ev->code, ev->volume, (unsigned long) ts); g_queue_push_tail(&ch->dtmf_events, ev); } diff --git a/include/codec.h b/include/codec.h index 82d23e2a0..7d9db6ce6 100644 --- a/include/codec.h +++ b/include/codec.h @@ -74,6 +74,7 @@ void __rtp_payload_type_add_send(struct call_media *other_media, struct rtp_payl #ifdef WITH_TRANSCODING void codec_handlers_update(struct call_media *receiver, struct call_media *sink, const struct sdp_ng_flags *); +void codec_add_dtmf_event(struct codec_ssrc_handler *ch, int code, int level, uint64_t ts); #else