mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-14 16:15:04 +00:00
FS-2217 --resolve this looks ok and is probably useful
This commit is contained in:
parent
e644e620c8
commit
b426ec0bfa
@ -202,6 +202,25 @@ SWITCH_BEGIN_EXTERN_C
|
|||||||
#define SWITCH_DTMF_LOG_LEN 1000
|
#define SWITCH_DTMF_LOG_LEN 1000
|
||||||
typedef uint8_t switch_byte_t;
|
typedef uint8_t switch_byte_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\enum switch_dtmf_source_t
|
||||||
|
\brief DTMF sources
|
||||||
|
<pre>
|
||||||
|
SWITCH_DTMF_UNKNOWN - Unknown source
|
||||||
|
SWITCH_DTMF_INBAND_AUDIO - From audio
|
||||||
|
SWITCH_DTMF_RTP - From RTP as a telephone event
|
||||||
|
SWITCH_DTMF_ENDPOINT - From endpoint signaling
|
||||||
|
SWITCH_DTMF_APP - From application
|
||||||
|
</pre>
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
SWITCH_DTMF_UNKNOWN,
|
||||||
|
SWITCH_DTMF_INBAND_AUDIO,
|
||||||
|
SWITCH_DTMF_RTP,
|
||||||
|
SWITCH_DTMF_ENDPOINT,
|
||||||
|
SWITCH_DTMF_APP
|
||||||
|
} switch_dtmf_source_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
DTMF_FLAG_SKIP_PROCESS = (1 << 0)
|
DTMF_FLAG_SKIP_PROCESS = (1 << 0)
|
||||||
} dtmf_flag_t;
|
} dtmf_flag_t;
|
||||||
@ -210,6 +229,7 @@ typedef struct {
|
|||||||
char digit;
|
char digit;
|
||||||
uint32_t duration;
|
uint32_t duration;
|
||||||
int32_t flags;
|
int32_t flags;
|
||||||
|
switch_dtmf_source_t source;
|
||||||
} switch_dtmf_t;
|
} switch_dtmf_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -57,6 +57,7 @@ static void spandsp_dtmf_rx_realtime_callback(void *user_data, int code, int lev
|
|||||||
pvt->last_digit = digit;
|
pvt->last_digit = digit;
|
||||||
dtmf.digit = digit;
|
dtmf.digit = digit;
|
||||||
dtmf.duration = switch_core_default_dtmf_duration(0);
|
dtmf.duration = switch_core_default_dtmf_duration(0);
|
||||||
|
dtmf.source = SWITCH_DTMF_INBAND_AUDIO;
|
||||||
switch_channel_queue_dtmf(switch_core_session_get_channel(pvt->session), &dtmf);
|
switch_channel_queue_dtmf(switch_core_session_get_channel(pvt->session), &dtmf);
|
||||||
pvt->digit_begin = pvt->samples;
|
pvt->digit_begin = pvt->samples;
|
||||||
} else {
|
} else {
|
||||||
|
@ -6625,7 +6625,7 @@ void sofia_handle_sip_i_info(nua_t *nua, sofia_profile_t *profile, nua_handle_t
|
|||||||
const char *signal_ptr;
|
const char *signal_ptr;
|
||||||
const char *rec_header;
|
const char *rec_header;
|
||||||
const char *clientcode_header;
|
const char *clientcode_header;
|
||||||
switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0) };
|
switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0), 0, SWITCH_DTMF_ENDPOINT };
|
||||||
switch_event_t *event;
|
switch_event_t *event;
|
||||||
private_object_t *tech_pvt = NULL;
|
private_object_t *tech_pvt = NULL;
|
||||||
|
|
||||||
|
@ -419,7 +419,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_queue_dtmf(switch_channel_t *chan
|
|||||||
SWITCH_DECLARE(switch_status_t) switch_channel_queue_dtmf_string(switch_channel_t *channel, const char *dtmf_string)
|
SWITCH_DECLARE(switch_status_t) switch_channel_queue_dtmf_string(switch_channel_t *channel, const char *dtmf_string)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0), 0};
|
switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0), 0, SWITCH_DTMF_APP };
|
||||||
int sent = 0, dur;
|
int sent = 0, dur;
|
||||||
char *string;
|
char *string;
|
||||||
int i, argc;
|
int i, argc;
|
||||||
|
@ -2137,6 +2137,7 @@ static switch_bool_t inband_dtmf_callback(switch_media_bug_t *bug, void *user_da
|
|||||||
switch_dtmf_t dtmf;
|
switch_dtmf_t dtmf;
|
||||||
dtmf.digit = *p;
|
dtmf.digit = *p;
|
||||||
dtmf.duration = switch_core_default_dtmf_duration(0);
|
dtmf.duration = switch_core_default_dtmf_duration(0);
|
||||||
|
dtmf.source = SWITCH_DTMF_INBAND_AUDIO;
|
||||||
switch_channel_queue_dtmf(channel, &dtmf);
|
switch_channel_queue_dtmf(channel, &dtmf);
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
@ -2327,18 +2328,20 @@ static switch_bool_t inband_dtmf_generate_callback(switch_media_bug_t *bug, void
|
|||||||
if (!switch_buffer_inuse(pvt->audio_buffer)) {
|
if (!switch_buffer_inuse(pvt->audio_buffer)) {
|
||||||
if (switch_queue_trypop(pvt->digit_queue, &pop) == SWITCH_STATUS_SUCCESS) {
|
if (switch_queue_trypop(pvt->digit_queue, &pop) == SWITCH_STATUS_SUCCESS) {
|
||||||
switch_dtmf_t *dtmf = (switch_dtmf_t *) pop;
|
switch_dtmf_t *dtmf = (switch_dtmf_t *) pop;
|
||||||
char buf[2] = "";
|
if (dtmf->source != SWITCH_DTMF_INBAND_AUDIO) {
|
||||||
int duration = dtmf->duration;
|
char buf[2] = "";
|
||||||
|
int duration = dtmf->duration;
|
||||||
|
|
||||||
buf[0] = dtmf->digit;
|
buf[0] = dtmf->digit;
|
||||||
if (duration > 8000) {
|
if (duration > 8000) {
|
||||||
duration = 4000;
|
duration = 4000;
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(switch_core_media_bug_get_session(bug)),
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(switch_core_media_bug_get_session(bug)),
|
||||||
SWITCH_LOG_WARNING, "%s Truncating ridiculous DTMF duration %d ms to 1/2 second.\n",
|
SWITCH_LOG_WARNING, "%s Truncating ridiculous DTMF duration %d ms to 1/2 second.\n",
|
||||||
switch_channel_get_name(switch_core_session_get_channel(pvt->session)), dtmf->duration / 8);
|
switch_channel_get_name(switch_core_session_get_channel(pvt->session)), dtmf->duration / 8);
|
||||||
|
}
|
||||||
|
pvt->ts.duration = duration;
|
||||||
|
teletone_run(&pvt->ts, buf);
|
||||||
}
|
}
|
||||||
pvt->ts.duration = duration;
|
|
||||||
teletone_run(&pvt->ts, buf);
|
|
||||||
free(pop);
|
free(pop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3168,6 +3171,7 @@ static void *SWITCH_THREAD_FUNC speech_thread(switch_thread_t *thread, void *obj
|
|||||||
switch_dtmf_t dtmf;
|
switch_dtmf_t dtmf;
|
||||||
dtmf.digit = c;
|
dtmf.digit = c;
|
||||||
dtmf.duration = switch_core_default_dtmf_duration(0);
|
dtmf.duration = switch_core_default_dtmf_duration(0);
|
||||||
|
dtmf.source = SWITCH_DTMF_INBAND_AUDIO;
|
||||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Queue speech detected dtmf %c\n", c);
|
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Queue speech detected dtmf %c\n", c);
|
||||||
switch_channel_queue_dtmf(channel, &dtmf);
|
switch_channel_queue_dtmf(channel, &dtmf);
|
||||||
}
|
}
|
||||||
|
@ -344,7 +344,7 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
|
|||||||
|
|
||||||
if (!rtp_session->dtmf_data.in_digit_queued && (rtp_session->rtp_bugs & RTP_BUG_IGNORE_DTMF_DURATION) &&
|
if (!rtp_session->dtmf_data.in_digit_queued && (rtp_session->rtp_bugs & RTP_BUG_IGNORE_DTMF_DURATION) &&
|
||||||
rtp_session->dtmf_data.in_digit_ts) {
|
rtp_session->dtmf_data.in_digit_ts) {
|
||||||
switch_dtmf_t dtmf = { key, switch_core_min_dtmf_duration(0) };
|
switch_dtmf_t dtmf = { key, switch_core_min_dtmf_duration(0), 0, SWITCH_DTMF_RTP };
|
||||||
#ifdef DEBUG_2833
|
#ifdef DEBUG_2833
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Early Queuing digit %c:%d\n", dtmf.digit, dtmf.duration / 8);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Early Queuing digit %c:%d\n", dtmf.digit, dtmf.duration / 8);
|
||||||
#endif
|
#endif
|
||||||
@ -373,7 +373,7 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
|
|||||||
rtp_session->dtmf_data.in_digit_sanity = 2000;
|
rtp_session->dtmf_data.in_digit_sanity = 2000;
|
||||||
}
|
}
|
||||||
if (rtp_session->dtmf_data.in_digit_ts) {
|
if (rtp_session->dtmf_data.in_digit_ts) {
|
||||||
switch_dtmf_t dtmf = { key, duration };
|
switch_dtmf_t dtmf = { key, duration, 0, SWITCH_DTMF_RTP };
|
||||||
|
|
||||||
if (ts > rtp_session->dtmf_data.in_digit_ts) {
|
if (ts > rtp_session->dtmf_data.in_digit_ts) {
|
||||||
dtmf.duration += (ts - rtp_session->dtmf_data.in_digit_ts);
|
dtmf.duration += (ts - rtp_session->dtmf_data.in_digit_ts);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user