⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vesavcd.c

📁 超级解霸源代码。纯c语言写的。适合有一定编程基础的开发人员用来学习提高
💻 C
📖 第 1 页 / 共 5 页
字号:
	Stack.ES=DOSSeg;
	Stack.AX=0x4F01;
	Stack.CX=Mode;
	////////// Call Real INT //////////
	_ES=FP_SEG(&Stack);
	_DI=FP_OFF(&Stack);
	_CX=0;
	_BH=0;
	_BL=0x10;
	_AX=0x300;
	geninterrupt(0x31);
	asm	jnc	short	NEXT2;
	// DPMI or VESA Call Error,Directly test mode.
	GlobalDosFree(DOSSel);
	return 64;
	NEXT2:			//VESA Support 64K Color
	Ptr=MK_FP(DOSSel,0);
	BankGranUnit=Ptr->GranUnit;
	///////////////Free DOS Memory ///////////
	GlobalDosFree(DOSSel);
	//////////////////////////////////////////
	if(BankGranUnit==0) BankGranUnit=64;
	return BankGranUnit;
}
////////////////////////////////////////////////
int	Start=0;
////////////////////////////////////////////
char	SthMPEG[40];
void PASCAL FAR	BuildSTHMPEGTypeMCI(void)
{
	GetCWD(SthMPEG,sizeof(SthMPEG));
	lstrcat(SthMPEG,"\\STHMPEG.SYS");
}
static	void	AddSTHMPEGTypeMCI(void)
{
	WritePrivateProfileString("mci","STHMPEG",SthMPEG,"system.ini");
}
static	void	DeleteSTHMPEGTypeMCI(void)
{
	WritePrivateProfileString("mci","STHMPEG",NULL,"system.ini");
}
//////////////////// Video Play ////////////////
static	void	MemSet(LPSTR MemPtr,BYTE C,WORD Size)
{
	asm	les	di,MemPtr
	asm	mov	cx,Size;
	asm	mov	al,C
	asm	cld
	asm	shr	cx,1
	asm	mov	ah,al
	asm	rep	stosw
	asm	adc	cl,cl
	asm	rep	stosb
}
static	DWORD	VideoOpen(LPSTR Path,LPSTR MCIDriver)
{
	DWORD	Ret;
	MCI_ANIM_OPEN_PARMS	mciopen;

	MemSet((LPSTR)&mciopen,0,sizeof(mciopen));
	mciopen.lpstrDeviceType=MCIDriver;
	mciopen.lpstrElementName=Path;
	Ret=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciopen);
	if(Ret!=0)
		{
		return (Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return	mciopen.wDeviceID;	//TRUE;
}
DWORD PASCAL FAR	SetVideoWindow(int VideoID,HWND VideoWindow,HWND CallBackhWnd)
{
	DWORD	Ret;
	MCI_ANIM_WINDOW_PARMS	mciWindow;

	MemSet((LPSTR)&mciWindow,0,sizeof(mciWindow));
	///////////// Set Video in my Window /////////
	mciWindow.hWnd=VideoWindow;
	mciWindow.dwCallback=(DWORD)CallBackhWnd;
	mciWindow.lpstrText="Southern MPEG";
	Ret=mciSendCommand(VideoID,MCI_WINDOW,//MCI_NOTIFY|
		MCI_ANIM_WINDOW_HWND|MCI_ANIM_WINDOW_ENABLE_STRETCH,
		(DWORD)(LPVOID)&mciWindow);
	if(Ret!=0)
		{
		return (Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return	1;	//TRUE;
}
static	void	SetVideoTimeFormat(int VideoID,HWND hwnd,int Format)
{	//Format is MCI_FORMAT_MILLISECONDS or MCI_FORMAT_FRAMES
	MCI_SET_PARMS	mciTime;

	MemSet((LPSTR)&mciTime,0,sizeof(mciTime));
	mciTime.dwCallback=hwnd;
	mciTime.dwTimeFormat=Format;
	mciSendCommand(VideoID,MCI_SET,//MCI_NOTIFY|
		MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciTime);
}
void	ResetPalette(void);
int	Loop=0;
int	LoopCount=0;
int	LoopStart=-1;
int	CursorPos;
int	FromPos;	//Current file loop start position
int	ToPos;		//Current file loop end position
int	LoopEnd=-1;
DWORD	LoopStartBase;
DWORD	EndTo;
DWORD	From=0;
DWORD	To=0;
LONG	CurrentPos=0;
extern	int	DisplayVideo;
extern	int	Run;
extern	DWORD	RunStart;
extern	DWORD	RunEnd;
extern	int	DCIType;	//If now be 640x480 and had DCI Primary 64K/32K
static	DWORD	PlayVideo(int VideoID,HWND CallBackhWnd)
{
	DWORD	Ret;
	MCI_ANIM_PLAY_PARMS	mciplay;

	MemSet((LPSTR)&mciplay,0,sizeof(mciplay));
	mciplay.dwCallback=(DWORD)CallBackhWnd;
	if(Run)	{//CmdLine Run
		if(RunEnd!=0 && RunStart<RunEnd)
			{//Run To
			mciplay.dwTo	=RunEnd;
			Ret=mciSendCommand(VideoID,MCI_PLAY,MCI_NOTIFY|MCI_TO,(DWORD)(LPVOID)&mciplay);
			}
		else	Ret=mciSendCommand(VideoID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciplay);
		}
	else	{//Normal play
		if(Loop && LoopStart<LoopEnd && LoopStart!=-1 && LoopEnd!=-1)
			{//Enable Loop area
			LONG	CurPos;
			mciplay.dwFrom	=From;
			mciplay.dwTo	=To;
			CurPos=CurrentPos;
			CurPos-=LoopStartBase;
			if(CurPos<From)	Ret=mciSendCommand(VideoID,MCI_PLAY,MCI_NOTIFY|MCI_FROM|MCI_TO,(DWORD)(LPVOID)&mciplay);
			else	Ret=mciSendCommand(VideoID,MCI_PLAY,MCI_NOTIFY|MCI_TO,(DWORD)(LPVOID)&mciplay);
			}
		else Ret=mciSendCommand(VideoID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciplay);
		}
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	if(VESAColor==8)  ResetPalette();
	DisplayVideo=1;
	return 1;
}
static	void	StopVideo(int VideoID,HWND hwnd)
{
	MCI_GENERIC_PARMS	mcigen;
	mcigen.dwCallback=hwnd;
	mciSendCommand(VideoID,MCI_STOP,0,//MCI_NOTIFY,
		(DWORD)(LPVOID)&mcigen);
}
static	void	StopVideoWait(int VideoID,HWND hwnd)
{
	MCI_GENERIC_PARMS	mcigen;
	mcigen.dwCallback=hwnd;
	mciSendCommand(VideoID,MCI_STOP,MCI_WAIT,
		(DWORD)(LPVOID)&mcigen);
}
static	DWORD	PauseVideo(int VideoID,HWND hwnd)
{
	DWORD	Ret;
	MCI_GENERIC_PARMS	mcigen;
	mcigen.dwCallback=hwnd;
	Ret=mciSendCommand(VideoID,MCI_PAUSE,0,//MCI_NOTIFY,
		(DWORD)(LPVOID)&mcigen);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return 1;
}
static	void	ResumeVideo(int VideoID,HWND hwnd)
{
	MCI_GENERIC_PARMS	mcigen;
	mcigen.dwCallback=hwnd;
	mciSendCommand(VideoID,MCI_RESUME,MCI_NOTIFY,
		(DWORD)(LPVOID)&mcigen);
}
#pragma	warn -par
static	void	CloseVideo(int VideoID,HWND hwnd)
{
	mciSendCommand(VideoID,MCI_CLOSE,0,NULL);
}
#pragma	warn .par
static	DWORD	GetVideoLength(int VideoID,HWND hwnd)
{
	DWORD	Ret;
	MCI_STATUS_PARMS	mciStatus;

	MemSet((LPSTR)&mciStatus,0,sizeof(mciStatus));
	mciStatus.dwCallback=hwnd;
	mciStatus.dwItem=MCI_STATUS_LENGTH;
	Ret=mciSendCommand(VideoID,MCI_STATUS,//MCI_NOTIFY|
		MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatus);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return mciStatus.dwReturn;	//Length
}
static	DWORD	GetVideoCurrentPosition(int VideoID,HWND hwnd)
{
	DWORD	Ret;
	MCI_STATUS_PARMS	mciStatus;

	MemSet((LPSTR)&mciStatus,0,sizeof(mciStatus));
	mciStatus.dwCallback=hwnd;
	mciStatus.dwItem=MCI_STATUS_POSITION;
	Ret=mciSendCommand(VideoID,MCI_STATUS,//MCI_NOTIFY|
		MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatus);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return mciStatus.dwReturn;	//Current Position
}
static	DWORD	SeekVideoTo(int VideoID,HWND hwnd,DWORD Position)
{
	DWORD	Ret;
	MCI_SEEK_PARMS	mciSeek;

	mciSeek.dwCallback=hwnd;
	mciSeek.dwTo=Position;
	Ret=mciSendCommand(VideoID,MCI_SEEK,//MCI_NOTIFY|
		MCI_TO,(DWORD)(LPVOID)&mciSeek);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return 1;	//Current Position
}
static	DWORD	SeekVideoToStart(int VideoID,HWND hwnd)
{
	DWORD	Ret;
	MCI_SEEK_PARMS	mciSeek;

	mciSeek.dwCallback=hwnd;
	mciSeek.dwTo=0;
	Ret=mciSendCommand(VideoID,MCI_SEEK,//MCI_NOTIFY|
		MCI_SEEK_TO_START,(DWORD)(LPVOID)&mciSeek);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return 1;	//Current Position
}
static	DWORD	SeekVideoToEnd(int VideoID,HWND hwnd)
{
	DWORD	Ret;
	MCI_SEEK_PARMS	mciSeek;

	mciSeek.dwCallback=hwnd;
	mciSeek.dwTo=0;
	Ret=mciSendCommand(VideoID,MCI_SEEK,//MCI_NOTIFY|
		MCI_SEEK_TO_END,(DWORD)(LPVOID)&mciSeek);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return 1;	//Current Position
}
#pragma	warn	-par
DWORD PASCAL FAR	UpDateVideo(int VideoID,HWND MainWindow)
{
	DWORD	Ret;
	MCI_ANIM_UPDATE_PARMS	mciUpdate;
	HDC	hdc;

	mciUpdate.dwCallback=MainWindow;
	mciUpdate.hDC=0;
	mciUpdate.rc.left=mciUpdate.rc.top=0;
	mciUpdate.rc.right=64;mciUpdate.rc.bottom=56;
	Ret=mciSendCommand(VideoID,MCI_UPDATE,//MCI_NOTIFY
		MCI_ANIM_RECT,(DWORD)(LPVOID)&mciUpdate);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return 1;	//Current Position
}
#pragma	warn	.par
static	DWORD	StepVideo(int VideoID,HWND MainWindow,DWORD Frames)
{
	DWORD	Ret;
	MCI_ANIM_STEP_PARMS	mciStep;

	mciStep.dwCallback=MainWindow;
	mciStep.dwFrames=Frames;
	Ret=mciSendCommand(VideoID,MCI_STEP,MCI_WAIT|
		MCI_ANIM_STEP_FRAMES,(DWORD)(LPVOID)&mciStep);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return 1;	//Current Position
}
static	DWORD	GetVideoCDPresent(int VideoID,HWND hwnd)
{
	DWORD	Ret;
	MCI_STATUS_PARMS	mciStatus;

	MemSet((LPSTR)&mciStatus,0,sizeof(mciStatus));
	mciStatus.dwCallback=hwnd;
	mciStatus.dwItem=MCI_STATUS_MEDIA_PRESENT;
	Ret=mciSendCommand(VideoID,MCI_STATUS,//MCI_NOTIFY|
		MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatus);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return mciStatus.dwReturn;	//CD Present or not.
}
static	DWORD	GetVideo256CPALHandle(int VideoID,HWND hwnd)
{
	DWORD	Ret;
	MCI_STATUS_PARMS	mciStatus;

	MemSet((LPSTR)&mciStatus,0,sizeof(mciStatus));
	mciStatus.dwCallback=hwnd;
	mciStatus.dwItem=MCI_ANIM_STATUS_HPAL;
	Ret=mciSendCommand(VideoID,MCI_STATUS,//MCI_NOTIFY|
		MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatus);
	if(Ret!=0)
		{
		return	(Ret|0x80000000L);	//FALSE HIWORD Not Zero
		}
	return mciStatus.dwReturn;	//Video PALETTE of 256 Color.
}
static	DWORD	HourMinSec(int Hour,int Min,int Sec)
{
	DWORD	Value;
	Value=(Hour*3600L+Min*60L+Sec)*1000L;
	return 	Value;
}
////////////////////////////////////////////////////////
int	DrvNum;
char	CDROM[10];	//CDROM Driver Name
int  PASCAL FAR	CheckCDROMEX(void)
{
	int	Num,Drv;
	_BX=0;
	_AX=0x1500;
	geninterrupt(0x2F);
	Num=_BX;
	Drv=_CX;
	if(Num) CDROM[0]=Drv+'A';
	return Num;
}
void  PASCAL FAR	GetCDROMName(int DrvNum)
{	int	i;
	int	First;
	int	Drv=1;
	First=CDROM[0]-'A'+1;
	for(i=First;i<26;i++)
		{
		_CX=i;
		_AX=0x150B;
		geninterrupt(0x2F);
		if(_BX!=0xADAD) break; //No CDROMEX
		if(_AX!=0)
			{
			CDROM[Drv]=i+'A';
			Drv++;
			if(Drv>=DrvNum)	break;
			}
		}
}
////////////////////////////////////////////////////////
int		Chinese=0;
void PASCAL FAR	DisplayErrorMessage(int Ret,HWND hwnd)
{
	char	Str[80];
	mciGetErrorString(LOWORD(Ret),(LPSTR)Str,79);
	if(OtherDecoder)
		{//Driver not match or fill error
		if(Chinese) MessageBox(hwnd,"无法打开指定视频,\n可能是驱动程序不匹配.\n或者是文件坏了.","错误信息",MB_OK);
		else MessageBox(hwnd,"Can't Open the MCI Video,\nMaybe driver not match.\nOr the file error.",
			"ErrorMessage",MB_OK);
		}
	else	{// Error on my driver.
		if(Chinese) MessageBox(hwnd,"无法打开视频文件,\n可能是CD-ROM中并\n无VCD碟,但CD-ROM\n驱动程序却认为有\n文件存在.","错误信息",MB_OK);
		else MessageBox(hwnd,"Can't Open the video File,\nMaybe no VCD Disc on the \nCDROM, But some files had\n been detected by the CD-ROM\ndriver.",
			"ErrorMessage",MB_OK);
		}
}
////////////////////////////////////////////////////////
int	videoID=-1;
char	VideoName[VIDEONUMBER][80];	// Video File Name.
DWORD	VideoLength[VIDEONUMBER];
int	VideoNumber=0;
/////////////////////////////////////
char	VCDFileAVSEQ[]="%c:\\MPEGAV\\AVSEQ%02d.DAT";
char	VCDFileMUSIC[]="%c:\\MPEGAV\\MUSIC%02d.DAT";
char	FindFileAVSEQ[]="%c:\\MPEGAV\\AVSEQ??.DAT";
char	FindFileMUSIC[]="%c:\\MPEGAV\\MUSIC??.DAT";
char	Buffer[80];
static	int	SearchFilesAVSEQ(int DrvNum)
{
	int 	done;
	int	Number=0;
	FFBLK 	FindBlk;

	wsprintf(Buffer,FindFileAVSEQ,CDROM[DrvNum]);
	done=FindFirst(Buffer,&FindBlk,0);
	while(!done)
		{
		Number++;
		done=FindNext(&FindBlk);
		}
	return Number;
}
static	int	SearchFilesMUSIC(int DrvNum)
{
	int 	done;
	int	Number=0;
	FFBLK 	FindBlk;

	wsprintf(Buffer,FindFileMUSIC,CDROM[DrvNum]);
	done=FindFirst(Buffer,&FindBlk,0);
	while(!done)
		{
		Number++;
		done=FindNext(&FindBlk);
		}
	return Number;
}
int	AutoVCDPlay=0;
int  PASCAL FAR	SearchVideoFile(void)
{
	int	i,j;
	int	VCDNum;
	int	File=0;
	for(i=0;i<DrvNum;i++)
		{// Search any drive.
		/////// AVSEQ??.DAT
		VCDNum=SearchFilesAVSEQ(i);
		if(VCDNum)
			{
			for(j=0;j<VCDNum;j++)
				{
				wsprintf(VideoName[File],VCDFileAVSEQ,CDROM[i],j+1);
				File++;
				if(File>=VIDEONUMBER) return File;
				}
			}
		//////// MUSIC??.DAT
		VCDNum=SearchFilesMUSIC(i);
		if(VCDNum)
			{
			for(j=0;j<VCDNum;j++)
				{
				wsprintf(VideoName[File],VCDFileMUSIC,CDROM[i],j+1);
				File++;
				if(File>=VIDEONUMBER) return File;
				}
			}
		}
	AutoVCDPlay=File ? 1:0;
	return File;
}
///////////////Get MCI Ext Name/////////////
static	int	CheckExtName(char *ExtName,char *VideoDriver)
{
	char	Buffer[80];

	GetProfileString("mci extensions",ExtName,"NOT",Buffer,sizeof(Buffer));
	if(Buffer[0]=='N' && Buffer[1]=='O' && Buffer[2]=='T') return 0;//FALSE
	lstrcpy(VideoDriver,Buffer);
	return 1;
}
static	int	CheckFileForDriver(char *FileName,char *VideoDriver)
{
	char	ExtName[4];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -