#define HAVE_ATTRIBUTE_always_inline 1
#define HAVE_ARPA_INET_H 1
#define HAVE_TIMERSUB 1
+#define HAVE_STRTOQ 1
+#define HAVE_INET_ATON 1
#include <asterisk/compiler.h>
#ifdef LCR_FOR_ASTERISK
ast_dsp_set_features(call->dsp, DSP_FEATURE_DTMF_DETECT| DSP_FEATURE_FAX_CNG_DETECT);
#endif
#ifdef LCR_FOR_ASTERISK
+ #ifdef DSP_FEATURE_DTMF_DETECT
ast_dsp_set_features(call->dsp, DSP_FEATURE_DTMF_DETECT| DSP_FEATURE_FAX_DETECT);
+ #else
+ ast_dsp_set_features(call->dsp, DSP_FEATURE_DIGIT_DETECT| DSP_FEATURE_FAX_DETECT);
+ #endif
+
#endif
if (!call->trans)
#ifdef LCR_FOR_CALLWEAVER
memcpy(&call->connectinfo, ¶m->connectinfo, sizeof(struct connect_info));
/* queue event to asterisk */
if (call->ast && call->pbx_started)
- strncat(call->queue_string, "A", sizeof(call->queue_string)-1);
+ strncat(call->queue_string, "N", sizeof(call->queue_string)-1);
}
/*
}
/*
+ * incoming pattern from LCR
+ */
+static void lcr_in_pattern(struct chan_call *call, int message_type, union parameter *param)
+{
+ union parameter newparam;
+
+ CDEBUG(call, call->ast, "Incomming pattern indication from LCR.\n");
+
+ if (!call->ast) return;
+
+ /* pattern are indicated only once */
+ if (call->has_pattern)
+ return;
+ call->has_pattern = 1;
+
+ /* request bchannel */
+ if (!call->bchannel) {
+ CDEBUG(call, call->ast, "Requesting B-channel.\n");
+ memset(&newparam, 0, sizeof(union parameter));
+ newparam.bchannel.type = BCHANNEL_REQUEST;
+ send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
+ }
+ /* queue PROGRESS, because tones are available */
+ if (call->ast && call->pbx_started)
+ strncat(call->queue_string, "T", sizeof(call->queue_string)-1);
+}
+
+/*
* got dtmf from bchannel (locked state)
*/
void lcr_in_dtmf(struct chan_call *call, int val)
break;
case MESSAGE_PATTERN: // audio available from LCR
+ if (!call->has_pattern)
+ lcr_in_pattern(call, message_type, param);
break;
case MESSAGE_NOPATTERN: // audio not available from LCR
if (!ast_channel_trylock(ast)) { /* succeed */
while(*p) {
switch (*p) {
+ case 'T':
+ CDEBUG(call, ast, "Sending queued PROGRESS to Asterisk.\n");
+ ast_queue_control(ast, AST_CONTROL_PROGRESS);
+ break;
case 'P':
CDEBUG(call, ast, "Sending queued PROCEEDING to Asterisk.\n");
ast_queue_control(ast, AST_CONTROL_PROCEEDING);
ast_queue_control(ast, AST_CONTROL_RINGING);
ast_setstate(ast, AST_STATE_RINGING);
break;
- case 'A':
+ case 'N':
CDEBUG(call, ast, "Sending queued ANSWER to Asterisk.\n");
ast_queue_control(ast, AST_CONTROL_ANSWER);
break;
CDEBUG(call, ast, "Sending queued HANGUP to Asterisk.\n");
ast_queue_hangup(ast);
break;
- case '1': case '2': case '3': case 'a':
- case '4': case '5': case '6': case 'b':
- case '7': case '8': case '9': case 'c':
- case '*': case '0': case '#': case 'd':
+ case '1': case '2': case '3': case 'A':
+ case '4': case '5': case '6': case 'B':
+ case '7': case '8': case '9': case 'C':
+ case '*': case '0': case '#': case 'D':
CDEBUG(call, ast, "Sending queued digit '%c' to Asterisk.\n", *p);
/* send digit to asterisk */
memset(&fr, 0, sizeof(fr));
break;
default:
- CDEBUG(call, ast, "Ignoring queued digit 0x%02d.\n", *p);
+ CDEBUG(call, ast, "Ignoring queued digit 0x%02x.\n", *p);
}
p++;
}
return -1;
}
if (call->bchannel && f->samples)
- bchannel_transmit(call->bchannel, (unsigned char *)f->data, f->samples);
+ bchannel_transmit(call->bchannel, *((unsigned char **)&(f->data)), f->samples);
ast_mutex_unlock(&chan_lock);
return 0;
}
call->state = CHAN_LCR_STATE_IN_ALERTING;
}
break;
+ case AST_CONTROL_PROGRESS:
+ CDEBUG(call, ast, "Received indicate AST_CONTROL_PROGRESS from Asterisk.\n");
+ /* request bchannel */
+ if (!call->bchannel) {
+ CDEBUG(call, ast, "Requesting B-channel.\n");
+ memset(&newparam, 0, sizeof(union parameter));
+ newparam.bchannel.type = BCHANNEL_REQUEST;
+ send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
+ }
+ break;
case -1:
CDEBUG(call, ast, "Received indicate -1.\n");
res = -1;
if (read_options() == 0) {
CERROR(NULL, NULL, "%s", options_error);
- #ifdef LCR_FOR_ASTERISK || ASTERISK_1_6
+ #ifdef LCR_FOR_ASTERISK
return AST_MODULE_LOAD_DECLINE;
#endif