diff options
Diffstat (limited to 'main/channel.c')
-rw-r--r-- | main/channel.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/main/channel.c b/main/channel.c index 2393b6a04..7d8792b5b 100644 --- a/main/channel.c +++ b/main/channel.c @@ -4969,10 +4969,26 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr) } /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */ - if (ast_format_cmp(&fr->subclass.format, &chan->rawwriteformat) != AST_FORMAT_CMP_NOT_EQUAL) + if (ast_format_cmp(&fr->subclass.format, &chan->rawwriteformat) != AST_FORMAT_CMP_NOT_EQUAL) { f = fr; - else + } else { + /* XXX Something is not right we are not compatible with this frame bad things can happen + * problems range from no/one-way audio to unexplained line hangups as a last resort try adjust the format + * ideally we do not want to do this and this indicates a deeper problem for now we log these events to + * eliminate user impact and help identify the problem areas + * JIRA issues related to this :- + * ASTERISK-14384, ASTERISK-17502, ASTERISK-17541, ASTERISK-18063, ASTERISK-18325, ASTERISK-18422*/ + if ((!ast_format_cap_iscompatible(chan->nativeformats, &fr->subclass.format)) && + (ast_format_cmp(&chan->writeformat, &fr->subclass.format) != AST_FORMAT_CMP_EQUAL)) { + char nf[512]; + ast_log(LOG_WARNING, "Codec mismatch on channel %s setting write format to %s from %s native formats %s\n", + chan->name, ast_getformatname(&fr->subclass.format), ast_getformatname(&chan->writeformat), + ast_getformatname_multiple(nf, sizeof(nf), chan->nativeformats)); + ast_set_write_format_by_id(chan, fr->subclass.format.id); + } + f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr; + } if (!f) { res = 0; |