[asterisk-commits] irroot: branch irroot/t38gateway-1.8 r338949 - /team/irroot/t38gateway-1.8/res/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sun Oct 2 17:37:34 CDT 2011
Author: irroot
Date: Sun Oct 2 17:37:31 2011
New Revision: 338949
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=338949
Log:
Remove WaitFAX application its not needed
Remove locking its not needed
Remove gateway caps on turning off faxgateway
Modified:
team/irroot/t38gateway-1.8/res/res_fax.c
Modified: team/irroot/t38gateway-1.8/res/res_fax.c
URL: http://svnview.digium.com/svn/asterisk/team/irroot/t38gateway-1.8/res/res_fax.c?view=diff&rev=338949&r1=338948&r2=338949
==============================================================================
--- team/irroot/t38gateway-1.8/res/res_fax.c (original)
+++ team/irroot/t38gateway-1.8/res/res_fax.c Sun Oct 2 17:37:31 2011
@@ -222,33 +222,10 @@
<ref type="application">SendFax</ref>
</see-also>
</function>
- <application name="WaitFAX" language="en_US">
- <synopsis>
- Generic Fax Detect CNG/T.38 (Wait For Fax)
- </synopsis>
- <syntax>
- <parameter name="timeout" required="true">
- <para>Specifies the number of seconds we attempt to detect a fax tone on the channel</para>
- </parameter>
- <parameter name="tone" required="false">
- <para>Either the tone name defined in the "indications.conf" configuration file,
- or a directly specified list of frequencies and durations.</para>
- <para>If not specified silence is generated.</para>
- </parameter>
- <parameter name="noise" required="false">
- <para>Number of ms noise detected before proceeding with the dialplan.</para>
- </parameter>
- </syntax>
- <description>
- <para>This application sets FAXOPT(status) To SUCCESS | FAILURE | ERROR</para>
- <para>FAXOPT(statusstr) will be set to CNG | T38 on SUCCESS or reason on FAILURE | ERROR</para>
- </description>
- </application>
***/
static const char app_receivefax[] = "ReceiveFAX";
static const char app_sendfax[] = "SendFAX";
-static const char app_waitfax[] = "WaitFAX";
struct debug_info_history {
unsigned int consec_frames;
@@ -3223,12 +3200,8 @@
}
ast_dsp_set_features(faxdetect->dsp, DSP_FEATURE_FAX_DETECT);
- if (noiselim) {
- ast_dsp_set_faxmode(faxdetect->dsp, dsp_detect_flag || DSP_FAXMODE_DETECT_SQUELCH);
- ast_dsp_set_threshold(faxdetect->dsp, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE));
- } else {
- ast_dsp_set_faxmode(faxdetect->dsp, dsp_detect_flag);
- }
+ ast_dsp_set_faxmode(faxdetect->dsp, dsp_detect_flag || DSP_FAXMODE_DETECT_SQUELCH);
+ ast_dsp_set_threshold(faxdetect->dsp, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE));
return faxdetect;
}
@@ -3263,7 +3236,6 @@
switch (event) {
case AST_FRAMEHOOK_EVENT_ATTACHED:
/* Setup format for DSP on ATTACH*/
- ao2_lock(faxdetect);
faxdetect->orig_format = chan->readformat;
switch (chan->readformat) {
case AST_FORMAT_SLINEAR:
@@ -3272,18 +3244,16 @@
if (ast_set_read_format(chan, AST_FORMAT_SLINEAR)) {
ast_framehook_detach(chan, details->faxdetect_id);
details->faxdetect_id = -1;
+ return f;
}
}
- ao2_unlock(faxdetect);
return NULL;
case AST_FRAMEHOOK_EVENT_DETACHED:
/* restore audio formats when we are detached */
- ao2_lock(faxdetect);
ast_set_read_format(chan, faxdetect->orig_format);
if ((peer = ast_bridged_channel(chan))) {
ast_channel_make_compatible(chan, peer);
}
- ao2_unlock(faxdetect);
return NULL;
case AST_FRAMEHOOK_EVENT_READ:
if (f) {
@@ -3292,11 +3262,16 @@
default:
return f;
};
+
+ if (details->faxdetect_id < 0) {
+ return f;
+ }
if ((!ast_tvzero(faxdetect->timeout_start) &&
(ast_tvdiff_ms(ast_tvnow(), faxdetect->timeout_start) > faxdetect->timeout))) {
ast_framehook_detach(chan, details->faxdetect_id);
details->faxdetect_id = -1;
+ return f;
}
/* only handle VOICE and CONTROL frames*/
@@ -3319,7 +3294,6 @@
return f;
}
- ao2_lock(faxdetect);
if (f->frametype == AST_FRAME_VOICE) {
f = ast_dsp_process(chan, faxdetect->dsp, f);
if (f->frametype == AST_FRAME_DTMF) {
@@ -3369,8 +3343,6 @@
details->faxdetect_id = -1;
}
- ao2_unlock(faxdetect);
-
return f;
}
@@ -3420,170 +3392,6 @@
ao2_ref(faxdetect, 1);
return faxdetect;
}
-
-/*! \brief Faxdetect loop used by WaitFAX
- * \details Run DSP faxdetect on the channel for timeout seconds or until fax is detected
- * \param chan channel to run fax detect on
- * \param timeout maximum time to wait for fax detection
- * \return 0 if nothing was detected 1 on CNG detected 2 if T38 negotiation is started -1 on error*/
-static int do_waitfax_exec(struct ast_channel *chan, int timeout, int noiselim)
-{
- int timeleft = timeout;
- int res = 0;
- struct ast_frame *f, *dup_f;
- AST_LIST_HEAD_NOLOCK(, ast_frame) deferred_frames;
- struct fax_detect *faxdetect = NULL;
-
- if (!(faxdetect = fax_detect_attach(chan, 0, noiselim, DSP_FAXMODE_DETECT_CNG))) {
- return -1;
- }
-
- AST_LIST_HEAD_INIT_NOLOCK(&deferred_frames);
-
- while ((timeleft = ast_waitfor(chan, timeleft))) {
- if (!(f = ast_read(chan))) {
- break;
- }
-
- ao2_lock(faxdetect);
- switch (faxdetect->result) {
- case 'f':
- res = 1;
- break;
- case 't':
- res = 2;
- break;
- case 'n':
- break;
- }
- ao2_unlock(faxdetect);
-
- if (ast_is_deferrable_frame(f)) {
- AST_LIST_INSERT_HEAD(&deferred_frames, f, frame_list);
- } else {
- ast_frfree(f);
- }
-
- if (res) {
- break;
- }
- }
- ao2_ref(faxdetect, -1);
-
- ast_channel_lock(chan);
- while ((f = AST_LIST_REMOVE_HEAD(&deferred_frames, frame_list))) {
- dup_f = ast_frisolate(f);
- ast_queue_frame_head(chan, dup_f);
- if (dup_f != f) {
- ast_frfree(f);
- }
- }
- ast_channel_unlock(chan);
-
- return res;
-}
-
-/*! \brief Alternate wait app that listens for CNG
- * \details This app answers the channel and waits for CNG tone or T38 negotiation
- * if the channel driver supports faxdetect it will proceed to the fax
- * extension.
- * it will set FAXOPT(status) and FAXOPT(statusstr) allowing dial plan processing where
- * the channel does not have fax detect or the Dialplan needs to handle faxdetection
- *
- * \param chan channel this application is called on
- * \param data the paramaters passed to the application
- * \return this application will always return 0
- */
-static int waitfax_exec(struct ast_channel *chan, const char *data)
-{
- int res = 0;
- unsigned int timeout;
- unsigned int noiselim;
- int ptres = -1;
- char *parse;
- struct ast_fax_session_details *details;
- struct ast_silence_generator *silgen = NULL;
- struct ast_tone_zone_sound *ts;
-
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(timeout);
- AST_APP_ARG(tone);
- AST_APP_ARG(noise);
- );
-
- if (!(details = find_or_create_details(chan))) {
- ast_log(LOG_ERROR, "System cannot provide memory for session requirements.\n");
- return 0;
- }
-
- parse = ast_strdupa(data);
- AST_STANDARD_APP_ARGS(args, parse);
-
- if (!ast_strlen_zero(args.timeout) && sscanf(args.timeout, "%u", &timeout) == 1) {
- timeout = timeout * 1000;
- } else {
- timeout = 0;
- }
-
- if (timeout <= 0) {
- ast_string_field_set(details, result, "ERROR");
- ast_string_field_set(details, resultstr, "Invalid timeout in WaitFAX");
- ast_log(LOG_ERROR, "Application WaitFAX requires a valid timeout\n");
- ao2_ref(details, -1);
- return 0;
- }
-
- if (ast_strlen_zero(args.noise) || sscanf(args.noise, "%u", &noiselim) != 1) {
- noiselim = 0;
- }
-
- if (chan->_state != AST_STATE_UP) {
- ast_answer(chan);
- }
-
- /* If no other generator is present, start tone or silencegen while waiting */
- if (!chan->generatordata && !ast_strlen_zero(args.tone)) {
- if ((ts = ast_get_indication_tone(chan->zone, args.tone))) {
- ptres = ast_playtones_start(chan, 0, ts->data, 0);
- ts = ast_tone_zone_sound_unref(ts);
- } else {
- ptres = ast_playtones_start(chan, 0, args.tone, 0);
- }
- if (!ptres && ast_opt_transmit_silence) {
- silgen = ast_channel_start_silence_generator(chan);
- }
- } else if (ast_opt_transmit_silence && !chan->generatordata) {
- silgen = ast_channel_start_silence_generator(chan);
- }
-
- res = do_waitfax_exec(chan, timeout, noiselim);
-
- /* stop silgen or tones if present */
- if (silgen) {
- ast_channel_stop_silence_generator(chan, silgen);
- } else if (!ptres) {
- ast_playtones_stop(chan);
- }
-
- if (res > 0) {
- ast_string_field_set(details, result, "SUCCESS");
- if (res == 1) {
- ast_string_field_set(details, resultstr, "CNG");
- } else {
- ast_string_field_set(details, resultstr, "T38");
- }
- } else if (res < 0) {
- ast_string_field_set(details, result, "ERROR");
- ast_string_field_set(details, resultstr, "DSP Error WaitFAX Failed");
- } else {
- ast_string_field_set(details, result, "FAILED");
- ast_string_field_set(details, resultstr, "No CNG Tone Or T38 Detected");
- }
-
- ao2_ref(details, -1);
- return 0;
-}
-
/*! \brief hash callback for ao2 */
static int session_hash_cb(const void *obj, const int flags)
@@ -3986,6 +3794,8 @@
} else if (!strcasecmp(data, "t38gateway") || !strcasecmp(data, "gateway") ||
!strcasecmp(data, "t38_gateway") || !strcasecmp(data, "faxgateway")) {
ast_copy_string(buf, details->gateway_id != -1 ? "yes" : "no", len);
+ } else if (!strcasecmp(data, "faxdetect")) {
+ ast_copy_string(buf, details->faxdetect_id != -1 ? "yes" : "no", len);
} else if (!strcasecmp(data, "error")) {
ast_copy_string(buf, details->error, len);
} else if (!strcasecmp(data, "filename")) {
@@ -4094,6 +3904,7 @@
} else if (ast_false(val)) {
ast_framehook_detach(chan, details->gateway_id);
details->gateway_id = -1;
+ details->caps &= ~AST_FAX_TECH_GATEWAY;
} else {
ast_log(LOG_WARNING, "Unsupported value '%s' passed to FAXOPT(%s).\n", value, data);
}
@@ -4181,10 +3992,6 @@
ast_log(LOG_WARNING, "failed to unregister '%s'\n", app_receivefax);
}
- if (ast_unregister_application(app_waitfax) < 0) {
- ast_log(LOG_WARNING, "failed to unregister '%s'\n", app_waitfax);
- }
-
if (fax_logger_level != -1) {
ast_logger_unregister_level("FAX");
}
@@ -4225,10 +4032,6 @@
return AST_MODULE_LOAD_DECLINE;
}
- if (ast_register_application_xml(app_waitfax, waitfax_exec) < 0) {
- ast_log(LOG_WARNING, "failed to register '%s'.\n", app_waitfax);
- }
-
ast_cli_register_multiple(fax_cli, ARRAY_LEN(fax_cli));
res = ast_custom_function_register(&acf_faxopt);
fax_logger_level = ast_logger_register_level("FAX");
More information about the asterisk-commits
mailing list