home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Amiga / Workbench / Archivers / gsmPPC.lha / gsmPPC / src / gsm_decode.c < prev    next >
C/C++ Source or Header  |  1998-04-27  |  11KB  |  362 lines

  1. /*
  2.  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3.  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
  4.  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5.  */
  6.  
  7. /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/gsm_decode.c,v 1.2 1996/07/02 09:59:05 jutta Exp $ */
  8.  
  9. #include "private.h"
  10.  
  11. #include "gsm.h"
  12. #include "proto.h"
  13.  
  14. int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
  15. {
  16.     word      LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
  17.  
  18. #ifdef WAV49
  19.     if (s->wav_fmt) {
  20.  
  21.         uword sr = 0;
  22.  
  23.         s->frame_index = !s->frame_index;
  24.         if (s->frame_index) {
  25.  
  26.             sr = *c++;
  27.             LARc[0] = sr & 0x3f;  sr >>= 6;
  28.             sr |= (uword)*c++ << 2;
  29.             LARc[1] = sr & 0x3f;  sr >>= 6;
  30.             sr |= (uword)*c++ << 4;
  31.             LARc[2] = sr & 0x1f;  sr >>= 5;
  32.             LARc[3] = sr & 0x1f;  sr >>= 5;
  33.             sr |= (uword)*c++ << 2;
  34.             LARc[4] = sr & 0xf;  sr >>= 4;
  35.             LARc[5] = sr & 0xf;  sr >>= 4;
  36.             sr |= (uword)*c++ << 2;            /* 5 */
  37.             LARc[6] = sr & 0x7;  sr >>= 3;
  38.             LARc[7] = sr & 0x7;  sr >>= 3;
  39.             sr |= (uword)*c++ << 4;
  40.             Nc[0] = sr & 0x7f;  sr >>= 7;
  41.             bc[0] = sr & 0x3;  sr >>= 2;
  42.             Mc[0] = sr & 0x3;  sr >>= 2;
  43.             sr |= (uword)*c++ << 1;
  44.             xmaxc[0] = sr & 0x3f;  sr >>= 6;
  45.             xmc[0] = sr & 0x7;  sr >>= 3;
  46.             sr = *c++;
  47.             xmc[1] = sr & 0x7;  sr >>= 3;
  48.             xmc[2] = sr & 0x7;  sr >>= 3;
  49.             sr |= (uword)*c++ << 2;
  50.             xmc[3] = sr & 0x7;  sr >>= 3;
  51.             xmc[4] = sr & 0x7;  sr >>= 3;
  52.             xmc[5] = sr & 0x7;  sr >>= 3;
  53.             sr |= (uword)*c++ << 1;            /* 10 */
  54.             xmc[6] = sr & 0x7;  sr >>= 3;
  55.             xmc[7] = sr & 0x7;  sr >>= 3;
  56.             xmc[8] = sr & 0x7;  sr >>= 3;
  57.             sr = *c++;
  58.             xmc[9] = sr & 0x7;  sr >>= 3;
  59.             xmc[10] = sr & 0x7;  sr >>= 3;
  60.             sr |= (uword)*c++ << 2;
  61.             xmc[11] = sr & 0x7;  sr >>= 3;
  62.             xmc[12] = sr & 0x7;  sr >>= 3;
  63.             sr |= (uword)*c++ << 4;
  64.             Nc[1] = sr & 0x7f;  sr >>= 7;
  65.             bc[1] = sr & 0x3;  sr >>= 2;
  66.             Mc[1] = sr & 0x3;  sr >>= 2;
  67.             sr |= (uword)*c++ << 1;
  68.             xmaxc[1] = sr & 0x3f;  sr >>= 6;
  69.             xmc[13] = sr & 0x7;  sr >>= 3;
  70.             sr = *c++;                /* 15 */
  71.             xmc[14] = sr & 0x7;  sr >>= 3;
  72.             xmc[15] = sr & 0x7;  sr >>= 3;
  73.             sr |= (uword)*c++ << 2;
  74.             xmc[16] = sr & 0x7;  sr >>= 3;
  75.             xmc[17] = sr & 0x7;  sr >>= 3;
  76.             xmc[18] = sr & 0x7;  sr >>= 3;
  77.             sr |= (uword)*c++ << 1;
  78.             xmc[19] = sr & 0x7;  sr >>= 3;
  79.             xmc[20] = sr & 0x7;  sr >>= 3;
  80.             xmc[21] = sr & 0x7;  sr >>= 3;
  81.             sr = *c++;
  82.             xmc[22] = sr & 0x7;  sr >>= 3;
  83.             xmc[23] = sr & 0x7;  sr >>= 3;
  84.             sr |= (uword)*c++ << 2;
  85.             xmc[24] = sr & 0x7;  sr >>= 3;
  86.             xmc[25] = sr & 0x7;  sr >>= 3;
  87.             sr |= (uword)*c++ << 4;            /* 20 */
  88.             Nc[2] = sr & 0x7f;  sr >>= 7;
  89.             bc[2] = sr & 0x3;  sr >>= 2;
  90.             Mc[2] = sr & 0x3;  sr >>= 2;
  91.             sr |= (uword)*c++ << 1;
  92.             xmaxc[2] = sr & 0x3f;  sr >>= 6;
  93.             xmc[26] = sr & 0x7;  sr >>= 3;
  94.             sr = *c++;
  95.             xmc[27] = sr & 0x7;  sr >>= 3;
  96.             xmc[28] = sr & 0x7;  sr >>= 3;
  97.             sr |= (uword)*c++ << 2;
  98.             xmc[29] = sr & 0x7;  sr >>= 3;
  99.             xmc[30] = sr & 0x7;  sr >>= 3;
  100.             xmc[31] = sr & 0x7;  sr >>= 3;
  101.             sr |= (uword)*c++ << 1;
  102.             xmc[32] = sr & 0x7;  sr >>= 3;
  103.             xmc[33] = sr & 0x7;  sr >>= 3;
  104.             xmc[34] = sr & 0x7;  sr >>= 3;
  105.             sr = *c++;                /* 25 */
  106.             xmc[35] = sr & 0x7;  sr >>= 3;
  107.             xmc[36] = sr & 0x7;  sr >>= 3;
  108.             sr |= (uword)*c++ << 2;
  109.             xmc[37] = sr & 0x7;  sr >>= 3;
  110.             xmc[38] = sr & 0x7;  sr >>= 3;
  111.             sr |= (uword)*c++ << 4;
  112.             Nc[3] = sr & 0x7f;  sr >>= 7;
  113.             bc[3] = sr & 0x3;  sr >>= 2;
  114.             Mc[3] = sr & 0x3;  sr >>= 2;
  115.             sr |= (uword)*c++ << 1;
  116.             xmaxc[3] = sr & 0x3f;  sr >>= 6;
  117.             xmc[39] = sr & 0x7;  sr >>= 3;
  118.             sr = *c++;
  119.             xmc[40] = sr & 0x7;  sr >>= 3;
  120.             xmc[41] = sr & 0x7;  sr >>= 3;
  121.             sr |= (uword)*c++ << 2;            /* 30 */
  122.             xmc[42] = sr & 0x7;  sr >>= 3;
  123.             xmc[43] = sr & 0x7;  sr >>= 3;
  124.             xmc[44] = sr & 0x7;  sr >>= 3;
  125.             sr |= (uword)*c++ << 1;
  126.             xmc[45] = sr & 0x7;  sr >>= 3;
  127.             xmc[46] = sr & 0x7;  sr >>= 3;
  128.             xmc[47] = sr & 0x7;  sr >>= 3;
  129.             sr = *c++;
  130.             xmc[48] = sr & 0x7;  sr >>= 3;
  131.             xmc[49] = sr & 0x7;  sr >>= 3;
  132.             sr |= (uword)*c++ << 2;
  133.             xmc[50] = sr & 0x7;  sr >>= 3;
  134.             xmc[51] = sr & 0x7;  sr >>= 3;
  135.  
  136.             s->frame_chain = sr & 0xf;
  137.         }
  138.         else {
  139.             sr = s->frame_chain;
  140.             sr |= (uword)*c++ << 4;            /* 1 */
  141.             LARc[0] = sr & 0x3f;  sr >>= 6;
  142.             LARc[1] = sr & 0x3f;  sr >>= 6;
  143.             sr = *c++;
  144.             LARc[2] = sr & 0x1f;  sr >>= 5;
  145.             sr |= (uword)*c++ << 3;
  146.             LARc[3] = sr & 0x1f;  sr >>= 5;
  147.             LARc[4] = sr & 0xf;  sr >>= 4;
  148.             sr |= (uword)*c++ << 2;
  149.             LARc[5] = sr & 0xf;  sr >>= 4;
  150.             LARc[6] = sr & 0x7;  sr >>= 3;
  151.             LARc[7] = sr & 0x7;  sr >>= 3;
  152.             sr = *c++;                /* 5 */
  153.             Nc[0] = sr & 0x7f;  sr >>= 7;
  154.             sr |= (uword)*c++ << 1;
  155.             bc[0] = sr & 0x3;  sr >>= 2;
  156.             Mc[0] = sr & 0x3;  sr >>= 2;
  157.             sr |= (uword)*c++ << 5;
  158.             xmaxc[0] = sr & 0x3f;  sr >>= 6;
  159.             xmc[0] = sr & 0x7;  sr >>= 3;
  160.             xmc[1] = sr & 0x7;  sr >>= 3;
  161.             sr |= (uword)*c++ << 1;
  162.             xmc[2] = sr & 0x7;  sr >>= 3;
  163.             xmc[3] = sr & 0x7;  sr >>= 3;
  164.             xmc[4] = sr & 0x7;  sr >>= 3;
  165.             sr = *c++;
  166.             xmc[5] = sr & 0x7;  sr >>= 3;
  167.             xmc[6] = sr & 0x7;  sr >>= 3;
  168.             sr |= (uword)*c++ << 2;            /* 10 */
  169.             xmc[7] = sr & 0x7;  sr >>= 3;
  170.             xmc[8] = sr & 0x7;  sr >>= 3;
  171.             xmc[9] = sr & 0x7;  sr >>= 3;
  172.             sr |= (uword)*c++ << 1;
  173.             xmc[10] = sr & 0x7;  sr >>= 3;
  174.             xmc[11] = sr & 0x7;  sr >>= 3;
  175.             xmc[12] = sr & 0x7;  sr >>= 3;
  176.             sr = *c++;
  177.             Nc[1] = sr & 0x7f;  sr >>= 7;
  178.             sr |= (uword)*c++ << 1;
  179.             bc[1] = sr & 0x3;  sr >>= 2;
  180.             Mc[1] = sr & 0x3;  sr >>= 2;
  181.             sr |= (uword)*c++ << 5;
  182.             xmaxc[1] = sr & 0x3f;  sr >>= 6;
  183.             xmc[13] = sr & 0x7;  sr >>= 3;
  184.             xmc[14] = sr & 0x7;  sr >>= 3;
  185.             sr |= (uword)*c++ << 1;            /* 15 */
  186.             xmc[15] = sr & 0x7;  sr >>= 3;
  187.             xmc[16] = sr & 0x7;  sr >>= 3;
  188.             xmc[17] = sr & 0x7;  sr >>= 3;
  189.             sr = *c++;
  190.             xmc[18] = sr & 0x7;  sr >>= 3;
  191.             xmc[19] = sr & 0x7;  sr >>= 3;
  192.             sr |= (uword)*c++ << 2;
  193.             xmc[20] = sr & 0x7;  sr >>= 3;
  194.             xmc[21] = sr & 0x7;  sr >>= 3;
  195.             xmc[22] = sr & 0x7;  sr >>= 3;
  196.             sr |= (uword)*c++ << 1;
  197.             xmc[23] = sr & 0x7;  sr >>= 3;
  198.             xmc[24] = sr & 0x7;  sr >>= 3;
  199.             xmc[25] = sr & 0x7;  sr >>= 3;
  200.             sr = *c++;
  201.             Nc[2] = sr & 0x7f;  sr >>= 7;
  202.             sr |= (uword)*c++ << 1;            /* 20 */
  203.             bc[2] = sr & 0x3;  sr >>= 2;
  204.             Mc[2] = sr & 0x3;  sr >>= 2;
  205.             sr |= (uword)*c++ << 5;
  206.             xmaxc[2] = sr & 0x3f;  sr >>= 6;
  207.             xmc[26] = sr & 0x7;  sr >>= 3;
  208.             xmc[27] = sr & 0x7;  sr >>= 3;
  209.             sr |= (uword)*c++ << 1;    
  210.             xmc[28] = sr & 0x7;  sr >>= 3;
  211.             xmc[29] = sr & 0x7;  sr >>= 3;
  212.             xmc[30] = sr & 0x7;  sr >>= 3;
  213.             sr = *c++;
  214.             xmc[31] = sr & 0x7;  sr >>= 3;
  215.             xmc[32] = sr & 0x7;  sr >>= 3;
  216.             sr |= (uword)*c++ << 2;
  217.             xmc[33] = sr & 0x7;  sr >>= 3;
  218.             xmc[34] = sr & 0x7;  sr >>= 3;
  219.             xmc[35] = sr & 0x7;  sr >>= 3;
  220.             sr |= (uword)*c++ << 1;            /* 25 */
  221.             xmc[36] = sr & 0x7;  sr >>= 3;
  222.             xmc[37] = sr & 0x7;  sr >>= 3;
  223.             xmc[38] = sr & 0x7;  sr >>= 3;
  224.             sr = *c++;
  225.             Nc[3] = sr & 0x7f;  sr >>= 7;
  226.             sr |= (uword)*c++ << 1;        
  227.             bc[3] = sr & 0x3;  sr >>= 2;
  228.             Mc[3] = sr & 0x3;  sr >>= 2;
  229.             sr |= (uword)*c++ << 5;
  230.             xmaxc[3] = sr & 0x3f;  sr >>= 6;
  231.             xmc[39] = sr & 0x7;  sr >>= 3;
  232.             xmc[40] = sr & 0x7;  sr >>= 3;
  233.             sr |= (uword)*c++ << 1;
  234.             xmc[41] = sr & 0x7;  sr >>= 3;
  235.             xmc[42] = sr & 0x7;  sr >>= 3;
  236.             xmc[43] = sr & 0x7;  sr >>= 3;
  237.             sr = *c++;                /* 30 */
  238.             xmc[44] = sr & 0x7;  sr >>= 3;
  239.             xmc[45] = sr & 0x7;  sr >>= 3;
  240.             sr |= (uword)*c++ << 2;
  241.             xmc[46] = sr & 0x7;  sr >>= 3;
  242.             xmc[47] = sr & 0x7;  sr >>= 3;
  243.             xmc[48] = sr & 0x7;  sr >>= 3;
  244.             sr |= (uword)*c++ << 1;
  245.             xmc[49] = sr & 0x7;  sr >>= 3;
  246.             xmc[50] = sr & 0x7;  sr >>= 3;
  247.             xmc[51] = sr & 0x7;  sr >>= 3;
  248.         }
  249.     }
  250.     else
  251. #endif
  252.     {
  253.         /* GSM_MAGIC  = (*c >> 4) & 0xF; */
  254.  
  255.         if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
  256.  
  257.         LARc[0]  = (*c++ & 0xF) << 2;        /* 1 */
  258.         LARc[0] |= (*c >> 6) & 0x3;
  259.         LARc[1]  = *c++ & 0x3F;
  260.         LARc[2]  = (*c >> 3) & 0x1F;
  261.         LARc[3]  = (*c++ & 0x7) << 2;
  262.         LARc[3] |= (*c >> 6) & 0x3;
  263.         LARc[4]  = (*c >> 2) & 0xF;
  264.         LARc[5]  = (*c++ & 0x3) << 2;
  265.         LARc[5] |= (*c >> 6) & 0x3;
  266.         LARc[6]  = (*c >> 3) & 0x7;
  267.         LARc[7]  = *c++ & 0x7;
  268.         Nc[0]  = (*c >> 1) & 0x7F;
  269.         bc[0]  = (*c++ & 0x1) << 1;
  270.         bc[0] |= (*c >> 7) & 0x1;
  271.         Mc[0]  = (*c >> 5) & 0x3;
  272.         xmaxc[0]  = (*c++ & 0x1F) << 1;
  273.         xmaxc[0] |= (*c >> 7) & 0x1;
  274.         xmc[0]  = (*c >> 4) & 0x7;
  275.         xmc[1]  = (*c >> 1) & 0x7;
  276.         xmc[2]  = (*c++ & 0x1) << 2;
  277.         xmc[2] |= (*c >> 6) & 0x3;
  278.         xmc[3]  = (*c >> 3) & 0x7;
  279.         xmc[4]  = *c++ & 0x7;
  280.         xmc[5]  = (*c >> 5) & 0x7;
  281.         xmc[6]  = (*c >> 2) & 0x7;
  282.         xmc[7]  = (*c++ & 0x3) << 1;        /* 10 */
  283.         xmc[7] |= (*c >> 7) & 0x1;
  284.         xmc[8]  = (*c >> 4) & 0x7;
  285.         xmc[9]  = (*c >> 1) & 0x7;
  286.         xmc[10]  = (*c++ & 0x1) << 2;
  287.         xmc[10] |= (*c >> 6) & 0x3;
  288.         xmc[11]  = (*c >> 3) & 0x7;
  289.         xmc[12]  = *c++ & 0x7;
  290.         Nc[1]  = (*c >> 1) & 0x7F;
  291.         bc[1]  = (*c++ & 0x1) << 1;
  292.         bc[1] |= (*c >> 7) & 0x1;
  293.         Mc[1]  = (*c >> 5) & 0x3;
  294.         xmaxc[1]  = (*c++ & 0x1F) << 1;
  295.         xmaxc[1] |= (*c >> 7) & 0x1;
  296.         xmc[13]  = (*c >> 4) & 0x7;
  297.         xmc[14]  = (*c >> 1) & 0x7;
  298.         xmc[15]  = (*c++ & 0x1) << 2;
  299.         xmc[15] |= (*c >> 6) & 0x3;
  300.         xmc[16]  = (*c >> 3) & 0x7;
  301.         xmc[17]  = *c++ & 0x7;
  302.         xmc[18]  = (*c >> 5) & 0x7;
  303.         xmc[19]  = (*c >> 2) & 0x7;
  304.         xmc[20]  = (*c++ & 0x3) << 1;
  305.         xmc[20] |= (*c >> 7) & 0x1;
  306.         xmc[21]  = (*c >> 4) & 0x7;
  307.         xmc[22]  = (*c >> 1) & 0x7;
  308.         xmc[23]  = (*c++ & 0x1) << 2;
  309.         xmc[23] |= (*c >> 6) & 0x3;
  310.         xmc[24]  = (*c >> 3) & 0x7;
  311.         xmc[25]  = *c++ & 0x7;
  312.         Nc[2]  = (*c >> 1) & 0x7F;
  313.         bc[2]  = (*c++ & 0x1) << 1;        /* 20 */
  314.         bc[2] |= (*c >> 7) & 0x1;
  315.         Mc[2]  = (*c >> 5) & 0x3;
  316.         xmaxc[2]  = (*c++ & 0x1F) << 1;
  317.         xmaxc[2] |= (*c >> 7) & 0x1;
  318.         xmc[26]  = (*c >> 4) & 0x7;
  319.         xmc[27]  = (*c >> 1) & 0x7;
  320.         xmc[28]  = (*c++ & 0x1) << 2;
  321.         xmc[28] |= (*c >> 6) & 0x3;
  322.         xmc[29]  = (*c >> 3) & 0x7;
  323.         xmc[30]  = *c++ & 0x7;
  324.         xmc[31]  = (*c >> 5) & 0x7;
  325.         xmc[32]  = (*c >> 2) & 0x7;
  326.         xmc[33]  = (*c++ & 0x3) << 1;
  327.         xmc[33] |= (*c >> 7) & 0x1;
  328.         xmc[34]  = (*c >> 4) & 0x7;
  329.         xmc[35]  = (*c >> 1) & 0x7;
  330.         xmc[36]  = (*c++ & 0x1) << 2;
  331.         xmc[36] |= (*c >> 6) & 0x3;
  332.         xmc[37]  = (*c >> 3) & 0x7;
  333.         xmc[38]  = *c++ & 0x7;
  334.         Nc[3]  = (*c >> 1) & 0x7F;
  335.         bc[3]  = (*c++ & 0x1) << 1;
  336.         bc[3] |= (*c >> 7) & 0x1;
  337.         Mc[3]  = (*c >> 5) & 0x3;
  338.         xmaxc[3]  = (*c++ & 0x1F) << 1;
  339.         xmaxc[3] |= (*c >> 7) & 0x1;
  340.         xmc[39]  = (*c >> 4) & 0x7;
  341.         xmc[40]  = (*c >> 1) & 0x7;
  342.         xmc[41]  = (*c++ & 0x1) << 2;
  343.         xmc[41] |= (*c >> 6) & 0x3;
  344.         xmc[42]  = (*c >> 3) & 0x7;
  345.         xmc[43]  = *c++ & 0x7;            /* 30  */
  346.         xmc[44]  = (*c >> 5) & 0x7;
  347.         xmc[45]  = (*c >> 2) & 0x7;
  348.         xmc[46]  = (*c++ & 0x3) << 1;
  349.         xmc[46] |= (*c >> 7) & 0x1;
  350.         xmc[47]  = (*c >> 4) & 0x7;
  351.         xmc[48]  = (*c >> 1) & 0x7;
  352.         xmc[49]  = (*c++ & 0x1) << 2;
  353.         xmc[49] |= (*c >> 6) & 0x3;
  354.         xmc[50]  = (*c >> 3) & 0x7;
  355.         xmc[51]  = *c & 0x7;            /* 33 */
  356.     }
  357.  
  358.     Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
  359.  
  360.     return 0;
  361. }
  362.