#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include <math.h>
#include "main.h"
#define SHORT_MIN -32768
struct message *message;
if (p_record)
- close_record(0);
+ close_record(0, 0);
classuse--;
/*
* close the recoding file, put header in front and rename
*/
-void Port::close_record(int beep)
+void Port::close_record(int beep, int mute)
{
- static signed long beep_mono[] = {-10000, 10000, -10000, 10000, -10000, 10000, -10000, 10000, -10000, 10000, -10000, 10000, -10000, 10000, -10000, 10000};
- static unsigned char beep_8bit[] = {48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208, 48, 208};
+ static signed short beep_mono[256];
unsigned long size, wsize;
struct fmt fmt;
char filename[512], indexname[512];
i++;
}
+ /* mute */
+ if (mute && p_record_type==CODEC_MONO)
+ {
+ i = p_record_length;
+ if (i > mute)
+ i = mute;
+ fseek(p_record, -(i<<1), SEEK_END);
+ p_record_length -= (i<<1);
+ }
/* add beep to the end of recording */
- if (beep)
- switch(p_record_type)
+ if (beep && p_record_type==CODEC_MONO)
{
- case CODEC_MONO:
i = 0;
- while(i < beep)
+ while(i < 256)
{
- fwrite(beep_mono, sizeof(beep_mono), 1, p_record);
- i += sizeof(beep_mono);
- p_record_length += sizeof(beep_mono);
- }
- break;
- case CODEC_8BIT:
- i = 0;
- while(i < beep)
- {
- fwrite(beep_8bit, sizeof(beep_8bit), 1, p_record);
- i += sizeof(beep_8bit);
- p_record_length += sizeof(beep_8bit);
+ beep_mono[i] = (signed short)(sin((double)i / 5.688888888889 * 2.0 * 3.1415927) * 2000.0);
+ i++;
}
- break;
-#if 0
- case CODEC_LAW:
i = 0;
while(i < beep)
{
- fwrite(beep_law, sizeof(beep_law), 1, p_record);
- i += sizeof(beep_law);
- p_record_length += sizeof(beep_law);
+ fwrite(beep_mono, sizeof(beep_mono), 1, p_record);
+ i += sizeof(beep_mono);
+ p_record_length += sizeof(beep_mono);
}
- break;
-#endif
- default:
- PERROR("codec %d not supported for beep adding\n", p_record_type);
}
/* complete header */
}
+static void vbox_trace_header(class VBoxPort *vbox, char *message, int direction)
+{
+ /* init trace with given values */
+ start_trace(0,
+ NULL,
+ vbox?numberrize_callerinfo(vbox->p_callerinfo.id, vbox->p_callerinfo.ntype):NULL,
+ vbox?vbox->p_dialinginfo.id:NULL,
+ direction,
+ CATEGORY_CH,
+ vbox?vbox->p_serial:0,
+ message);
+}
+
+
/*
* handler of vbox
*/
message->param.disconnectinfo.cause = 16;
message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
message_put(message);
+ vbox_trace_header(this, "RELEASE from VBox (recoding limit reached)", DIRECTION_IN);
+ add_trace("cause", "value", "%d", message->param.disconnectinfo.cause);
+ add_trace("cause", "location", "%d", message->param.disconnectinfo.location);
+ end_trace();
/* remove epoint */
free_epointlist(p_epointlist);
}
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_CONNECT);
memcpy(&message->param.connectinfo, &p_connectinfo, sizeof(struct connect_info));
message_put(message);
+ vbox_trace_header(this, "CONNECT from VBox (announcement is over)", DIRECTION_IN);
+ end_trace();
new_state(PORT_STATE_CONNECT);
}
}
{
/* recording start */
open_record(p_vbox_ext.vbox_codec, 2, 0, p_vbox_ext.number, p_vbox_ext.anon_ignore, p_vbox_ext.vbox_email, p_vbox_ext.vbox_email_file);
+ vbox_trace_header(this, "RECORDING (announcement is over)", DIRECTION_IN);
+ end_trace();
} else // else!!
if (p_vbox_mode == VBOX_MODE_ANNOUNCEMENT)
{
message->param.disconnectinfo.cause = 16;
message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
message_put(message);
+ vbox_trace_header(this, "RELEASE from VBox (after annoucement)", DIRECTION_IN);
+ add_trace("cause", "value", "%d", message->param.disconnectinfo.cause);
+ add_trace("cause", "location", "%d", message->param.disconnectinfo.location);
+ end_trace();
/* recording is close during destruction */
delete this;
return(-1); /* must return because port is gone */
return(1);
case MESSAGE_DISCONNECT: /* call has been disconnected */
- PDEBUG(DEBUG_VBOX, "PORT(%s) vbox port with (caller id %s) received disconnect cause=%d\n", p_name, p_callerinfo.id, param->disconnectinfo.cause);
-
new_state(PORT_STATE_OUT_DISCONNECT);
+ vbox_trace_header(this, "DISCONNECT to VBox", DIRECTION_OUT);
+ add_trace("cause", "value", "%d", param->disconnectinfo.cause);
+ add_trace("cause", "location", "%d", param->disconnectinfo.location);
+ end_trace();
while(p_epointlist)
{
message->param.disconnectinfo.cause = CAUSE_NORMAL;
message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
message_put(message);
+ vbox_trace_header(this, "RELEASE from VBox (after disconnect)", DIRECTION_IN);
+ add_trace("cause", "value", "%d", message->param.disconnectinfo.cause);
+ add_trace("cause", "location", "%d", message->param.disconnectinfo.location);
+ end_trace();
/* remove epoint */
free_epointlist(p_epointlist);
}
break;
case MESSAGE_RELEASE: /* release vbox port */
- PDEBUG(DEBUG_VBOX, "PORT(%s) vbox port with (caller id %s) received release\n", p_name, p_callerinfo.id);
+ vbox_trace_header(this, "RELEASE to VBox", DIRECTION_OUT);
+ add_trace("cause", "value", "%d", param->disconnectinfo.cause);
+ add_trace("cause", "location", "%d", param->disconnectinfo.location);
+ end_trace();
/* we are done */
/* recording is close during destruction */
{
SPRINT(filename, "%s/%s/%s/vbox/announcement", INSTALL_DATA, options.extensions_dir, p_vbox_ext.number);
}
- PDEBUG(DEBUG_VBOX, "PORT(%s) vbox port received setup from '%s' to '%s'\n", p_name, param->setup.callerinfo.id, param->setup.dialinginfo.id);
+ vbox_trace_header(this, "SETUP to VBox", DIRECTION_OUT);
+ add_trace("from", "id", "%s", param->setup.callerinfo.id);
+ add_trace("to", "box", "%s", param->setup.dialinginfo.id);
+ end_trace();
+ memcpy(&p_dialinginfo, ¶m->setup.dialinginfo, sizeof(p_dialinginfo));
memcpy(&p_callerinfo, ¶m->setup.callerinfo, sizeof(p_callerinfo));
memcpy(&p_redirinfo, ¶m->setup.redirinfo, sizeof(p_redirinfo));
/* link relation */
message = message_create(p_serial, epoint_id, PORT_TO_EPOINT, MESSAGE_CONNECT);
memcpy(&message->param.connectinfo, &p_connectinfo, sizeof(struct connect_info));
message_put(message);
+ vbox_trace_header(this, "CONNECT from VBox (after setup)", DIRECTION_IN);
+ end_trace();
new_state(PORT_STATE_CONNECT);
} else
{
/* send alerting message */
message = message_create(p_serial, epoint_id, PORT_TO_EPOINT, MESSAGE_ALERTING);
message_put(message);
+ vbox_trace_header(this, "ALERTING from VBox (play announcement before connect)", DIRECTION_IN);
+ end_trace();
new_state(PORT_STATE_IN_ALERTING);
}
{
fhuse++;
}
+ vbox_trace_header(this, "ANNOUNCEMENT", DIRECTION_OUT);
+ add_trace("file", "name", "%s", filename);
+ add_trace("file", "exists", "%s", (p_vbox_announce_fh>=0)?"yes":"no");
+ end_trace();
/* start recording if desired */
p_vbox_mode = p_vbox_ext.vbox_mode;
p_vbox_record_limit = p_vbox_ext.vbox_time;
- if (!p_vbox_announce_fh || p_vbox_mode==VBOX_MODE_PARALLEL)
+ if (p_vbox_announce_fh<0 || p_vbox_mode==VBOX_MODE_PARALLEL)
{
- PDEBUG(DEBUG_VBOX, "PORT(%s) parallel mode OR no announcement found at: '%s' so we start recording now.\n", p_name, filename);
/* recording start */
open_record(p_vbox_ext.vbox_codec, 2, 0, p_vbox_ext.number, p_vbox_ext.anon_ignore, p_vbox_ext.vbox_email, p_vbox_ext.vbox_email_file);
+ vbox_trace_header(this, "RECORDING", DIRECTION_IN);
+ end_trace();
}
break;