[svn-commits] mattf: branch 1.2 r3241 - /branches/1.2/wctc4xxp/base.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Nov 21 16:45:33 CST 2007
Author: mattf
Date: Wed Nov 21 16:45:32 2007
New Revision: 3241
URL: http://svn.digium.com/view/zaptel?view=rev&rev=3241
Log:
Transcoder driver updates. Fixes G.723 no audio issues with latest drivers
Modified:
branches/1.2/wctc4xxp/base.c
Modified: branches/1.2/wctc4xxp/base.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/wctc4xxp/base.c?view=diff&rev=3241&r1=3240&r2=3241
==============================================================================
--- branches/1.2/wctc4xxp/base.c (original)
+++ branches/1.2/wctc4xxp/base.c Wed Nov 21 16:45:32 2007
@@ -313,12 +313,7 @@
else { \
ret = wcdte_waitfor_csmencaps(wc, RCV_CSMENCAPS, 0); \
if (wc->dsp_crashed) \
- { \
- printk("Aborting zt_send_cmd()\n"); \
return 1; \
- } \
- if ((ret == 2) && (wc->last_command_sent == 0x0010)) \
- printk("Detected timeout on 0x0010\n"); \
} \
if (ret == 1) \
return(1); \
@@ -444,12 +439,9 @@
static char *mode;
static int debug_packets = 0;
-static int wcdte_create_channel(struct wcdte *wc, int part1_id, int part2_id, unsigned int *dte_chan1, unsigned int *dte_chan2);
-static int wcdte_open_channel(struct wcdte *wc, int simple, int complicated, int part1_id, int part2_id, int chan1, int chan2);
+static int wcdte_create_channel(struct wcdte *wc, int simple, int complicated, int part1_id, int part2_id, unsigned int *dte_chan1, unsigned int *dte_chan2);
static int wcdte_destroy_channel(struct wcdte *wc, unsigned int chan1, unsigned int chan2);
-static int wcdte_close_channel(struct wcdte *wc, unsigned int chan1, unsigned int chan2);
static int __wcdte_setup_channels(struct wcdte *wc);
-static void wcdte_release(struct wcdte *wc);
static int __dump_descriptors(struct wcdte *wc)
{
@@ -702,34 +694,17 @@
int i = 0;
int res = 0;
unsigned int ipchksum, ndx;
-
switch(op) {
- case ZT_TCOP_ALLOCATE:
+ case ZT_TCOP_ALLOCATE:
down(&wc->chansem);
- if (ztc->chan_built == 0) {
- if (ztc->built_fmts == (zth->dstfmt | zth->srcfmt)) {
- ztc->chan_built = 1;
- st->ssrc += 1;
- } else {
- /* If channel is built for the wrong codecs, teardown and rebuild */
- if (st->encoder == 1) {
- if (st->chan_in_num != 999) {
- wcdte_close_channel(wc, st->chan_in_num, st->chan_out_num);
- wcdte_destroy_channel(wc, st->chan_in_num, st->chan_out_num);
- }
- wcdte_create_channel(wc, st->timeslot_in_num, st->timeslot_out_num, &(st->chan_in_num), &(st->chan_out_num));
- wcdte_open_channel(wc, wcdte_zapfmt_to_dtefmt(zth->srcfmt), wcdte_zapfmt_to_dtefmt(zth->dstfmt),
- st->timeslot_in_num, st->timeslot_out_num, st->chan_in_num, st->chan_out_num);
- } else {
- if (st->chan_in_num != 999) {
- wcdte_close_channel(wc, st->chan_out_num, st->chan_in_num);
- wcdte_destroy_channel(wc, st->chan_out_num, st->chan_in_num);
- }
- wcdte_create_channel(wc, st->timeslot_out_num, st->timeslot_in_num, &(st->chan_out_num), &(st->chan_in_num));
- wcdte_open_channel(wc, wcdte_zapfmt_to_dtefmt(zth->srcfmt), wcdte_zapfmt_to_dtefmt(zth->dstfmt),
- st->timeslot_out_num, st->timeslot_in_num, st->chan_out_num, st->chan_in_num);
- }
- }
+ if (ztc->chan_built == 0)
+ {
+ if (st->encoder == 1)
+ wcdte_create_channel(wc, wcdte_zapfmt_to_dtefmt(zth->srcfmt), wcdte_zapfmt_to_dtefmt(zth->dstfmt),
+ st->timeslot_in_num, st->timeslot_out_num, &(st->chan_in_num), &(st->chan_out_num));
+ else
+ wcdte_create_channel(wc, wcdte_zapfmt_to_dtefmt(zth->dstfmt), wcdte_zapfmt_to_dtefmt(zth->srcfmt),
+ st->timeslot_out_num, st->timeslot_in_num, &(st->chan_out_num), &(st->chan_in_num));
/* Mark this channel as built */
ztc->chan_built = 1;
ztc->built_fmts = zth->dstfmt | zth->srcfmt;
@@ -740,9 +715,9 @@
compl_ztc = &(wc->udecode->channels[ndx]);
else
compl_ztc = &(wc->uencode->channels[ndx]);
- compl_st = compl_ztc->pvt;
compl_ztc->chan_built = 1;
compl_ztc->built_fmts = zth->dstfmt | zth->srcfmt;
+ compl_st = compl_ztc->pvt;
compl_st->chan_in_num = st->chan_out_num;
compl_st->chan_out_num = st->chan_in_num;
}
@@ -757,15 +732,28 @@
else
compl_ztc = &(wc->uencode->channels[ndx]);
+ /* If the channel complement (other half of the encoder/decoder pair) is not being used... */
if ((compl_ztc->flags & ZT_TC_FLAG_BUSY) == 0)
- {
+ {
+ if (st->encoder == 1)
+ wcdte_destroy_channel(wc, st->chan_in_num, st->chan_out_num);
+ else
+ wcdte_destroy_channel(wc, st->chan_out_num, st->chan_in_num);
+
/* Mark this channel as not built */
ztc->chan_built = 0;
-
+ ztc->built_fmts = 0;
+ st->chan_in_num = 999;
+ st->chan_out_num = 999;
+
/* Mark the channel complement as not built */
compl_ztc->chan_built = 0;
- }
-
+ compl_ztc->built_fmts = 0;
+ compl_st = compl_ztc->pvt;
+ compl_st->chan_in_num = 999;
+ compl_st->chan_out_num = 999;
+ }
+ st->dte_seqno_rcv = 0;
up(&wc->chansem);
break;
case ZT_TCOP_TRANSCODE:
@@ -1114,6 +1102,9 @@
}
+
+
+
/* static inline int wcdte_check_descriptor(struct wcdte *wc) */
static int wcdte_check_descriptor(struct wcdte *wc)
{
@@ -1529,30 +1520,10 @@
return(0);
}
-
-static int wcdte_create_channel(struct wcdte *wc, int part1_id, int part2_id, unsigned int *dte_chan1, unsigned int *dte_chan2)
-{
+static int wcdte_create_channel(struct wcdte *wc, int simple, int complicated, int part1_id, int part2_id, unsigned int *dte_chan1, unsigned int *dte_chan2)
+{
+ int length = 0;
unsigned char chan1, chan2;
-
- /* Create complex channel */
- zt_send_cmd(wc, CMD_MSG_CREATE_CHANNEL(wc->seq_num++, part1_id), CMD_MSG_CREATE_CHANNEL_LEN, 0x0010);
- zt_send_cmd(wc, CMD_MSG_QUERY_CHANNEL(wc->seq_num++, part1_id), CMD_MSG_QUERY_CHANNEL_LEN, 0x0010);
- chan1 = wc->last_rparm1;
-
- /* Create simple channel */
- zt_send_cmd(wc, CMD_MSG_CREATE_CHANNEL(wc->seq_num++, part2_id), CMD_MSG_CREATE_CHANNEL_LEN, 0x0010);
- zt_send_cmd(wc, CMD_MSG_QUERY_CHANNEL(wc->seq_num++, part2_id), CMD_MSG_QUERY_CHANNEL_LEN, 0x0010);
- chan2 = wc->last_rparm1;
-
- *dte_chan1 = chan1;
- *dte_chan2 = chan2;
-
- return 0;
-}
-
-static int wcdte_open_channel(struct wcdte *wc, int simple, int complicated, int part1_id, int part2_id, int chan1, int chan2)
-{
- int length = 0;
struct zt_transcoder_channel *ztc1, *ztc2;
struct dte_state *st1, *st2;
if(complicated == DTE_FORMAT_G729A)
@@ -1560,15 +1531,20 @@
else if (complicated == DTE_FORMAT_G723_1)
length = G723_LENGTH;
+ /* Create complex channel */
+ zt_send_cmd(wc, CMD_MSG_CREATE_CHANNEL(wc->seq_num++, part1_id), CMD_MSG_CREATE_CHANNEL_LEN, 0x0010);
+ zt_send_cmd(wc, CMD_MSG_QUERY_CHANNEL(wc->seq_num++, part1_id), CMD_MSG_QUERY_CHANNEL_LEN, 0x0010);
+ chan1 = wc->last_rparm1;
+
+ /* Create simple channel */
+ zt_send_cmd(wc, CMD_MSG_CREATE_CHANNEL(wc->seq_num++, part2_id), CMD_MSG_CREATE_CHANNEL_LEN, 0x0010);
+ zt_send_cmd(wc, CMD_MSG_QUERY_CHANNEL(wc->seq_num++, part2_id), CMD_MSG_QUERY_CHANNEL_LEN, 0x0010);
+ chan2 = wc->last_rparm1;
+
ztc1 = &(wc->uencode->channels[part1_id/2]);
ztc2 = &(wc->udecode->channels[part2_id/2]);
st1 = ztc1->pvt;
st2 = ztc2->pvt;
-
- if (force_alert) {
- printk("Sending FORCE ALERT\n");
- zt_send_cmd(wc, CMD_MSG_FORCE_ALERT(wc->seq_num++), CMD_MSG_FORCE_ALERT_LEN, 0xFFFF);
- }
/* Configure complex channel */
zt_send_cmd(wc, CMD_MSG_SET_IP_HDR_CHANNEL(st1->cmd_seqno++, chan1, part2_id, part1_id), CMD_MSG_SET_IP_HDR_CHANNEL_LEN, 0x9000);
@@ -1591,19 +1567,13 @@
zt_send_cmd(wc, CMD_MSG_VOIP_VOPENA(st1->cmd_seqno++, chan1, complicated), CMD_MSG_VOIP_VOPENA_LEN, 0x8000);
zt_send_cmd(wc, CMD_MSG_VOIP_VOPENA(st2->cmd_seqno++, chan2, simple), CMD_MSG_VOIP_VOPENA_LEN, 0x8000);
- return 0;
+ *dte_chan1 = chan1;
+ *dte_chan2 = chan2;
+
+ return 1;
}
static int wcdte_destroy_channel(struct wcdte *wc, unsigned int chan1, unsigned int chan2)
-{
- /* Remove the channels */
- zt_send_cmd(wc, CMD_MSG_DESTROY_CHANNEL(wc->seq_num++, chan1), CMD_MSG_DESTROY_CHANNEL_LEN, 0x0011);
- zt_send_cmd(wc, CMD_MSG_DESTROY_CHANNEL(wc->seq_num++, chan2), CMD_MSG_DESTROY_CHANNEL_LEN, 0x0011);
-
- return 0;
-}
-
-static int wcdte_close_channel(struct wcdte *wc, unsigned int chan1, unsigned int chan2)
{
struct zt_transcoder_channel *ztc1, *ztc2;
struct dte_state *st1, *st2;
@@ -1620,7 +1590,11 @@
/* Disconnect the channels */
zt_send_cmd(wc, CMD_MSG_TRANS_CONNECT(wc->seq_num++, 0, chan1, chan2, 0, 0), CMD_MSG_TRANS_CONNECT_LEN, 0x9322);
- return 0;
+ /* Remove the channels */
+ zt_send_cmd(wc, CMD_MSG_DESTROY_CHANNEL(wc->seq_num++, chan1), CMD_MSG_DESTROY_CHANNEL_LEN, 0x0011);
+ zt_send_cmd(wc, CMD_MSG_DESTROY_CHANNEL(wc->seq_num++, chan2), CMD_MSG_DESTROY_CHANNEL_LEN, 0x0011);
+
+ return 1;
}
More information about the svn-commits
mailing list