fceux/attic/sexyal/convertgen.c

156 lines
3.9 KiB
C

#include <stdio.h>
char *check[]={"SEXYAL_FMT_PCMS8","SEXYAL_FMT_PCMU8","SEXYAL_FMT_PCMS16",
"SEXYAL_FMT_PCMU16","SEXYAL_FMT_PCMS32S16","SEXYAL_FMT_PCMU32U16","SEXYAL_FMT_PCMS32S24","SEXYAL_FMT_PCMU32U24"};
char *str[]={"int8_t","uint8_t","int16_t","uint16_t","int32_t","uint32_t","int32_t","uint32_t"};
int bitss[]={8,8,16,16,16,16,24,24};
int bitsreal[]={8,8,16,16,32,32,32,32};
void Fetch(int x,char *wt)
{
//printf(" int32_t tmp%s=*src;\n",wt);
printf("tmp%s=*src;\n",wt);
printf(" src++;\n");
}
void BitConv(int src, int dest, char *wt)
{
if((src^dest)&1) /* signed/unsigned change. */
if(src&1) /* Source unsigned, dest signed. */
{
if(src==1) printf(" tmp%s-=128;\n",wt);
else if(src==3) printf(" tmp%s-=32768;\n",wt);
else if(src==5) printf(" tmp%s-=32768;\n",wt);
else if(src==7) printf(" tmp%s-=(1<<23);\n",wt);
}
else /* Source signed, dest unsigned */
{
if(src==0) printf(" tmp%s+=128;\n",wt);
else if(src==2) printf(" tmp%s+=32768;\n",wt);
else if(src==4) printf(" tmp%s+=32768;\n",wt);
else if(src==6) printf(" tmp%s+=(1<<23);\n",wt);
}
if((src>>1) != (dest>>1))
{
int shifty=bitss[src]-bitss[dest];
if(shifty>0)
printf(" tmp%s >>= %d;\n",wt,shifty);
else
printf(" tmp%s <<= %d;\n",wt,-shifty);
}
}
void Save(int x, char *wt)
{
printf(" *dest=tmp%s;\n",wt);
printf(" dest++;\n");
}
main()
{
int srcbits,destbits,srcchannels,destchannels;
int srcbo,destbo;
puts("void SexiALI_Convert(SexyAL_format *srcformat, SexyAL_format *destformat, void *vdest, void *vsrc, uint32_t frames)");
puts("{");
for(srcbits=0;srcbits<8;srcbits++)
{
printf("if(srcformat->sampformat == %s)\n{\n",check[srcbits]);
printf("%s* src=vsrc;\n",str[srcbits]);
for(destbits=0;destbits<8;destbits++)
{
printf("if(destformat->sampformat == %s)\n{\n",check[destbits]);
printf("%s* dest=vdest;\n",str[destbits]);
for(srcchannels=0;srcchannels<2;srcchannels++)
{
printf("if(srcformat->channels == %c)\n{\n",'1'+srcchannels);
for(destchannels=0;destchannels<2;destchannels++)
{
printf("if(destformat->channels == %c)\n{\n",'1'+destchannels);
for(srcbo=0;srcbo<2;srcbo++)
{
printf("if(srcformat->byteorder == %d)\n{\n",srcbo);
for(destbo=0;destbo<2;destbo++)
{
printf("if(destformat->byteorder == %d)\n{\n",destbo);
//printf("if(srcformat->sampformat==%s && destformat->sameck[srcbits],check[destbits]);
printf("while(frames--)\n{\n");
puts("int32_t tmp;");
if(srcchannels)
puts("int32_t tmp2;");
Fetch(srcbits,"");
if(srcbo)
{
if(bitsreal[srcbits]==16)
puts("FLIP16(tmp);");
else
puts("FLIP32(tmp);");
}
if(srcchannels)
{
Fetch(srcbits,"2");
if(srcbo)
{
if(bitsreal[srcbits]==16)
puts("FLIP16(tmp2);");
else
puts("FLIP32(tmp2);");
}
}
BitConv(srcbits,destbits,"");
if(srcchannels) BitConv(srcbits,destbits,"2");
if(destbo)
{
if(bitsreal[srcbits]==16)
puts("FLIP16(tmp);");
else
puts("FLIP32(tmp);");
if(srcchannels && destchannels && destbo)
{
if(bitsreal[srcbits]==16)
puts("FLIP16(tmp2);");
else
puts("FLIP32(tmp2);");
}
}
if(srcchannels && !destchannels)
printf("tmp = (tmp+tmp2)>>1;\n");
Save(destbits,"");
if(!srcchannels && destchannels)
Save(destbits,"");
if(srcchannels && destchannels)
Save(destbits,"2");
puts("}");
puts("}");
} // destbo
puts("}");
} // srcbo
puts("}");
}
puts("}");
}
puts("}");
}
puts("}");
}
puts("}");
}