Example #1
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;
}
Example #2
0
int
main(int argc, char *argv[])
{
	MERET ret;
	int getOptSuccessed;

#if defined(_MSC_VER) && !defined(NDEBUG)
	/* 厳密な演算チェックのため */
	_controlfp(~_MCW_EM | _EM_INEXACT, _MCW_EM);
#endif
#if	defined(__FreeBSD__)
	{	/* デフォルト動作が他のOSと違う。*/
		struct sigaction new_sig;
        	memset(&new_sig, 0, sizeof(struct sigaction));
        	new_sig.sa_handler = SIG_IGN;
        	sigaction(SIGFPE, &new_sig, NULL);
	}
#endif
	if(MPGE_initializeWork() == ME_NOFPU) return ERR;

	getOptSuccessed = 1 < argc && getOpt(argc, argv) == NOERR;
	opening();
	if(!getOptSuccessed){
		usage();
		MPGE_endCoder();
		return ERR;
	}

	ret = MPGE_detectConfigure();
	if(ret != ME_NOERR){
		if(!silent) fprintf(stderr, "%s\n", getErrMsg(ret));
		return ERR;
	}

	putConfig();

	reportInit();	/* report progress */

#if defined(USE_ITIMER) || (defined(_CONSOLE) && defined(WIN32) && defined( USE_TTIMER ))
	ret = MPGE_processTrack();
	if(ret != ME_NOERR){
		if(!silent) fprintf(stderr, "%s\n", getErrMsg(ret));
	}
#else
	for(;;){
		ret = MPGE_processFrame();
		if(ret == ME_EMPTYSTREAM) break;
		if(ret != ME_NOERR){
			if(!silent) fprintf(stderr, "%s\n", getErrMsg(ret));
			break;
		}
		reportDsp(0);
	} /* main loop */
#endif
	ret = MPGE_closeCoder();
	if(ret != ME_NOERR) if(!silent) fprintf(stderr, "%s\n", getErrMsg(ret));

	reportTerm();

	MPGE_endCoder();
	clkput();
	return NOERR;
} /* main */