diff --git a/daemon/t38.c b/daemon/t38.c index 492daff8a..9af838778 100644 --- a/daemon/t38.c +++ b/daemon/t38.c @@ -271,6 +271,7 @@ static bool t38_pcm_player(struct media_player *mp) { int16_t smp[80]; int num = t38_gateway_tx(tg->gw, smp, 80); if (num <= 0) { + ilog(LOG_DEBUG, "No T.38 PCM samples generated"); // use a fixed interval of 10 ms timeval_add_usec(&mp->next_run, 10000); timerthread_obj_schedule_abs(&mp->tt_obj, &mp->next_run); @@ -286,6 +287,12 @@ static bool t38_pcm_player(struct media_player *mp) { unsigned long long pts = tg->pts; tg->pts += num; + // handle fill-in + if (timeval_diff(&rtpe_now, &tg->last_rx_ts) > 30000) { + ilog(LOG_DEBUG, "Adding T.38 fill-in samples"); + t38_gateway_rx_fillin(tg->gw, 80); + } + mutex_unlock(&tg->lock); // this reschedules our player as well @@ -517,6 +524,8 @@ int t38_gateway_input_samples(struct t38_gateway *tg, int16_t amp[], int len) { ilog(LOG_WARN | LOG_FLAG_LIMIT, "%i PCM samples were not processed by the T.38 gateway", left); + tg->last_rx_ts = rtpe_now; + mutex_unlock(&tg->lock); return 0; diff --git a/include/t38.h b/include/t38.h index f12d26261..a92e8c32f 100644 --- a/include/t38.h +++ b/include/t38.h @@ -64,6 +64,9 @@ struct t38_gateway { // player for PCM data struct media_player *pcm_player; unsigned long long pts; + + // to handle PCM fill-in + struct timeval last_rx_ts; }; void t38_init(void);