📄 gogo_a.c
字号:
}}static void set_gogo_opts(void){ if(gogo_opts.optENCODEMODE>=0) MPGE_setConfigure(MC_ENCODEMODE,(UPARAM)gogo_opts.optENCODEMODE,(UPARAM)0); if(gogo_opts.optINPFREQ>=0) MPGE_setConfigure(MC_INPFREQ,(UPARAM)gogo_opts.optINPFREQ,(UPARAM)0); if(gogo_opts.optOUTFREQ>=0) MPGE_setConfigure(MC_OUTFREQ,(UPARAM)gogo_opts.optOUTFREQ,(UPARAM)0); if(gogo_opts.optSTARTOFFSET>=0) MPGE_setConfigure(MC_STARTOFFSET,(UPARAM)gogo_opts.optSTARTOFFSET,(UPARAM)0); if(gogo_opts.optUSEPSY>=0) MPGE_setConfigure(MC_USEPSY,(UPARAM)gogo_opts.optUSEPSY,(UPARAM)0); if(gogo_opts.optUSELPF16>=0) MPGE_setConfigure(MC_USELPF16,(UPARAM)gogo_opts.optUSELPF16,(UPARAM)0); if(gogo_opts.optUSEMMX>=0) MPGE_setConfigure(MC_USEMMX,(UPARAM)gogo_opts.optUSEMMX,(UPARAM)0); if(gogo_opts.optUSE3DNOW>=0) MPGE_setConfigure(MC_USE3DNOW,(UPARAM)gogo_opts.optUSE3DNOW,(UPARAM)0); if(gogo_opts.optUSEKNI>=0) MPGE_setConfigure(MC_USEKNI,(UPARAM)gogo_opts.optUSEKNI,(UPARAM)0); if(gogo_opts.optUSEE3DNOW>=0) MPGE_setConfigure(MC_USEE3DNOW,(UPARAM)gogo_opts.optUSEE3DNOW,(UPARAM)0); if(gogo_opts.optUSESSE>=0) MPGE_setConfigure(MC_USESSE,(UPARAM)gogo_opts.optUSESSE,(UPARAM)0); if(gogo_opts.optUSECMOV>=0) MPGE_setConfigure(MC_USECMOV,(UPARAM)gogo_opts.optUSECMOV,(UPARAM)0); if(gogo_opts.optUSEEMMX>=0) MPGE_setConfigure(MC_USEEMMX,(UPARAM)gogo_opts.optUSEEMMX,(UPARAM)0); if(gogo_opts.optUSESSE2>=0) MPGE_setConfigure(MC_USESSE2,(UPARAM)gogo_opts.optUSESSE2,(UPARAM)0); if(gogo_opts.optADDTAGnum>=0){ int i; for(i=0;i<gogo_opts.optADDTAGnum;i++) MPGE_setConfigure(MC_ADDTAG,(UPARAM)gogo_opts.optADDTAG_len[i],(UPARAM)gogo_opts.optADDTAG_buf[i]); } if(gogo_opts.optEMPHASIS>=0) MPGE_setConfigure(MC_EMPHASIS,(UPARAM)gogo_opts.optEMPHASIS,(UPARAM)0); if(gogo_opts.optVBR>=0) MPGE_setConfigure(MC_VBR,(UPARAM)gogo_opts.optVBR,(UPARAM)0); if(gogo_opts.optCPU>=0) MPGE_setConfigure(MC_CPU,(UPARAM)gogo_opts.optCPU,(UPARAM)0); if(gogo_opts.optBYTE_SWAP>=0) MPGE_setConfigure(MC_BYTE_SWAP,(UPARAM)gogo_opts.optBYTE_SWAP,(UPARAM)0); if(gogo_opts.opt8BIT_PCM>=0) MPGE_setConfigure(MC_8BIT_PCM,(UPARAM)gogo_opts.opt8BIT_PCM,(UPARAM)0); if(gogo_opts.optMONO_PCM>=0) MPGE_setConfigure(MC_MONO_PCM,(UPARAM)gogo_opts.optMONO_PCM,(UPARAM)0); if(gogo_opts.optTOWNS_SND>=0) MPGE_setConfigure(MC_TOWNS_SND,(UPARAM)gogo_opts.optTOWNS_SND,(UPARAM)0); if(gogo_opts.optTHREAD_PRIORITY!=-10000) MPGE_setConfigure(MC_THREAD_PRIORITY,(UPARAM)gogo_opts.optTHREAD_PRIORITY,(UPARAM)0); if(gogo_opts.optREADTHREAD_PRIORITY!=-10000) MPGE_setConfigure(MC_READTHREAD_PRIORITY,(UPARAM)gogo_opts.optREADTHREAD_PRIORITY,(UPARAM)0); if(gogo_opts.optOUTPUT_FORMAT>=0) MPGE_setConfigure(MC_OUTPUT_FORMAT,(UPARAM)gogo_opts.optOUTPUT_FORMAT,(UPARAM)0); if(gogo_opts.optENHANCEDFILTER_A>=0 && gogo_opts.optENHANCEDFILTER_B>=0) MPGE_setConfigure(MC_ENHANCEDFILTER,(UPARAM)gogo_opts.optENHANCEDFILTER_A,(UPARAM)gogo_opts.optENHANCEDFILTER_B); if(gogo_opts.optVBRBITRATE_low>=0 && gogo_opts.optVBRBITRATE_high>=0) MPGE_setConfigure(MC_VBRBITRATE,(UPARAM)gogo_opts.optVBRBITRATE_low,(UPARAM)gogo_opts.optVBRBITRATE_high); if(gogo_opts.optMSTHRESHOLD_threshold>=0 && gogo_opts.optMSTHRESHOLD_mspower>=0) MPGE_setConfigure(MC_MSTHRESHOLD,(UPARAM)gogo_opts.optMSTHRESHOLD_threshold,(UPARAM)gogo_opts.optMSTHRESHOLD_mspower); if(gogo_opts.optVERIFY>=0) MPGE_setConfigure(MC_VERIFY,(UPARAM)gogo_opts.optVERIFY,(UPARAM)0); if(gogo_opts.optOUTPUTDIR[0]!='\0') MPGE_setConfigure(MC_OUTPUTDIR,(UPARAM)gogo_opts.optOUTPUTDIR,(UPARAM)0); if(strcmp((char *)gogo_opts.output_name,"-")==0){ MPGE_setConfigure(MC_OUTPUTFILE,(UPARAM)MC_OUTDEV_STDOUT,(UPARAM)0); } else { MPGE_setConfigure(MC_OUTPUTFILE,(UPARAM)MC_OUTDEV_FILE,(UPARAM)gogo_opts.output_name); } if(dpm.rate>=32000){ if(gogo_opts.optBITRATE1>=0) MPGE_setConfigure(MC_BITRATE,(UPARAM)gogo_opts.optBITRATE1,(UPARAM)0); } else { if(gogo_opts.optBITRATE2>=0) MPGE_setConfigure(MC_BITRATE,(UPARAM)gogo_opts.optBITRATE2,(UPARAM)0); }}static int id3_to_buffer(mp3_id3_tag_t *id3_tag, char *buffer){ memset(buffer,0x20,128);#if 0 memcpy(buffer+0,id3_tag->tag);#else memcpy(buffer+0,"TAG",3); //ID3 Tag v1#endif memcpy(buffer+3,id3_tag->title,30); memcpy(buffer+33,id3_tag->artist,30); memcpy(buffer+63,id3_tag->album,30); memcpy(buffer+93,id3_tag->year,4); memcpy(buffer+97,id3_tag->comment,30); buffer[127] = id3_tag->genre; return 0;}static char *id3_tag_strncpy(char *dst, const char *src, int num){ // NULL廔抂傪晅壛偟偰偼側傜側偄 int len = strlen(src); return memcpy (dst, src, (len <= num) ? len : num);}int gogo_opts_id3_tag(const char *title, const char *artist, const char *album, const char *year, const char *comment, int genre){ mp3_id3_tag_t id3_tag; char *buffer; buffer = (char *)safe_malloc(128); if(buffer==NULL) return -1; memset(&id3_tag,0x20,128); // TAG慡懱傪嬻敀暥帤偱fill if(title){ id3_tag_strncpy(id3_tag.title,title,30); } if(artist){ id3_tag_strncpy(id3_tag.artist,artist,30); } if(album){ id3_tag_strncpy(id3_tag.album,album,30); } if(year){ id3_tag_strncpy(id3_tag.year,year,4); } if(comment){ id3_tag_strncpy(id3_tag.comment,comment,30); } if(genre>=0) id3_tag.genre = (unsigned char)(genre & 0xff); else // 僕儍儞儖枹愝掕 id3_tag.genre = (unsigned char)0xff; id3_to_buffer(&id3_tag,buffer); gogo_opts.optADDTAGnum++; gogo_opts.optADDTAG_len[gogo_opts.optADDTAGnum-1] = 128; gogo_opts.optADDTAG_buf[gogo_opts.optADDTAGnum-1] = buffer;// MPGE_setConfigure(MC_ADDTAG,(UPARAM)128,(UPARAM)buffer); return 0;}// 僐儅儞僪儔僀儞傪揥奐偡傞int commandline_to_argc_argv(char *commandline, int *argc, char ***argv){ char *p1, *p2, *p3; int argc_max = 0; *argc = 0; *argv = NULL; p1 = commandline; for(;;){ int quot = 0; while(isspace(*p1)) p1++; if(*p1=='"') quot = 1; else if(*p1=='\'') quot = 2; if(*p1=='\0') return 0; p2 = p1+1; while((quot==1&&*p2=='"') || (quot==2&&*p2=='\'') || *p2=='\0') p2++; while(!isspace(*p2) || *p2=='\0') p2++; if(*p2!='\0'){ p3 = p2+1; while(isspace(*p3)) p3++; } else{ p3 = NULL; } (*argc)++; if(*argc>argc_max) argc_max += 100; *argv = (char **)safe_realloc(*argv,sizeof(char*)*argc_max); if(*argv==NULL) return -1; *argv[*argc-1] = (char *)safe_malloc(sizeof(char)*(p2-p1)); if(*argv[*argc-1]==NULL){ (*argc)--; return 0; } strncpy(*argv[*argc-1],p1,p2-p1); *argv[*argc-1][p2-p1] = '\0'; if(p3==NULL) return 0; p1 = p3; }}void free_argv(char **argv, int argc){ if(argv!=NULL){ int i; for(i=0;i<argc;i++) if(argv[i]!=NULL) free(argv[i]); free(argv); }} volatile char *gogo_commandline_options = NULL;volatile int use_gogo_commandline_options = 0;void set_gogo_opts_use_commandline_options(char *commandline){ int argc; char **argv; int num; if(commandline_to_argc_argv(commandline,&argc,&argv)){ return; } for(num = 0;num<argc;){ // output bitrate // -b kbps // input PCM is higher than 32kHz [ 32,40,48,56,64,80,96,112,128,160,192,224,256,320 ] // input PCM is lower than 32kHz [ 8,16,24,32,40,48,56,64,80,96,112,128,144,160 ] if(strcasecmp("-b",argv[num])==0){ if(num+1>=argc) break; gogo_opts.optBITRATE1 = gogo_opts.optBITRATE2 = atoi(argv[num+1]); num += 2; continue; } // output bitrate for VBR // -br low_kbps high_kbps // [ 32,40,48,56,64,80,96,112,128,160,192,224,256,320 ] if(strcasecmp("-br",argv[num])==0){ if(num+2>=argc) break; if(gogo_opts.optVBR==-1) gogo_opts.optVBR = 9; gogo_opts.optVBRBITRATE_low = atoi(argv[num+1]); gogo_opts.optVBRBITRATE_high = atoi(argv[num+2]); num += 3; continue; } // low pass filter // -lpf on : 16kHz low pass filter ON // -lpf off : 16kHz low pass filter OFF // -lpf para1 para2 : enhanced low pass filter // para1 (0-100) para2 (0-100) if(strcasecmp("-lpf",argv[num])==0){ if(num+1>=argc) break; if(strcasecmp("on",argv[num+1])==0){ gogo_opts.optENHANCEDFILTER_A = -1; gogo_opts.optENHANCEDFILTER_B = -1; gogo_opts.optUSELPF16 = 1; num += 2; continue; } else if(strcasecmp("off",argv[num+1])==0){ gogo_opts.optENHANCEDFILTER_A = -1; gogo_opts.optENHANCEDFILTER_B = -1; gogo_opts.optUSELPF16 = 0; num += 2; continue; } if(num+2>=argc) break; gogo_opts.optENHANCEDFILTER_A = atoi(argv[num+1]); gogo_opts.optENHANCEDFILTER_B = atoi(argv[num+2]); num += 3; continue; } // encodemode // -m m : monoral // -m s : stereo // -m j : joint stereo // -m f : mid/side stereo // -m d : dual channel if(strcasecmp("-m",argv[num])==0){ if(num+1>=argc) break; if(strcasecmp("m",argv[num+1])==0){ gogo_opts.optENCODEMODE = MC_MODE_MONO; } else if(strcasecmp("s",argv[num+1])==0){ gogo_opts.optENCODEMODE = MC_MODE_STEREO; } else if(strcasecmp("j",argv[num+1])==0){ gogo_opts.optENCODEMODE = MC_MODE_JOINT; } else if(strcasecmp("f",argv[num+1])==0){ gogo_opts.optENCODEMODE = MC_MODE_MSSTEREO; } else if(strcasecmp("d",argv[num+1])==0){ gogo_opts.optENCODEMODE = MC_MODE_DUALCHANNEL; } num += 2; continue; } // -psy // -nopsy if(strcasecmp("-psy",argv[num])==0){ gogo_opts.optUSEPSY = 1; num += 1; continue; } if(strcasecmp("-nopsy",argv[num])==0){ gogo_opts.optUSEPSY = 0; num += 1; continue; } // -on 3dn // -on mmx // -on sse // -on kni // -on e3dn // -on sse // -on cmov // -on emmx // -on sse2 if(strcasecmp("-on",argv[num])==0){ if(num+1>=argc) break; if(strcasecmp("3dn",argv[num+1])==0){ gogo_opts.optUSE3DNOW = 1; } else if(strcasecmp("mmx",argv[num+1])==0){ gogo_opts.optUSEMMX = 1; } else if(strcasecmp("sse",argv[num+1])==0 || strcasecmp("kni",argv[num+1])==0){ gogo_opts.optUSEKNI = 1; } else if(strcasecmp("e3dn",argv[num+1])==0){ gogo_opts.optUSEE3DNOW = 1; } else if(strcasecmp("sse",argv[num+1])==0){ gogo_opts.optUSESSE = 1; } else if(strcasecmp("cmov",argv[num+1])==0){ gogo_opts.optUSECMOV = 1; } else if(strcasecmp("emmx",argv[num+1])==0){ gogo_opts.optUSEEMMX = 1; } else if(strcasecmp("sse2",argv[num+1])==0){ gogo_opts.optUSESSE2 = 1; } num += 2; continue; } // -off 3dn // -off mmx // -off sse // -off kni // -off e3dn // -off sse // -off cmov // -off emmx // -off sse2 if(strcasecmp("-on",argv[num])==0){ if(num+1>=argc) break; if(strcasecmp("3dn",argv[num+1])==0){ gogo_opts.optUSE3DNOW = 0; } else if(strcasecmp("mmx",argv[num+1])==0){ gogo_opts.optUSEMMX = 0; } else if(strcasecmp("sse",argv[num+1])==0 || strcasecmp("kni",argv[num+1])==0){ gogo_opts.optUSEKNI = 0; } else if(strcasecmp("e3dn",argv[num+1])==0){ gogo_opts.optUSEE3DNOW = 0; } else if(strcasecmp("sse",argv[num+1])==0){ gogo_opts.optUSESSE = 0; } else if(strcasecmp("cmov",argv[num+1])==0){ gogo_opts.optUSECMOV = 0; } else if(strcasecmp("emmx",argv[num+1])==0){ gogo_opts.optUSEEMMX = 0; } else if(strcasecmp("sse2",argv[num+1])==0){ gogo_opts.optUSESSE2 = 0; } num += 2; continue; } // emphasis type // -emp n : none // -emp 5 : 50/15ms (normal CD-DA emphasis) // -emp c : CCITT if(strcasecmp("-emp",argv[num])==0){ if(num+1>=argc) break; if(strcasecmp("n",argv[num+1])==0){ gogo_opts.optEMPHASIS = MC_EMP_NONE; } else if(strcasecmp("5",argv[num+1])==0){ gogo_opts.optEMPHASIS = MC_EMP_5015MS; } else if(strcasecmp("c",argv[num+1])==0){ gogo_opts.optEMPHASIS = MC_EMP_CCITT; } num += 2; continue; } // -cpu num if(strcasecmp("-cpu",argv[num])==0){ if(num+1>=argc) break; gogo_opts.optCPU = atoi(argv[num+1]); num += 2; continue; } // -v 0..9 (low compression - high compression) if(strcasecmp("-v",argv[num])==0){ if(num+1>=argc) break; gogo_opts.optVBR = atoi(argv[num+1]); num += 2; continue; } // -d freq : output MP3 frequency(kHz) if(strcasecmp("-d",argv[num])==0){ if(num+1>=argc) break; gogo_opts.optOUTFREQ = (int)(atof(argv[num+1])*1000); num += 2; continue; }#if 0 // Do not use it. // -mono // -stereo // -8bit // -16bit // -bswap // -bswap- (not bitswap) // -tos (snd file for TonwsOS) // -tos- (not snd file for TonwsOS if(strcasecmp("-mono",argv[num])==0){ gogo_opts.optMONO_PCM = 1; num += 1; continue; } if(strcasecmp("-stereo",argv[num])==0){ gogo_opts.optMONO_PCM = 0; num += 1; continue; } if(strcasecmp("-8bit",argv[num])==0){ gogo_opts.opt8BIT_PCM = 1; num += 1; continue; } if(strcasecmp("-16bit",argv[num])==0){ gogo_opts.opt8BIT_PCM = 0; num += 1; continue; } if(strcasecmp("-bswap",argv[num])==0){ gogo_opts.optBYTE_SWAP = 1; num += 1; continue; } if(strcasecmp("-bswap-",argv[num])==0){ gogo_opts.optBYTE_SWAP = 0; num += 1; continue; } if(strcasecmp("-ts",argv[num])==0){ gogo_opts.optTOWNS_SND = 1; num += 1; continue; } if(strcasecmp("-ts-",argv[num])==0){ gogo_opts.optTOWNS_SND = 1; num += 1; continue; } // -s freq : input PCM freqency(kHz) if(strcasecmp("-s",argv[num])==0){ if(num+1>=argc) break; gogo_opts.optINPFREQ = (int)(atof(argv[num+1])*1000); num += 2; continue; } // -offset byte : jump byte bytes from head. if(strcasecmp("-offset",argv[num])==0){ if(num+1>=argc) break; gogo_opts.optSTARTOFFSET = atol(argv[num+1]); num += 2; continue; }#endif // -th threshold mspower if(strcasecmp("-th",argv[num])==0){ if(num+2>=argc) break; gogo_opts.optMSTHRESHOLD_threshold = atoi(argv[num+1]); gogo_opts.optMSTHRESHOLD_mspower = atoi(argv[num+2]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -