Home | History | Annotate | Download | only in audio
      1 import ctypes
      2 import sys
      3 import os
      4 import array
      5 
      6 global arrayelementsize
      7 
      8 
      9 def Generate_CRC(inlist):
     10     crc = int(~0)&0xffffffff
     11     for i in range(len(inlist)-1):
     12         crc = crc ^ (int(inlist[i]&0xffffffff))
     13         for j in range(4*8):
     14             crc = ((int(crc >> 1)&0xffffffff) ^ int(0xEDB88320 & ((-(crc & 1))&0xffffffff)  ))&0xffffffff
     15 
     16     crc=(~crc)&0xffffffff
     17 
     18 
     19     if (crc>0x7fffffff):
     20         crc=-(0x7fffffff-(crc&0x7fffffff)+1)
     21 
     22     print("Calculated CRC= ", crc)
     23     print("Actual CRC=", inlist[len(inlist)-1])
     24 
     25     return(crc)
     26 
     27 
     28 def convertto24bit(binarydata):
     29 
     30     if (binarydata[14]==2):
     31         print("16 bit detected")
     32         binarydata[14]=4
     33     elif (binarydata[14]==4):
     34         print("24 bit detected")
     35         return(1)
     36     else:
     37         print("unknown config")
     38         return(0)
     39 
     40     ilist = [16,18,20]
     41 
     42     for i in ilist:
     43         if (binarydata[i]==2):
     44             binarydata[i]=4
     45         elif (binarydata[14]==4):
     46             print("unknown config 4")
     47             return(0)
     48         else:
     49             print("unknown config")
     50             return(0)
     51 
     52     for i in range(21,len(binarydata)-1):
     53         if (binarydata[i]==17):
     54             if (binarydata[i+1]==0):
     55                 binarydata[i]=53
     56             if (binarydata[i+1]==1):
     57                 binarydata[i]=53
     58             if (binarydata[i+1]==2):
     59                 binarydata[i]=53
     60             if (binarydata[i+1]==3):
     61                 binarydata[i]=53
     62         if (binarydata[i]==16):
     63             if (binarydata[i+1]==5):
     64                 binarydata[i]=52
     65             if (binarydata[i+1]==4):
     66                 binarydata[i]=52
     67 
     68     crc=Generate_CRC(binarydata)
     69     binarydata[len(binarydata)-1]=crc
     70     return(1)
     71 
     72 
     73 def detectbitpersample(binarydata):
     74 
     75     if (binarydata[14]==4):
     76         print("24 bit detected")
     77     elif (binarydata[14]==2):
     78         print("16 bit detected")
     79     else:
     80         print("unknown config")
     81 
     82 def convertto16bit(binarydata):
     83 
     84     if (binarydata[14]==4):
     85         print("24 bit detected")
     86         binarydata[14]=2
     87     elif (binarydata[14]==2):
     88         print("16 bit detected")
     89         return(1)
     90     else:
     91         print("unknown config")
     92         return(0)
     93 
     94     ilist = [16,18,20]
     95 
     96     for i in ilist:
     97         if (binarydata[i]==4):
     98             binarydata[i]=2
     99         elif (binarydata[14]==2):
    100             print("unknown config 4")
    101             return(0)
    102         else:
    103             print("unknown config")
    104             return(0)
    105 
    106     for i in range(21,len(binarydata)-1):
    107         if (binarydata[i]==53):
    108             if (binarydata[i+1]==0):
    109                 binarydata[i]=17
    110             if (binarydata[i+1]==1):
    111                 binarydata[i]=17
    112             if (binarydata[i+1]==2):
    113                 binarydata[i]=17
    114             if (binarydata[i+1]==3):
    115                 binarydata[i]=17
    116         if (binarydata[i]==52):
    117             if (binarydata[i+1]==5):
    118                 binarydata[i]=16
    119             if (binarydata[i+1]==4):
    120                 binarydata[i]=16
    121 
    122     crc=Generate_CRC(binarydata)
    123     binarydata[len(binarydata)-1]=crc
    124     return(1)
    125 
    126 
    127 def binary2header(fileinput,fileinput1,fileoutput,to24bit,fileoutput1,fileoutput2):
    128     binarydata=array.array(arrayelementsize)
    129     file=open(fileinput,'rb')
    130     if file==-1:
    131         print('error cannot open file for reading:',fileinput)
    132         return
    133     file.seek(0,2)
    134     arraysize=int(file.tell()/4)
    135     print('length of config string RX:', arraysize)
    136     file.seek(0,0)
    137     binarydata.fromfile(file,arraysize)
    138     file.close()
    139 
    140     binarydata1=array.array(arrayelementsize)
    141     file1=open(fileinput1,'rb')
    142     if file1==-1:
    143         print('error cannot open file for reading:',fileinput)
    144         return
    145     file1.seek(0,2)
    146     arraysize1=int(file1.tell()/4)
    147     print('length of config string TX:', arraysize1)
    148     file1.seek(0,0)
    149     binarydata1.fromfile(file1,arraysize1)
    150     file1.close()
    151 
    152 
    153 
    154     if (to24bit==0):
    155         detectbitpersample(binarydata)
    156 
    157     elif (to24bit==1):
    158         result=convertto16bit(binarydata)
    159         if (result==0):
    160             print("Problem converting to 16bit")
    161             exit(0)
    162 
    163     elif (to24bit==2):
    164         result=convertto24bit(binarydata)
    165         if (result==0):
    166             print("Problem converting to 24bit")
    167             exit(0)
    168 
    169 
    170     fileo=open(fileoutput,'wt')
    171     if (fileo==-1):
    172         print('error cannot open file for writing:',fileoutput)
    173         return
    174 
    175     fileo.write('\n\n\n#define CSPL_CONFIG_RX ')
    176 
    177     for i in range(len(binarydata)-1):
    178         fileo.write(str(binarydata[i])+', ')
    179 
    180     fileo.write(str(binarydata[len(binarydata)-1])+'\n\n\n\n')
    181 
    182     fileo.write('\n\n\n#define CSPL_CONFIG_TX ')
    183 
    184     for i in range(len(binarydata1)-1):
    185         fileo.write(str(binarydata1[i])+', ')
    186 
    187     fileo.write(str(binarydata1[len(binarydata1)-1])+'\n\n\n\n')
    188 
    189     fileo.close()
    190     print('wrote file:',fileoutput)
    191 
    192     if (fileoutput1!=None):
    193         fileo=open(fileoutput1,'wb')
    194         if (fileo==-1):
    195             print('error cannot open file for writing:',fileoutput1)
    196             return
    197 
    198         binarydata.tofile(fileo)
    199         fileo.close()
    200         print('wrote file:',fileoutput1)
    201 
    202     if (fileoutput2!=None):
    203         fileo=open(fileoutput2,'wb')
    204         if (fileo==-1):
    205             print('error cannot open file for writing:',fileoutput2)
    206             return
    207 
    208         binarydata1.tofile(fileo)
    209         fileo.close()
    210         print('wrote file:',fileoutput2)
    211 
    212 
    213 
    214 def header2binary(fileinput,fileoutput,to24bit,fileoutput1,fileoutput2):
    215     RX=array.array(arrayelementsize)
    216     TX=array.array(arrayelementsize)
    217     file=open(fileinput,'rt')
    218     if file==-1:
    219         print('error cannot open file for reading:',fileinput)
    220         return
    221 
    222     while True:
    223         line=file.readline()
    224         sline=line.split()
    225         if (len(sline)>1):
    226             if (sline[1]=='CSPL_CONFIG_RX'):
    227                 for r in range(2,len(sline)-1,1):
    228                     RX.append(int(sline[r][0:len(sline[r])-1]))
    229                 RX.append(int(sline[len(sline)-1]))
    230 
    231             if (sline[1]=='CSPL_CONFIG_TX'):
    232                 for r in range(2,len(sline)-1,1):
    233                     TX.append(int(sline[r][0:len(sline[r])-1]))
    234                 TX.append(int(sline[len(sline)-1]))
    235 
    236         if (line == ''):
    237             break
    238 
    239     file.close()
    240 
    241     if (to24bit==0):
    242         detectbitpersample(RX)
    243 
    244     elif (to24bit==1):
    245         result=convertto16bit(RX)
    246         if (result==0):
    247             print("Problem converting to 16bit")
    248             exit(0)
    249 
    250     elif (to24bit==2):
    251         result=convertto24bit(RX)
    252         if (result==0):
    253             print("Problem converting to 24bit")
    254             exit(0)
    255 
    256     if (fileoutput!=None):
    257         fileo=open(fileoutput,'wt')
    258         if (fileo==-1):
    259             print('error cannot open file for writing:',fileoutput)
    260             return
    261         if (len(RX)>0):
    262             fileo.write('\n\n\n#define CSPL_CONFIG_RX ')
    263 
    264             for i in range(len(RX)-1):
    265                 fileo.write(str(RX[i])+', ')
    266 
    267             fileo.write(str(RX[len(RX)-1])+'\n\n\n\n')
    268 
    269         if (len(TX)>0):
    270             fileo.write('\n\n\n#define CSPL_CONFIG_TX ')
    271 
    272             for i in range(len(TX)-1):
    273                 fileo.write(str(TX[i])+', ')
    274 
    275             fileo.write(str(TX[len(TX)-1])+'\n\n\n\n')
    276 
    277         fileo.close()
    278         print('wrote file:',fileoutput)
    279 
    280     if (len(RX)>0):
    281         if (fileoutput1!=None):
    282             fileo=open(fileoutput1,'wb')
    283             if (fileo==-1):
    284                 print('error cannot open file for writing:',fileoutput1)
    285                 return
    286             RX.tofile(fileo)
    287             fileo.close()
    288             print('wrote file:',fileoutput1)
    289 
    290     if (len(TX)>0):
    291         if (fileoutput2!=None):
    292             fileo=open(fileoutput2,'wb')
    293             if (fileo==-1):
    294                 print('error cannot open file for writing:',fileoutput2)
    295                 return
    296             TX.tofile(fileo)
    297             fileo.close()
    298             print('wrote file:',fileoutput2)
    299 
    300     pass
    301 
    302 
    303 def usage():
    304     print('Possible usages: ')
    305     print('1. Convert from binary to text header file:')
    306     print('\t\targs: bin <binary file RX> <binary file TX> <output text file>')
    307 
    308     print('2. Convert from binary from 16bit to 24bit then output to text header file:')
    309     print('\t\targs: bin16 <binary file RX> <binary file TX> <output text file>')
    310 
    311     print('3. Convert from binary from 16bit to 24bit then output to text header file and binary file')
    312     print('\t\targs: bin16 <binary file RX> <binary file TX> <output text file> <binary rx file> <binary tx file>')
    313 
    314     print('4. Convert from binary from 24bit to 16bit then output to text header file:')
    315     print('\t\targs: bin24 <binary file RX> <binary file TX> <output text file>')
    316 
    317     print('5. Convert from binary from 24bit to 16bit then output to text header file and binary file')
    318     print('\t\targs: bin24 <binary file RX> <binary file TX> <output text file> <binary rx file> <binary tx file>')
    319 
    320     print('6. Convert from text to binary file')
    321     print('\t\targs: txt <text file> <output binary file RX> <output binary file TX>')
    322 
    323     print('7. Convert from text 16bit to 24bit to text file')
    324     print('\t\targs: txt16 <text file> <text output file>')
    325 
    326     print('8. Convert from text 16bit to 24bit to text file and binary files')
    327     print('\t\targs: txt16 <text file> <text output file> <output binary file RX> <output binary file TX>')
    328 
    329     print('9. Convert from text 24bit to 16bit to text file')
    330     print('\t\targs: txt24 <text file> <text output file>')
    331 
    332     print('10. Convert from text 24bit to 16bit to text file and binary files')
    333     print('\t\targs: txt24 <text file> <text output file> <output binary file RX> <output binary file TX>')
    334 
    335 
    336 
    337     return
    338 
    339 
    340 
    341 def main(argv):
    342 
    343     print('CSPL config string conversion used for android system')
    344 
    345     if (len(argv)<4):
    346         usage()
    347         return
    348 
    349     global arrayelementsize
    350 
    351     print("python version: ",sys.version_info)
    352     print("Current Os name: ",os.name)
    353 
    354     validsize=0
    355     for r in ['l','i']:
    356         arrayelementsize=r
    357         t=array.array(arrayelementsize)
    358         if (t.itemsize==4):
    359             validsize=1
    360             break
    361 
    362     if (validsize!=1):
    363         print("Expected element size donot match firmware requirement")
    364 
    365 
    366     if   (argv[1]=='bin'):
    367         binary2header(argv[2],argv[3],argv[4],0)
    368     elif (argv[1]=='txt'):
    369         header2binary(argv[2],None,0,argv[3],argv[4])
    370     elif   (argv[1]=='bin16'):
    371         if (len(argv)==5):
    372             binary2header(argv[2],argv[3],argv[4],1,None,None)
    373         elif (len(argv)==7):
    374             binary2header(argv[2],argv[3],argv[4],1,argv[5],argv[6])
    375     elif   (argv[1]=='bin24'):
    376         if (len(argv)==5):
    377             binary2header(argv[2],argv[3],argv[4],2,None,None)
    378         elif (len(argv)==7):
    379             binary2header(argv[2],argv[3],argv[4],2,argv[5],argv[6])
    380     elif   (argv[1]=='txt16'):
    381         if (len(argv)==4):
    382             header2binary(argv[2],argv[3],1,None,None)
    383         elif (len(argv)==6):
    384             header2binary(argv[2],argv[3],1,argv[4],argv[5])
    385     elif   (argv[1]=='txt24'):
    386         if (len(argv)==4):
    387             header2binary(argv[2],argv[3],2,None,None)
    388         elif (len(argv)==6):
    389             header2binary(argv[2],argv[3],2,argv[4],argv[5])
    390 
    391     else :
    392         usage()
    393         return
    394 
    395 
    396 if __name__ == "__main__":
    397     main(sys.argv)
    398