#include "ftdm_cpu_monitor.h"
#define SPAN_PENDING_CHANS_QUEUE_SIZE 1000
+#define FTDM_READ_TRACE_INDEX 0
+#define FTDM_WRITE_TRACE_INDEX 1
static int time_is_init = 0;
new_chan->span_id = span->span_id;
new_chan->chan_id = span->chan_count;
new_chan->span = span;
- new_chan->fds[0] = -1;
- new_chan->fds[1] = -1;
+ new_chan->fds[FTDM_READ_TRACE_INDEX] = -1;
+ new_chan->fds[FTDM_WRITE_TRACE_INDEX] = -1;
new_chan->data_type = FTDM_TYPE_CHANNEL;
if (!new_chan->dtmf_on) {
new_chan->dtmf_on = FTDM_DEFAULT_DTMF_ON;
case FTDM_COMMAND_TRACE_INPUT:
{
char *path = (char *) obj;
- if (ftdmchan->fds[0] > 0) {
- close(ftdmchan->fds[0]);
- ftdmchan->fds[0] = -1;
+ if (ftdmchan->fds[FTDM_READ_TRACE_INDEX] > 0) {
+ close(ftdmchan->fds[FTDM_READ_TRACE_INDEX]);
+ ftdmchan->fds[FTDM_READ_TRACE_INDEX] = -1;
}
- if ((ftdmchan->fds[0] = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
- ftdm_log(FTDM_LOG_DEBUG, "Tracing channel %u:%u to [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, path);
+ if ((ftdmchan->fds[FTDM_READ_TRACE_INDEX] = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
+ ftdm_log(FTDM_LOG_DEBUG, "Tracing channel %u:%u input to [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, path);
GOTO_STATUS(done, FTDM_SUCCESS);
}
case FTDM_COMMAND_TRACE_OUTPUT:
{
char *path = (char *) obj;
- if (ftdmchan->fds[1] > 0) {
- close(ftdmchan->fds[1]);
- ftdmchan->fds[1] = -1;
+ if (ftdmchan->fds[FTDM_WRITE_TRACE_INDEX] > 0) {
+ close(ftdmchan->fds[FTDM_WRITE_TRACE_INDEX]);
+ ftdmchan->fds[FTDM_WRITE_TRACE_INDEX] = -1;
}
- if ((ftdmchan->fds[1] = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
- ftdm_log(FTDM_LOG_DEBUG, "Tracing channel %u:%u to [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, path);
+ if ((ftdmchan->fds[FTDM_WRITE_TRACE_INDEX] = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
+ ftdm_log(FTDM_LOG_DEBUG, "Tracing channel %u:%u output to [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, path);
GOTO_STATUS(done, FTDM_SUCCESS);
}
break;
case FTDM_COMMAND_TRACE_END_ALL:
{
- if (ftdmchan->fds[0] > 0) {
- close(ftdmchan->fds[0]);
- ftdmchan->fds[0] = -1;
+ if (ftdmchan->fds[FTDM_READ_TRACE_INDEX] > 0) {
+ close(ftdmchan->fds[FTDM_READ_TRACE_INDEX]);
+ ftdmchan->fds[FTDM_READ_TRACE_INDEX] = -1;
}
- if (ftdmchan->fds[1] > 0) {
- close(ftdmchan->fds[1]);
- ftdmchan->fds[1] = -1;
+ if (ftdmchan->fds[FTDM_READ_TRACE_INDEX] > 0) {
+ close(ftdmchan->fds[FTDM_READ_TRACE_INDEX]);
+ ftdmchan->fds[FTDM_READ_TRACE_INDEX] = -1;
}
GOTO_STATUS(done, FTDM_SUCCESS);
}
return status;
}
+static FIO_WRITE_FUNCTION(ftdm_raw_write)
+{
+ if (ftdmchan->fds[FTDM_WRITE_TRACE_INDEX] > -1) {
+ int dlen = (int) *datalen;
+ if ((write(ftdmchan->fds[FTDM_WRITE_TRACE_INDEX], data, dlen)) != dlen) {
+ ftdm_log(FTDM_LOG_WARNING, "Raw output trace failed to write all of the %zd bytes\n", dlen);
+ }
+ }
+ return ftdmchan->fio->write(ftdmchan, data, datalen);
+}
+
+static FIO_READ_FUNCTION(ftdm_raw_read)
+{
+ ftdm_status_t status = ftdmchan->fio->read(ftdmchan, data, datalen);
+ if (status == FTDM_SUCCESS && ftdmchan->fds[FTDM_READ_TRACE_INDEX] > -1) {
+ int dlen = (int) *datalen;
+ if (write(ftdmchan->fds[FTDM_READ_TRACE_INDEX], data, dlen) != dlen) {
+ ftdm_log(FTDM_LOG_WARNING, "Raw input trace failed to write all of the %zd bytes\n", dlen);
+ }
+ }
+ return status;
+}
static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
{
}
}
- return ftdmchan->fio->write(ftdmchan, auxbuf, &dlen);
+ return ftdm_raw_write(ftdmchan, auxbuf, &dlen);
}
return FTDM_SUCCESS;
}
-
FT_DECLARE(void) ftdm_generate_sln_silence(int16_t *data, uint32_t samples, uint32_t divisor)
{
int16_t x;
}
}
-
-
FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data, ftdm_size_t *datalen)
{
ftdm_status_t status = FTDM_FAIL;
return FTDM_FAIL;
}
- status = ftdmchan->fio->read(ftdmchan, data, datalen);
- if (ftdmchan->fds[0] > -1) {
- int dlen = (int) *datalen;
- if (write(ftdmchan->fds[0], data, dlen) != dlen) {
- snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "file write error!");
- return FTDM_FAIL;
- }
- }
+ status = ftdm_raw_read(ftdmchan, data, datalen);
if (status == FTDM_SUCCESS) {
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_USE_RX_GAIN)
}
}
- if (ftdmchan->fds[1] > -1) {
- int dlen = (int) *datalen;
- if ((write(ftdmchan->fds[1], data, dlen)) != dlen) {
- snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "file write error!");
- return FTDM_FAIL;
- }
- }
-
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_USE_TX_GAIN)
&& (ftdmchan->native_codec == FTDM_CODEC_ALAW || ftdmchan->native_codec == FTDM_CODEC_ULAW)) {
unsigned char *wdata = data;
wdata[i] = ftdmchan->txgain_table[wdata[i]];
}
}
- status = ftdmchan->fio->write(ftdmchan, data, datalen);
+
+ status = ftdm_raw_write(ftdmchan, data, datalen);
return status;
}