Last active
March 12, 2024 17:27
-
-
Save bakueikozo/9f3ec88476989ba5d9cb37b5c2647e82 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
char decidedFilename[1024]; | |
int songNumTray; | |
int songNumChapter; | |
int movieFirst=1; | |
// 曲番号を取得するために、OKD(オケデータ??)を開くときの関数をオーバーライドして番号を保存しておく | |
int (*okdplayeropen)(void *okdPlayer,int sn,void *songdata,int mode,void *lpInfo); | |
int _ZN10COkdPlayer4OpenEmP17YMH_OKDP_SONGDATA17YMH_OKDP_OPENMODEPv( | |
void *okdPlayer,int sn,void *songdata,int mode,void *lpInfo | |
){ | |
puts("_ZN10COkdPlayer4OpenEmP17YMH_OKDP_SONGDATA17YMH_OKDP_OPENMODEPv"); | |
okdplayeropen=dlsym(RTLD_NEXT, "_ZN10COkdPlayer4OpenEmP17YMH_OKDP_SONGDATA17YMH_OKDP_OPENMODEPv"); | |
printf("%p,%d,%d-%d,%d,%p\n",okdPlayer,(sn>>8)&0xffff,sn&0xff,songdata,mode,lpInfo); | |
songNumTray=(sn>>8) &0xffff; | |
songNumChapter=sn&0xff; | |
decidedFilename[0]=0; | |
return okdplayeropen(okdPlayer,sn,songdata,mode,lpInfo); | |
} | |
// ファイル存在チェック | |
int check_file(char *name){ | |
int ret; | |
printf("check exist %s ",name); | |
FILE *fp=fopen(name,"rb"); | |
if(fp!=NULL){ | |
printf("exist.\n"); | |
fclose(fp); | |
return 1; | |
} | |
printf("not exist.\n"); | |
return 0; | |
} | |
int (*pCheckPresent)(int pIndex,WORD *folder,DWORD file,int *type); | |
// 要求された動画ファイルを探す代わりに、自分で準備した動画ファイルをそのファイル名で配置して、フォルダ番号を返す | |
bool _ZN9CMDVIndex15CheckPresentBGVEPtmP15tagVSTREAM_TYPE(int pIndex,WORD *folder,DWORD file,int *type){ | |
if(pCheckPresent==NULL){ | |
// 本来呼び出される関数 | |
pCheckPresent=dlsym(RTLD_NEXT, "_ZN9CMDVIndex15CheckPresentBGVEPtmP15tagVSTREAM_TYPE"); | |
} | |
// 引数確認 | |
printf("before CheckPresent(%p,%d-%d,%d)\n",pIndex,*folder,file,*type); | |
int maxnum=-1; | |
// 一つの曲内で複数のBGVファイルを探すため何回も呼び出されるので、最初の一回だけファイル名を決める | |
if( strlen(decidedFilename) == 0 ){ | |
char buf[255]; | |
// check custom pv | |
int x; | |
for(x=0;x<10;x++){ | |
sprintf(buf,"/XG/B/movie/%d/%d",songNumTray,songNumChapter); | |
if( x > 0 ){ | |
sprintf(buf,"%s.%d",buf,x); | |
} | |
if( check_file(buf) ){ | |
maxnum=x; | |
} | |
} | |
// nn , nn.1 , nn.2 ... みたいな連番ファイルを想定する。一番大きいやつを見つけて、randをmodる | |
if( maxnum != -1 ){ | |
printf("maxnum=%d \n",maxnum); | |
int decide=0; | |
decide= rand()%(maxnum+1); | |
sprintf(buf,"/XG/B/movie/%d/%d",songNumTray,songNumChapter); | |
if(decide > 0 ){ | |
sprintf(buf,"%s.%d",buf,decide); | |
} | |
strcpy(decidedFilename,buf); | |
printf("decide filename=%s\n",decidedFilename); | |
} | |
} | |
// 曲名でファイルを準備しておかなかった場合、通常通りの動作をする | |
if( strlen(decidedFilename) == 0 ){ | |
return pCheckPresent(pIndex,folder,file,type); | |
}else{ | |
// 曲名での動画があったので、フォルダに配置する | |
*folder = 666; | |
*type = 27; | |
char target[255]; | |
sprintf(target,"/XG/B/Data/666/666.%d",file); | |
printf("make symlink source=%s target %s\n",decidedFilename,target); | |
unlink(target); | |
symlink(decidedFilename,target); | |
return pCheckPresent(pIndex,folder,file,type); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment