summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Schlaile2010-12-07 12:06:14 +0100
committerAndreas Eversberg2010-12-13 09:13:04 +0100
commit3fd79822b115b5a4d4eb1e3c490c5e0c254c9914 (patch)
tree9c39b312962510f2b824b48948b4a321b22ebe77
parentSee commit 728d... It was not applied correctly. (diff)
downloadlcr-3fd79822b115b5a4d4eb1e3c490c5e0c254c9914.tar.gz
lcr-3fd79822b115b5a4d4eb1e3c490c5e0c254c9914.tar.xz
lcr-3fd79822b115b5a4d4eb1e3c490c5e0c254c9914.zip
Workaround for "noise" problems with app_rxfax in current LCR.
The problem: for some reason, asterisk silently switches write_format from SLINEAR to ALAW when using app_rxfax, thereby effectively disabling automatic conversion SLINEAR->ALAW and thereby breaking app_rxfax after the first call to ast_write(). Read: instantly, after the first data frame. Older versions of LCR work flawlessly, until we find out, what really triggers the problem, we at least switch the channel back, since it never makes sense to send something different than ALAW to chan_lcr.
-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;
}