mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-08-14 01:49:05 +00:00
update
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@192 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
@@ -41,7 +41,7 @@ static ZIO_CHANNEL_OUTGOING_CALL_FUNCTION(analog_fxo_outgoing_call)
|
||||
if (!zap_test_flag(zchan, ZAP_CHANNEL_OFFHOOK) && !zap_test_flag(zchan, ZAP_CHANNEL_INTHREAD)) {
|
||||
zap_channel_command(zchan, ZAP_COMMAND_OFFHOOK, NULL);
|
||||
zap_channel_command(zchan, ZAP_COMMAND_ENABLE_PROGRESS_DETECT, NULL);
|
||||
zchan->need_tone[ZAP_TONEMAP_DIAL] = 1;
|
||||
zchan->needed_tones[ZAP_TONEMAP_DIAL] = 1;
|
||||
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DIALING);
|
||||
zap_thread_create_detached(zap_analog_channel_run, zchan);
|
||||
return ZAP_SUCCESS;
|
||||
@@ -118,10 +118,9 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
|
||||
zap_size_t dtmf_offset = 0;
|
||||
zap_analog_data_t *data = chan->span->analog_data;
|
||||
zap_channel_t *closed_chan;
|
||||
uint32_t state_counter = 0, elapsed = 0, interval = 0, last_digit = 0, indicate = 0;
|
||||
uint32_t state_counter = 0, elapsed = 0, interval = 0, last_digit = 0, indicate = 0, dial_timeout = 30000;
|
||||
zap_sigmsg_t sig;
|
||||
zap_status_t status;
|
||||
|
||||
|
||||
zap_log(ZAP_LOG_DEBUG, "ANALOG CHANNEL thread starting.\n");
|
||||
|
||||
@@ -167,8 +166,8 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
|
||||
switch(chan->state) {
|
||||
case ZAP_CHANNEL_STATE_DIALING:
|
||||
{
|
||||
if (state_counter > 5000) {
|
||||
if (chan->need_tone[ZAP_TONEMAP_DIAL]) {
|
||||
if (state_counter > dial_timeout) {
|
||||
if (chan->needed_tones[ZAP_TONEMAP_DIAL]) {
|
||||
zap_set_state_locked(chan, ZAP_CHANNEL_STATE_BUSY);
|
||||
} else {
|
||||
zap_set_state_locked(chan, ZAP_CHANNEL_STATE_UP);
|
||||
@@ -235,6 +234,7 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
|
||||
case ZAP_CHANNEL_STATE_UP:
|
||||
{
|
||||
zap_channel_use(chan);
|
||||
zap_channel_clear_needed_tones(chan);
|
||||
|
||||
if (chan->type == ZAP_CHAN_TYPE_FXO && !zap_test_flag(chan, ZAP_CHANNEL_OFFHOOK)) {
|
||||
zap_channel_command(chan, ZAP_COMMAND_OFFHOOK, NULL);
|
||||
@@ -352,45 +352,39 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (chan->detected_tone) {
|
||||
if (chan->type == ZAP_CHAN_TYPE_FXO && chan->detected_tones[0]) {
|
||||
zap_sigmsg_t sig;
|
||||
int i;
|
||||
memset(&sig, 0, sizeof(sig));
|
||||
sig.chan_id = chan->chan_id;
|
||||
sig.span_id = chan->span_id;
|
||||
sig.channel = chan;
|
||||
sig.event_id = ZAP_SIGEVENT_TONE_DETECTED;
|
||||
zap_log(ZAP_LOG_DEBUG, "Detected tone %s\n", zap_tonemap2str(chan->detected_tone));
|
||||
data->sig_cb(&sig);
|
||||
|
||||
if (chan->type == ZAP_CHAN_TYPE_FXO) {
|
||||
|
||||
if (chan->need_tone[chan->detected_tone]) {
|
||||
switch (chan->detected_tone) {
|
||||
case ZAP_TONEMAP_DIAL:
|
||||
{
|
||||
zap_channel_command(chan, ZAP_COMMAND_SEND_DTMF, chan->caller_data.ani);
|
||||
state_counter = 0;
|
||||
chan->need_tone[ZAP_TONEMAP_RING] = 1;
|
||||
chan->need_tone[ZAP_TONEMAP_BUSY] = 1;
|
||||
}
|
||||
break;
|
||||
case ZAP_TONEMAP_RING:
|
||||
{
|
||||
zap_set_state_locked(chan, ZAP_CHANNEL_STATE_UP);
|
||||
}
|
||||
break;
|
||||
case ZAP_TONEMAP_BUSY:
|
||||
{
|
||||
zap_set_state_locked(chan, ZAP_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
chan->need_tone[chan->detected_tone] = 0;
|
||||
for (i = 1; i < ZAP_TONEMAP_INVALID; i++) {
|
||||
if (chan->detected_tones[i]) {
|
||||
zap_log(ZAP_LOG_DEBUG, "Detected tone %s\n", zap_tonemap2str(chan->detected_tones[i]));
|
||||
sig.raw_data = &i;
|
||||
data->sig_cb(&sig);
|
||||
}
|
||||
}
|
||||
chan->detected_tone = 0;
|
||||
|
||||
if (chan->detected_tones[ZAP_TONEMAP_DIAL]) {
|
||||
zap_channel_command(chan, ZAP_COMMAND_SEND_DTMF, chan->caller_data.ani);
|
||||
state_counter = 0;
|
||||
chan->needed_tones[ZAP_TONEMAP_RING] = 1;
|
||||
chan->needed_tones[ZAP_TONEMAP_BUSY] = 1;
|
||||
chan->needed_tones[ZAP_TONEMAP_FAIL1] = 1;
|
||||
chan->needed_tones[ZAP_TONEMAP_FAIL2] = 1;
|
||||
chan->needed_tones[ZAP_TONEMAP_FAIL3] = 1;
|
||||
dial_timeout = (chan->dtmf_on + chan->dtmf_off) * strlen(chan->caller_data.ani) + 50;
|
||||
} else if (chan->detected_tones[ZAP_TONEMAP_RING]) {
|
||||
zap_set_state_locked(chan, ZAP_CHANNEL_STATE_UP);
|
||||
} else if (chan->detected_tones[ZAP_TONEMAP_BUSY]) {
|
||||
zap_set_state_locked(chan, ZAP_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
zap_channel_clear_detected_tones(chan);
|
||||
}
|
||||
|
||||
if (chan->dtmf_buffer && zap_buffer_inuse(chan->dtmf_buffer)) {
|
||||
|
Reference in New Issue
Block a user