📄 vesavcd.c
字号:
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 + -