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.
This commit is contained in:
Peter Schlaile 2010-12-07 12:06:14 +01:00 committed by Andreas Eversberg
parent c62fe17ee3
commit 3fd79822b1
1 changed files with 17 additions and 3 deletions

View File

@ -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;
}