Fix NULL pointer audio frame problem.
authorAndreas Eversberg <jolly@eversberg.eu>
Thu, 18 Mar 2010 08:13:38 +0000 (09:13 +0100)
committerAndreas Eversberg <jolly@eversberg.eu>
Thu, 18 Mar 2010 08:13:38 +0000 (09:13 +0100)
The problem occurred when IAX protocol sends silence frame.

Thanx to Peter for finding the problem and providing patch.

bchannel.c

index baa8434..5793795 100644 (file)
@@ -418,26 +418,29 @@ void bchannel_transmit(struct bchannel *bchannel, unsigned char *data, int len)
                return;
        if (len > 1024 || len < 1)
                return;
-       switch(bchannel->b_mode) {
-       case 0:
-               for (i = 0; i < len; i++)
-                       *p++ = flip_bits[*data++];
-               frm->prim = DL_DATA_REQ;
-               break;
-       case 1:
-               for (i = 0; i < len; i++)
-                       *p++ = flip_bits[*data++];
-               frm->prim = PH_DATA_REQ;
-               break;
-       case 2:
-               memcpy(p, data, len);
-               frm->prim = DL_DATA_REQ;
-               break;
-       case 3:
-               memcpy(p, data, len);
-               frm->prim = PH_DATA_REQ;
-               break;
-       }
+       if (data) {
+               switch(bchannel->b_mode) {
+               case 0:
+                       for (i = 0; i < len; i++)
+                               *p++ = flip_bits[*data++];
+                       frm->prim = DL_DATA_REQ;
+                       break;
+               case 1:
+                       for (i = 0; i < len; i++)
+                               *p++ = flip_bits[*data++];
+                       frm->prim = PH_DATA_REQ;
+                       break;
+               case 2:
+                       memcpy(p, data, len);
+                       frm->prim = DL_DATA_REQ;
+                       break;
+               case 3:
+                       memcpy(p, data, len);
+                       frm->prim = PH_DATA_REQ;
+                       break;
+               }
+       } else
+               memset(p, flip_bits[(options.law=='a')?0x2a:0xff], len);
        frm->id = 0;
 #ifdef SEAMLESS_TEST
        unsigned char test_tone[8] = {0x2a, 0x24, 0xb4, 0x24, 0x2a, 0x25, 0xb5, 0x25};