discards 8037b69f40413784631c59942b5d4fc856cff845 (commit)
discards 67edc7c3215f6476452f3ff7ee82ba559c39656f (commit)
discards 2adfc50af7958eea12c15e023bcf80b18a4c73f9 (commit)
via: eeac03ef5028b565b28364752ef5a48307ca17d4 (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (8037b69f40413784631c59942b5d4fc856cff845)
\
N -- N -- N (eeac03ef5028b565b28364752ef5a48307ca17d4)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
= COMMIT LOG ===========================================================
committer: Moises Silva
comments:
freetdm: add code to troubleshoot crash on tone generation
diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c
index c9000de..1e282d1 100644
--- a/libs/freetdm/src/ftdm_io.c
+++ b/libs/freetdm/src/ftdm_io.c
@@ -2743,10 +2743,9 @@ static ftdm_status_t ftdmchan_activate_dtmf_buffer(ftdm_channel_t *ftdmchan)
if (!ftdmchan->dtmf_buffer) {
if (ftdm_buffer_create(&ftdmchan->dtmf_buffer, 1024, 3192, 0) != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_ERROR, "Failed to allocate DTMF Buffer!\n");
- snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "buffer error");
return FTDM_FAIL;
} else {
- ftdm_log(FTDM_LOG_DEBUG, "Created DTMF Buffer!\n");
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Created DTMF buffer\n");
}
}
@@ -3588,8 +3587,17 @@ static FIO_READ_FUNCTION(ftdm_raw_read)
return status;
}
-static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
+/* This function takes care of automatically generating DTMF or FSK tones when needed */
+static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
{
+ /*
+ * datalen: size in bytes of the chunk of data the user requested to read (this function
+ * is called from the ftdm_channel_read function)
+ * dblen: size currently in use in any of the tone generation buffers (data available in the buffer)
+ * gen_dtmf_buffer: buffer holding the raw ASCII digits that the user requested to generate
+ * dtmf_buffer: raw linear tone data generated by teletone to be written to the devices
+ * fsk_buffer: raw linear FSK modulated data for caller id
+ */
ftdm_buffer_t *buffer = NULL;
ftdm_size_t dblen = 0;
int wrote = 0;
@@ -3604,7 +3612,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
}
if (ftdm_buffer_read(ftdmchan->gen_dtmf_buffer, digits, dblen) && !ftdm_strlen_zero_buf(digits)) {
- ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);
cur = digits;
@@ -3618,7 +3626,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
ftdm_buffer_write(ftdmchan->dtmf_buffer, ftdmchan->tone_session.buffer, wrote * 2);
x++;
} else {
- ftdm_log(FTDM_LOG_ERROR, "%d:%d Problem Adding DTMF SEQ [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, digits);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Problem adding DTMF sequence [%s]\n", digits);
return FTDM_FAIL;
}
}
@@ -3631,6 +3639,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
if (!ftdmchan->buffer_delay || --ftdmchan->buffer_delay == 0) {
+ /* time to pick a buffer, either the dtmf or fsk buffer */
if (ftdmchan->dtmf_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->dtmf_buffer))) {
buffer = ftdmchan->dtmf_buffer;
} else if (ftdmchan->fsk_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->fsk_buffer))) {
@@ -3638,22 +3647,41 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
}
}
+ /* if we picked a buffer, time to read from it and write the linear data to the device */
if (buffer) {
- ftdm_size_t dlen = datalen;
uint8_t auxbuf[1024];
+ /* we initialize dlen to datalen, which is the size in bytes the
+ * user wants to read (typically chunks of 160 bytes, 20ms G.711) */
+ ftdm_size_t dlen = datalen;
ftdm_size_t len, br, max = sizeof(auxbuf);
+ /* if the codec is not linear, then data is really twice as much cuz
+ tone generation is done in linear (we assume anything different than linear is G.711) */
if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
dlen *= 2;
}
-
+
+ /* we do not expect the user chunks to be bigger than auxbuf */
+ ftdm_assert(dlen <= sizeof(auxbuf), "Unexpected size for user data chunk size\n");
+
+ /* dblen is the size in use for dtmf_buffer or fsk_buffer, and dlen is the size
+ * of the read chunks of the user, we pick the smaller one */
len = dblen > dlen ? dlen : dblen;
+ /* we can't read more than the size of our auxiliary buffer */
+ ftdm_assert((len <= sizeof(auxbuf)), "Unexpected size to read into auxbuf\n");
+
br = ftdm_buffer_read(buffer, auxbuf, len);
+
+ /* the amount read can't possibly be bigger than what we requested */
+ ftdm_assert((br <= len), "Unexpected size read from tone generation buffer\n");
+
+ /* if we read less than the chunk size, we must fill in with silence the rest */
if (br < dlen) {
memset(auxbuf + br, 0, dlen - br);
}
+ /* finally we convert to the native format for the channel if necessary */
if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
if (ftdmchan->native_codec == FTDM_CODEC_ULAW) {
fio_slin2ulaw(auxbuf, max, &dlen);
@@ -3662,6 +3690,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
}
}
+ /* write the tone to the channel */
return ftdm_raw_write(ftdmchan, auxbuf, &dlen);
}
@@ -3741,7 +3770,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
rdata[i] = ftdmchan->rxgain_table[rdata[i]];
}
}
- handle_dtmf(ftdmchan, *datalen);
+ handle_tone_generation(ftdmchan, *datalen);
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
if (ftdmchan->native_codec == FTDM_CODEC_ULAW && ftdmchan->effective_codec == FTDM_CODEC_SLIN) {
@@ -3938,7 +3967,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
if (!ftdmchan->buffer_delay &&
((ftdmchan->dtmf_buffer && ftdm_buffer_inuse(ftdmchan->dtmf_buffer)) ||
(ftdmchan->fsk_buffer && ftdm_buffer_inuse(ftdmchan->fsk_buffer)))) {
- /* read size writing DTMF ATM */
+ /* generating some kind of tone at the moment (see handle_tone_generation),
+ * we ignore user data ... */
goto done;
}
Summary of changes: conf/autoload_configs/switch.conf.xml | 2 +- libs/freetdm/src/ftdm_io.c | 48 ++++++++++++++++---- .../applications/mod_conference/mod_conference.c | 45 +++++++------------ src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c | 2 +- 4 files changed, 57 insertions(+), 40 deletions(-)
this email was generated because of /git/your-repo.git/hooks/post-receive by the file /git-core/contrib/hooks/post-receive-email
For more info, see http://blog.chomperstomp.com/?p=630
--
FreeSWITCH Source