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.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); } }
// gogo.dll or gogo.lib の関数を用いた mp3 作成部分は別スレッドにて行う。 // スレッド作成には CreateMPGEthread() を用いる。 // そのスレッドは、gogo_buffer_termination が非 0 になったとき必ず終了する。 // そのスレッドが終了したことは、IsTerminatedMPGEthread()により検知する。 // スレッドが終了したことを確認してから close_output() は完了する。 // データの渡しは gogo_buffer にて行うが、バッファが一杯のときは、元スレッドが // 停止し、バッファの読み込み待機時は gogo 用スレッドが停止する。 static int __stdcall MPGEthread(void) { MERET rval; struct MCP_INPDEV_USERFUNC mcp_inpdev_userfunc; unsigned long gogo_vercode; char gogo_verstring[1024]; gogo_buffer_reset(); rval = MPGE_initializeWork(); if(rval != ME_NOERR){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } MPGE_getVersion(&gogo_vercode,gogo_verstring); ctl->cmsg(CMSG_INFO, VERB_NORMAL, "Gogo: %s", gogo_verstring); memset(&mcp_inpdev_userfunc,0,sizeof(struct MCP_INPDEV_USERFUNC)); mcp_inpdev_userfunc.pUserFunc = gogoUserFunc; mcp_inpdev_userfunc.nSize = MC_INPDEV_MEMORY_NOSIZE; mcp_inpdev_userfunc.nBit = (dpm.encoding & PE_16BIT) ? 16 : 8; mcp_inpdev_userfunc.nFreq = dpm.rate; mcp_inpdev_userfunc.nChn = (dpm.encoding & PE_MONO) ? 1 : 2; #ifndef IA_W32GUI if(use_gogo_commandline_options && gogo_commandline_options!=NULL){ gogo_opts_reset(); set_gogo_opts_use_commandline_options(gogo_commandline_options); } #else gogo_ConfigDialogInfoApply(); #endif set_gogo_opts(); rval = MPGE_setConfigure( MC_INPUTFILE,MC_INPDEV_USERFUNC,(UPARAM)&mcp_inpdev_userfunc); if(rval != ME_NOERR){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } if(gogo_vercode<300){ rval = MPGE_setConfigure(MC_STARTOFFSET,(UPARAM)0,(UPARAM)0); if(rval != ME_NOERR){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } } #if 0 rval = MPGE_setConfigure(MC_INPFREQ,(UPARAM)dpm.rate,(UPARAM)0); if(rval != ME_NOERR){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } #endif if(gogo_vercode<300){ rval = MPGE_setConfigure(MC_BYTE_SWAP,(UPARAM)((dpm.encoding & PE_BYTESWAP) ? TRUE : FALSE),(UPARAM)0); if(rval != ME_NOERR){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } rval = MPGE_setConfigure(MC_8BIT_PCM,(UPARAM)((dpm.encoding & PE_16BIT) ? FALSE : TRUE),(UPARAM)0); if(rval != ME_NOERR){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } rval = MPGE_setConfigure(MC_MONO_PCM,(UPARAM)((dpm.encoding & PE_MONO) ? TRUE : FALSE),(UPARAM)0); if(rval != ME_NOERR){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } } rval = MPGE_detectConfigure(); if( rval != ME_NOERR ){ gogo_error(rval); gogo_buffer_termination = -1; MPGE_endCoder(); return -1; } else { // UPARAM curFrame; // curFrame = 0; do { // ctl->cmsg(CMSG_INFO, VERB_DEBUG,"gogo_a : frame %d",curFrame); // curFrame++; rval = MPGE_processFrame(); } while( rval == ME_NOERR ); if( rval != ME_EMPTYSTREAM ){ gogo_buffer_termination = -1; gogo_error(rval); } } MPGE_closeCoder(); MPGE_endCoder(); return 0; }
static int getOpt(int argc, char *argv[]) { char inName[MAX_FILE_LEN], outName[MAX_FILE_LEN]; char *inPtr, *outPtr; inPtr = outPtr = NULL; argc--, argv++; while(argc > 0){ if(**argv == '-'){ int usedArgNum; UPARAM para[2], mode; /* for MPGE_setConfigure */ usedArgNum = getOpt1(optTblDLL, argc, argv, para, &mode); if(usedArgNum > 0){ /* converse(special case) */ if(mode == MC_USEPSY) para[0] = !para[0]; if(MPGE_setConfigure(mode, para[0], para[1]) != ME_NOERR) goto OPT_ERR; argc -= usedArgNum; argv += usedArgNum; continue; } /* for console option */ usedArgNum = getOpt1(optTblCON, argc, argv, para, &mode); if(usedArgNum > 0){ if(setConsoleOpt(mode, para) == ERR) goto OPT_ERR; argc -= usedArgNum; argv += usedArgNum; continue; } goto OPT_ERR; }else if(!inPtr){ inPtr = *argv; }else if(!outPtr){ outPtr = *argv; }else{ goto OPT_ERR; } argc--, argv++; } /* while(argc) */ if (bench) { struct MCP_INPDEV_USERFUNC user_in; MPGE_USERFUNC user_out; memset( &user_in, 0, sizeof(user_in) ); user_in.nSize = 44100 * 2 * 2 * bench_sec; user_in.nChn = 2; // stereo user_in.nFreq = 44100; // 44100Hz user_in.nBit = 16; // 16bit PCM // エラーの時はどうしよう??? init_bench_input(&user_in); init_bench_output(&user_out); MPGE_setConfigure( MC_INPUTFILE, MC_INPDEV_USERFUNC, (UPARAM)&user_in ); MPGE_setConfigure( MC_OUTPUTFILE, MC_OUTDEV_USERFUNC, (UPARAM)user_out ); if( !silent ){ printf( "test time %dsec\n", bench_sec ); } } else { if(!inPtr || strlen(inPtr) >= MAX_FILE_LEN) return ERR; strcpy(inName, inPtr); if (strcmp(inName, "stdin")) { if(convertToLongFileName(inName, MAX_FILE_LEN) == ERR) return ERR; if (libsnd) { MPGE_setConfigure(MC_INPUTFILE, MC_INPDEV_LIBSND, (UPARAM)inName); } else { MPGE_setConfigure(MC_INPUTFILE, MC_INPDEV_FILE, (UPARAM)inName); } } else { if (libsnd) { MPGE_setConfigure(MC_INPUTFILE, MC_INPDEV_LIBSND, (UPARAM)"-"); } else { MPGE_setConfigure(MC_INPUTFILE, MC_INPDEV_STDIO, 0); } } if(!outPtr){ if(changeSuffix(outName, inName, MAX_FILE_LEN) == ERR) return ERR; }else{ if(strlen(outPtr) >= MAX_FILE_LEN) return ERR; strcpy(outName, outPtr); } if (strcmp(outName, "stdout")) { MPGE_setConfigure(MC_OUTPUTFILE, MC_OUTDEV_FILE, (UPARAM)outName); } else { MPGE_setConfigure(MC_OUTPUTFILE, MC_OUTDEV_STDOUT, 0); } if( !silent ){ printf("encode %s to %s\n", inName, outName ); } } return NOERR; OPT_ERR:; if(!silent) fprintf(stderr, "opt err[%s]\n", *argv); return ERR; } /* getOpt */