hschumann2/TempleOS-Source-Code
0838
1 2U0 SongPuppet(CTask *task,I64 passes)3{4 CDbgInfo *dbg_info;5 I64 i,start,end,rip,last_rip;6 CHashFun *tmpf=NULL;7 for (i=0;i<250 && TaskValidate(task);i++) {8 if (tmpf=HashFind("Song",task->hash_table,HTT_FUN))9 break;10 Sleep(1);11 }12 if (tmpf && (dbg_info=tmpf->dbg_info)) {13 start=dbg_info->body[0];14 end =dbg_info->body[dbg_info->max_line+1-dbg_info->min_line];15 last_rip=0;16 while (TRUE) {17 i=0;18 while (TaskValidate(task) && (rip=TaskCaller(task,i++))) {19 if (start<=rip<end) {20 if (rip<last_rip && --passes<=0)21 return;22 last_rip=rip;23 }24 }25 Sleep(1);26 }27 }28}29 30U0 JukeSongPuppet(CTask *juke_task,I64 passes,I64 song_num,U8 *name)31{32 Bool found;33 CTask *task;34 I64 i;35 36 if (FileExtDot(name))37 FileExtRem(name);38 BirthWait(&juke_task->popup_task);39 TaskWait(juke_task->popup_task);40 PostMsg(juke_task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP+SCF_CTRL);41 TaskWait(juke_task->popup_task);42 for (i=0;i<song_num;i++) {43 PostMsg(juke_task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_RIGHT);44 TaskWait(juke_task->popup_task);45 }46 47 PostMsg(juke_task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0);48 TaskWait(juke_task->popup_task);49 Sleep(500);50 51 found=FALSE;52 task=Fs->next_task;53 while (task!=Fs) {54 if (!StrCmp(task->task_title,name)) {55 found=TRUE;56 break;57 }58 task=task->next_task;59 }60 61 if (found) {//Position cursor on song title during song62 TaskWait(juke_task->popup_task);63 PostMsg(juke_task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP+SCF_CTRL);64 TaskWait(juke_task->popup_task);65 for (i=0;i<song_num;i++) {66 PostMsg(juke_task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_RIGHT);67 TaskWait(juke_task->popup_task);68 }69 SongPuppet(task,passes);70 }71 Kill(task);72}73 74public U0 JukeSongsPuppet(U8 *dirname="~/Psalmody",I64 passes=2,75 I64 start_song=0,I64 end_song=I64_MAX)76{//Help make music video by puppeting JukeBox task.77 I64 i;78 CDirEntry *tmpde,*tmpde1;79 CTask *juke_task=User("JukeBox(0x%X);\n",dirname);80 Cd(dirname);81 tmpde1=FilesFind("*",FUF_RECURSE|FUF_JUST_TXT|FUF_JUST_FILES);82 for (tmpde=tmpde1,i=0;tmpde && i<start_song;i++)83 tmpde=tmpde->next;84 for (i=start_song;tmpde && i<end_song;i++) {85 JukeSongPuppet(juke_task,passes,i,tmpde->name);86 tmpde=tmpde->next;87 }88 DirTreeDel(tmpde1);89 Kill(juke_task);90}91 