mirror of
https://github.com/array-in-a-matrix/SAROO.git
synced 2025-04-02 10:31:43 -04:00
list image speed up
This commit is contained in:
parent
7be6b3ac47
commit
2c892b6baf
4 changed files with 151 additions and 98 deletions
|
@ -287,7 +287,7 @@ int fad_to_track(u32 fad);
|
|||
u32 bswap32(u32 d);
|
||||
void init_toc(void);
|
||||
|
||||
void list_disc(void);
|
||||
int list_disc(int show);
|
||||
int load_disc(int index);
|
||||
int unload_disc(void);
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ char *get_line(u8 *buf, int *pos, int size)
|
|||
/******************************************************************************/
|
||||
|
||||
|
||||
int parse_cue(char *fname, int check)
|
||||
int parse_cue(char *fname)
|
||||
{
|
||||
FIL fp;
|
||||
u8 *fbuf = (u8*)0x24002000;
|
||||
|
@ -111,27 +111,19 @@ int parse_cue(char *fname, int check)
|
|||
return -5;
|
||||
|
||||
sprintk(full_path, "%s/%s", dir_name, tfile);
|
||||
if(check){
|
||||
FILINFO fi;
|
||||
retv = f_stat(full_path, &fi);
|
||||
if(retv){
|
||||
return -6;
|
||||
}
|
||||
}else{
|
||||
if(tno!=-1){
|
||||
// close last track
|
||||
tk = &cdb.tracks[tno];
|
||||
int fad_size = (f_size(tk_fp)-tk->file_offset)/tk->sector_size;
|
||||
tk->fad_end = tk->fad_start + fad_size - 1;
|
||||
fad_offset = tk->fad_end+1;
|
||||
}
|
||||
last_tk = tno+1;
|
||||
tk = &cdb.tracks[tno+1];
|
||||
tk_fp = &track_fp[tno+1];
|
||||
retv = f_open(tk_fp, full_path, FA_READ);
|
||||
if(retv){
|
||||
return -6;
|
||||
}
|
||||
if(tno!=-1){
|
||||
// close last track
|
||||
tk = &cdb.tracks[tno];
|
||||
int fad_size = (f_size(tk_fp)-tk->file_offset)/tk->sector_size;
|
||||
tk->fad_end = tk->fad_start + fad_size - 1;
|
||||
fad_offset = tk->fad_end+1;
|
||||
}
|
||||
last_tk = tno+1;
|
||||
tk = &cdb.tracks[tno+1];
|
||||
tk_fp = &track_fp[tno+1];
|
||||
retv = f_open(tk_fp, full_path, FA_READ);
|
||||
if(retv){
|
||||
return -6;
|
||||
}
|
||||
}else if(strcmp(token, "TRACK")==0){
|
||||
char *tnum = get_token(&lbuf);
|
||||
|
@ -156,43 +148,39 @@ int parse_cue(char *fname, int check)
|
|||
return -8;
|
||||
}
|
||||
|
||||
if(check==0){
|
||||
tk = &cdb.tracks[tno];
|
||||
tk->fp = tk_fp;
|
||||
tk->sector_size = size;
|
||||
tk->mode = mode;
|
||||
}
|
||||
tk = &cdb.tracks[tno];
|
||||
tk->fp = tk_fp;
|
||||
tk->sector_size = size;
|
||||
tk->mode = mode;
|
||||
}else if(strcmp(token, "INDEX")==0){
|
||||
char *inum = get_token(&lbuf);
|
||||
char *tstr = get_token(&lbuf);
|
||||
if(inum==NULL || tstr==NULL){
|
||||
return -9;
|
||||
}
|
||||
if(check==0){
|
||||
int idx = strtoul(inum, NULL, 10);
|
||||
int m = strtoul(tstr+0, &tstr, 10);
|
||||
int s = strtoul(tstr+1, &tstr, 10);
|
||||
int f = strtoul(tstr+1, &tstr, 10);
|
||||
int fad = MSF_TO_FAD(m, s, f);
|
||||
int idx = strtoul(inum, NULL, 10);
|
||||
int m = strtoul(tstr+0, &tstr, 10);
|
||||
int s = strtoul(tstr+1, &tstr, 10);
|
||||
int f = strtoul(tstr+1, &tstr, 10);
|
||||
int fad = MSF_TO_FAD(m, s, f);
|
||||
|
||||
if(last_tk < tno){
|
||||
// close last track
|
||||
tk = &cdb.tracks[last_tk];
|
||||
tk->fad_end = fad_offset+fad-1;
|
||||
last_tk = tno;
|
||||
}
|
||||
if(last_tk < tno){
|
||||
// close last track
|
||||
tk = &cdb.tracks[last_tk];
|
||||
tk->fad_end = fad_offset+fad-1;
|
||||
last_tk = tno;
|
||||
}
|
||||
|
||||
tk = &cdb.tracks[tno];
|
||||
if(idx==0){
|
||||
tk->fad_0 = fad_offset + fad;
|
||||
}
|
||||
if(idx==1){
|
||||
tk->fad_start = fad_offset + fad;
|
||||
if(tk->fad_0==0)
|
||||
tk->fad_0 = tk->fad_start;
|
||||
tk->file_offset = fad*tk->sector_size;
|
||||
tk->ctrl_addr = (tk->mode==3)? 0x01 : 0x41;
|
||||
}
|
||||
tk = &cdb.tracks[tno];
|
||||
if(idx==0){
|
||||
tk->fad_0 = fad_offset + fad;
|
||||
}
|
||||
if(idx==1){
|
||||
tk->fad_start = fad_offset + fad;
|
||||
if(tk->fad_0==0)
|
||||
tk->fad_0 = tk->fad_start;
|
||||
tk->file_offset = fad*tk->sector_size;
|
||||
tk->ctrl_addr = (tk->mode==3)? 0x01 : 0x41;
|
||||
}
|
||||
}else if(strcmp(token, "CATALOG")==0){
|
||||
}else{
|
||||
|
@ -200,9 +188,6 @@ int parse_cue(char *fname, int check)
|
|||
}
|
||||
}
|
||||
|
||||
if(check)
|
||||
return 0;
|
||||
|
||||
// close last track
|
||||
tk = &cdb.tracks[tno];
|
||||
int fad_size = (f_size(tk_fp)-tk->file_offset)/tk->sector_size;
|
||||
|
@ -224,50 +209,56 @@ static int *disc_path = (int *)0x61800004;
|
|||
static char *path_str = (char*)0x61800000;
|
||||
static int pbptr;
|
||||
|
||||
static int scan_cue(char *dirname, char *fname, int level)
|
||||
|
||||
int list_disc(int show)
|
||||
{
|
||||
if(level>1)
|
||||
return 1;
|
||||
|
||||
char *p = strrchr(fname, '.');
|
||||
if(p==NULL || strcmp(p, ".cue")){
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
// ½âÎö´óÁ¿µÄcueÌ«ºÄʱ¼äÁË.
|
||||
int retv = parse_cue(fname, 1);
|
||||
if(retv){
|
||||
printk("parse_cue: %d {%s}\n", retv, fname);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
disc_path[total_disc] = pbptr;
|
||||
strcpy(path_str+pbptr, fname);
|
||||
pbptr += strlen(fname)+1;
|
||||
|
||||
total_disc += 1;
|
||||
*(int*)(0x61800000) = total_disc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void list_disc(void)
|
||||
{
|
||||
int i;
|
||||
FRESULT retv;
|
||||
DIR dir;
|
||||
FILINFO *info;
|
||||
|
||||
total_disc = 0;
|
||||
pbptr = 0x1000;
|
||||
memset(disc_path, 0x00, 0x20000);
|
||||
|
||||
scan_dir("/SAROO/ISO", 0, scan_cue);
|
||||
memset(&dir, 0, sizeof(dir));
|
||||
|
||||
retv = f_opendir(&dir, "/SAROO/ISO");
|
||||
if(retv)
|
||||
return -1;
|
||||
|
||||
info = malloc(sizeof(FILINFO));
|
||||
memset(info, 0, sizeof(*info));
|
||||
|
||||
while(1){
|
||||
retv = f_readdir(&dir, info);
|
||||
if(retv!=FR_OK || info->fname[0]==0)
|
||||
break;
|
||||
if(info->fname[0]=='.')
|
||||
continue;
|
||||
|
||||
if(info->fattrib & AM_DIR){
|
||||
disc_path[total_disc] = pbptr;
|
||||
sprintk(path_str+pbptr, "/SAROO/ISO/%s", info->fname);
|
||||
pbptr += strlen(info->fname)+1+11;
|
||||
|
||||
total_disc += 1;
|
||||
*(int*)(0x61800000) = total_disc;
|
||||
}
|
||||
}
|
||||
|
||||
f_closedir(&dir);
|
||||
free(info);
|
||||
|
||||
printk("Total discs: %d\n", total_disc);
|
||||
for(i=0; i<total_disc; i++){
|
||||
printk(" %2d: %s\n", i, path_str+disc_path[i]);
|
||||
if(show){
|
||||
int i;
|
||||
for(i=0; i<total_disc; i++){
|
||||
printk(" %2d: %s\n", i, path_str+disc_path[i]);
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
printk("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -293,9 +284,55 @@ int unload_disc(void)
|
|||
}
|
||||
|
||||
|
||||
int find_cue_iso(char *dirname, char *outname)
|
||||
{
|
||||
FRESULT retv;
|
||||
DIR dir;
|
||||
FILINFO *info;
|
||||
int type = 0;
|
||||
|
||||
memset(&dir, 0, sizeof(dir));
|
||||
retv = f_opendir(&dir, dirname);
|
||||
if(retv)
|
||||
return -1;
|
||||
|
||||
info = malloc(sizeof(FILINFO));
|
||||
memset(info, 0, sizeof(*info));
|
||||
|
||||
while(1){
|
||||
retv = f_readdir(&dir, info);
|
||||
if(retv!=FR_OK || info->fname[0]==0)
|
||||
break;
|
||||
if(info->fname[0]=='.')
|
||||
continue;
|
||||
|
||||
if(info->fattrib & AM_DIR){
|
||||
}else{
|
||||
char *p = strrchr(info->fname, '.');
|
||||
if(strcmp(p, ".cue")==0){
|
||||
// 读到cue, 直接返回.
|
||||
sprintk(outname, "%s/%s", dirname, info->fname);
|
||||
type = 1;
|
||||
break;
|
||||
}else if(strcmp(p, ".iso")==0){
|
||||
// 读到iso, 还要继续看有没有cue.
|
||||
sprintk(outname, "%s/%s", dirname, info->fname);
|
||||
type = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
f_closedir(&dir);
|
||||
free(info);
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
int load_disc(int index)
|
||||
{
|
||||
int retv;
|
||||
char *fname;
|
||||
|
||||
unload_disc();
|
||||
|
||||
|
@ -304,10 +341,23 @@ int load_disc(int index)
|
|||
return -1;
|
||||
}
|
||||
|
||||
printk("Load disc: {%s}\n", path_str+disc_path[index]);
|
||||
retv = parse_cue(path_str+disc_path[index], 0);
|
||||
fname = malloc(256);
|
||||
retv = find_cue_iso(path_str+disc_path[index], fname);
|
||||
if(retv<0)
|
||||
goto _exit;
|
||||
|
||||
printk("Load disc: {%s}\n", fname);
|
||||
if(retv==1){
|
||||
retv = parse_cue(fname);
|
||||
}else{
|
||||
//retv = parse_iso(fname); TODO
|
||||
}
|
||||
if(retv){
|
||||
printk(" retv=%d\n", retv);
|
||||
}
|
||||
|
||||
_exit:
|
||||
free(fname);
|
||||
return retv;
|
||||
}
|
||||
|
||||
|
|
|
@ -642,6 +642,7 @@ int seek_cd(void)
|
|||
}else if(pos&0x800000){
|
||||
// PTYPE_FAD
|
||||
cdb.play_fad_start = pos&0x0fffff;
|
||||
cdb.fad = cdb.play_fad_start;
|
||||
cdb.track = fad_to_track(cdb.play_fad_start);
|
||||
cdb.index = 1;
|
||||
cdb.options = 0x00;
|
||||
|
|
|
@ -155,8 +155,7 @@ void disk_task(void *arg)
|
|||
|
||||
cdb.status = STAT_NODISC;
|
||||
|
||||
list_disc();
|
||||
load_disc(0);
|
||||
list_disc(0);
|
||||
|
||||
play_track = NULL;
|
||||
buf_fad_start = 0;
|
||||
|
@ -174,6 +173,10 @@ _restart_wait:
|
|||
if(cdb.pause_request){
|
||||
goto _restart_nowait;
|
||||
}
|
||||
if(cdb.play_wait && cdb.block_free){
|
||||
cdb.play_wait = 0;
|
||||
goto _restart_nowait;
|
||||
}
|
||||
HIRQ = HIRQ_SCDQ;
|
||||
set_peri_report();
|
||||
#if 0
|
||||
|
@ -375,6 +378,7 @@ void cdc_delay(int ticks)
|
|||
|
||||
void ss_cmd_handle(void)
|
||||
{
|
||||
int retv;
|
||||
u32 cmd = SS_CMD;
|
||||
|
||||
printk("scmd_task: %04x\n", SS_CMD);
|
||||
|
@ -387,18 +391,16 @@ void ss_cmd_handle(void)
|
|||
break;
|
||||
case 0x0002:
|
||||
// 列出镜像信息
|
||||
list_disc();
|
||||
retv = list_disc(0);
|
||||
SS_ARG = retv;
|
||||
SS_CMD = 0;
|
||||
break;
|
||||
case 0x0003:
|
||||
{
|
||||
int retv;
|
||||
// 装载镜像
|
||||
retv = load_disc(SS_ARG);
|
||||
SS_ARG = retv;
|
||||
SS_CMD = 0;
|
||||
break;
|
||||
}
|
||||
case 0x0004:
|
||||
{
|
||||
// 检查是否有升级固件
|
||||
|
|
Loading…
Add table
Reference in a new issue