mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-07-13 10:37:42 +00:00
openzap: misc dtmf merged changes from freetdm
This commit is contained in:
parent
7ef629e34b
commit
bacef26a6a
@ -1529,6 +1529,24 @@ static ZIO_SIGNAL_CB_FUNCTION(on_common_signal)
|
|||||||
return ZAP_BREAK;
|
return ZAP_BREAK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void zap_enable_channel_dtmf(zap_channel_t *zchan, switch_channel_t *channel)
|
||||||
|
{
|
||||||
|
if (channel) {
|
||||||
|
const char *var;
|
||||||
|
if ((var = switch_channel_get_variable(channel, "openzap_disable_dtmf"))) {
|
||||||
|
if (switch_true(var)) {
|
||||||
|
zap_channel_command(zchan, ZAP_COMMAND_DISABLE_DTMF_DETECT, NULL);
|
||||||
|
zap_log(ZAP_LOG_INFO, "DTMF detection disabled in channel %d:%d\n", zchan->span_id, zchan->chan_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* the variable is not present or has negative value then proceed to enable DTMF */
|
||||||
|
}
|
||||||
|
if (zap_channel_command(zchan, ZAP_COMMAND_ENABLE_DTMF_DETECT, NULL) != ZAP_SUCCESS) {
|
||||||
|
zap_log(ZAP_LOG_ERROR, "Failed to enable DTMF detection in channel %d:%d\n", zchan->span_id, zchan->chan_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static ZIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
|
static ZIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
|
||||||
{
|
{
|
||||||
switch_core_session_t *session = NULL;
|
switch_core_session_t *session = NULL;
|
||||||
@ -1567,6 +1585,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
|
|||||||
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
||||||
channel = switch_core_session_get_channel(session);
|
channel = switch_core_session_get_channel(session);
|
||||||
switch_channel_mark_answered(channel);
|
switch_channel_mark_answered(channel);
|
||||||
|
zap_enable_channel_dtmf(sigmsg->channel, channel);
|
||||||
switch_core_session_rwunlock(session);
|
switch_core_session_rwunlock(session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1606,6 +1625,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
|
|||||||
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
||||||
channel = switch_core_session_get_channel(session);
|
channel = switch_core_session_get_channel(session);
|
||||||
switch_channel_mark_answered(channel);
|
switch_channel_mark_answered(channel);
|
||||||
|
zap_enable_channel_dtmf(sigmsg->channel, channel);
|
||||||
switch_core_session_rwunlock(session);
|
switch_core_session_rwunlock(session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1887,12 +1907,9 @@ static ZIO_SIGNAL_CB_FUNCTION(on_r2_signal)
|
|||||||
case ZAP_SIGEVENT_UP:
|
case ZAP_SIGEVENT_UP:
|
||||||
{
|
{
|
||||||
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
||||||
zap_tone_type_t tt = ZAP_TONE_DTMF;
|
|
||||||
channel = switch_core_session_get_channel(session);
|
channel = switch_core_session_get_channel(session);
|
||||||
switch_channel_mark_answered(channel);
|
switch_channel_mark_answered(channel);
|
||||||
if (zap_channel_command(sigmsg->channel, ZAP_COMMAND_ENABLE_DTMF_DETECT, &tt) != ZAP_SUCCESS) {
|
zap_enable_channel_dtmf(sigmsg->channel, channel);
|
||||||
zap_log(ZAP_LOG_ERROR, "Failed to enable DTMF detection in R2 channel %d:%d\n", sigmsg->channel->span_id, sigmsg->channel->chan_id);
|
|
||||||
}
|
|
||||||
switch_core_session_rwunlock(session);
|
switch_core_session_rwunlock(session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1923,12 +1940,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
|
|||||||
switch(sigmsg->event_id) {
|
switch(sigmsg->event_id) {
|
||||||
case ZAP_SIGEVENT_START:
|
case ZAP_SIGEVENT_START:
|
||||||
{
|
{
|
||||||
zap_tone_type_t tt = ZAP_TONE_DTMF;
|
zap_enable_channel_dtmf(sigmsg->channel, channel);
|
||||||
|
|
||||||
if (zap_channel_command(sigmsg->channel, ZAP_COMMAND_ENABLE_DTMF_DETECT, &tt) != ZAP_SUCCESS) {
|
|
||||||
zap_log(ZAP_LOG_ERROR, "TONE ERROR\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return zap_channel_from_event(sigmsg, &session);
|
return zap_channel_from_event(sigmsg, &session);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1949,12 +1961,9 @@ static ZIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
|
|||||||
case ZAP_SIGEVENT_UP:
|
case ZAP_SIGEVENT_UP:
|
||||||
{
|
{
|
||||||
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
if ((session = zap_channel_get_session(sigmsg->channel, 0))) {
|
||||||
zap_tone_type_t tt = ZAP_TONE_DTMF;
|
|
||||||
channel = switch_core_session_get_channel(session);
|
channel = switch_core_session_get_channel(session);
|
||||||
switch_channel_mark_answered(channel);
|
switch_channel_mark_answered(channel);
|
||||||
if (zap_channel_command(sigmsg->channel, ZAP_COMMAND_ENABLE_DTMF_DETECT, &tt) != ZAP_SUCCESS) {
|
zap_enable_channel_dtmf(sigmsg->channel, channel);
|
||||||
zap_log(ZAP_LOG_ERROR, "TONE ERROR\n");
|
|
||||||
}
|
|
||||||
switch_core_session_rwunlock(session);
|
switch_core_session_rwunlock(session);
|
||||||
} else {
|
} else {
|
||||||
const char *uuid = zap_channel_get_uuid(sigmsg->channel, 0);
|
const char *uuid = zap_channel_get_uuid(sigmsg->channel, 0);
|
||||||
|
@ -264,11 +264,8 @@ static unsigned wp_open_range(zap_span_t *span, unsigned spanno, unsigned start,
|
|||||||
|
|
||||||
err = sangoma_tdm_get_hw_dtmf(chan->sockfd, &tdm_api);
|
err = sangoma_tdm_get_hw_dtmf(chan->sockfd, &tdm_api);
|
||||||
if (err > 0) {
|
if (err > 0) {
|
||||||
err = sangoma_tdm_enable_dtmf_events(chan->sockfd, &tdm_api);
|
zap_channel_set_feature(chan, ZAP_CHANNEL_FEATURE_DTMF_DETECT);
|
||||||
if (err == 0) {
|
dtmf = "hardware";
|
||||||
zap_channel_set_feature(chan, ZAP_CHANNEL_FEATURE_DTMF_DETECT);
|
|
||||||
dtmf = "hardware";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1186,8 +1183,21 @@ static ZIO_CHANNEL_DESTROY_FUNCTION(wanpipe_channel_destroy)
|
|||||||
sangoma_wait_obj_delete(&sangoma_wait_obj);
|
sangoma_wait_obj_delete(&sangoma_wait_obj);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (zchan->sockfd != ZAP_INVALID_SOCKET) {
|
if (zchan->sockfd != ZAP_INVALID_SOCKET) {
|
||||||
|
/* enable HW DTMF. As odd as it seems. Why enable when the channel is being destroyed and won't be used anymore?
|
||||||
|
* because that way we can transfer the DTMF state back to the driver, if we're being restarted we will set again
|
||||||
|
* the FEATURE_DTMF flag and use HW DTMF, if we don't enable here, then on module restart we won't see
|
||||||
|
* HW DTMF available and will use software */
|
||||||
|
if (zap_channel_test_feature(zchan, ZAP_CHANNEL_FEATURE_DTMF_DETECT)) {
|
||||||
|
wanpipe_tdm_api_t tdm_api;
|
||||||
|
int err;
|
||||||
|
memset(&tdm_api, 0, sizeof(tdm_api));
|
||||||
|
err = sangoma_tdm_enable_dtmf_events(zchan->sockfd, &tdm_api);
|
||||||
|
if (err) {
|
||||||
|
zap_log(ZAP_LOG_WARNING, "Failed to enable Sangoma HW DTMF on channel %d:%d at destroy\n",
|
||||||
|
zchan->span_id, zchan->chan_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
sangoma_close(&zchan->sockfd);
|
sangoma_close(&zchan->sockfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user