summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chan_lcr.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/chan_lcr.c b/chan_lcr.c
index 25515d0..f4d8378 100644
--- a/chan_lcr.c
+++ b/chan_lcr.c
@@ -2172,24 +2172,38 @@ static int lcr_hangup(struct ast_channel *ast)
return 0;
}
-static int lcr_write(struct ast_channel *ast, struct ast_frame *f)
+static int lcr_write(struct ast_channel *ast, struct ast_frame *fr)
{
struct chan_call *call;
+ struct ast_frame * f = fr;
if (!f->subclass)
CDEBUG(NULL, ast, "No subclass\n");
- if (!(f->subclass & ast->nativeformats))
- CDEBUG(NULL, ast, "Unexpected format.\n");
+ if (!(f->subclass & ast->nativeformats)) {
+ CDEBUG(NULL, ast,
+ "Unexpected format. "
+ "Activating emergency conversion...\n");
+
+ ast_set_write_format(ast, f->subclass);
+ f = (ast->writetrans) ? ast_translate(
+ ast->writetrans, fr, 0) : fr;
+ }
ast_mutex_lock(&chan_lock);
call = ast->tech_pvt;
if (!call) {
ast_mutex_unlock(&chan_lock);
+ if (f != fr) {
+ ast_frfree(f);
+ }
return -1;
}
if (call->bchannel && f->samples)
bchannel_transmit(call->bchannel, *((unsigned char **)&(f->data)), f->samples);
ast_mutex_unlock(&chan_lock);
+ if (f != fr) {
+ ast_frfree(f);
+ }
return 0;
}