static int w32g_add_playlist1(char *filename, int uniq, int refine) { PlayListEntry *entry; char *title; struct midi_file_info *info; if(uniq) { int i; for(i = 0; i < playlist.nfiles; i++) if(pathcmp(filename, playlist.list[i].filename, 0) == 0) return 0; } title = get_midi_title(filename); info = get_midi_file_info(filename, 1); if(refine && info->format < 0) return 0; if(playlist.allocated == 0) { playlist.allocated = 32; playlist.list = (PlayListEntry *)safe_malloc(playlist.allocated * sizeof(PlayListEntry)); } else if(playlist.nfiles == playlist.allocated) { playlist.allocated *= 2; playlist.list = (PlayListEntry *)safe_realloc(playlist.list, playlist.allocated * sizeof(PlayListEntry)); } entry = &playlist.list[playlist.nfiles]; entry->filename = safe_strdup(filename); entry->title = title; entry->info = info; playlist.nfiles++; w32g_shuffle_playlist_reset(1); return 1; }
static void ctl_pass_playing_list(int init_number_of_files, char *init_list_of_files[]) { int current_no,command=RC_NONE,i,j; int32 val; char *p; /* Wait prepare 'interface' */ a_pipe_read(local_buf,sizeof(local_buf)); if (strcmp("READY",local_buf)) return; xaw_ready=1; sprintf(local_buf,"%d", (opt_modulation_wheel<<MODUL_N) | (opt_portamento<<PORTA_N) | (opt_nrpn_vibrato<<NRPNV_N) | (opt_reverb_control<<REVERB_N) | (opt_channel_pressure<<CHPRESSURE_N) | (opt_overlap_voice_allow<<OVERLAPV_N) | (opt_trace_text_meta_event<<TXTMETA_N)); a_pipe_write(local_buf); sprintf(local_buf,"%d",opt_chorus_control); a_pipe_write(local_buf); /* Make title string */ titles=(char **)safe_malloc(init_number_of_files*sizeof(char *)); list_of_files=(char **)safe_malloc(init_number_of_files*sizeof(char *)); for (i=0,j=0;i<init_number_of_files;i++) { if(check_midi_file(init_list_of_files[i]) >= 0) { p=strrchr(init_list_of_files[i],'/'); if (p==NULL) { p=safe_strdup(init_list_of_files[i]); } else p++; list_of_files[j]= safe_strdup(init_list_of_files[i]); titles[j]=(char *)safe_malloc(sizeof(char)*(strlen(p)+ 9)); sprintf(titles[j],"%d. %s",j+1,p); j++; number_of_files = j; } } titles=(char **)safe_realloc(titles,init_number_of_files*sizeof(char *)); list_of_files=(char **)safe_realloc(list_of_files,init_number_of_files*sizeof(char *)); /* Send title string */ sprintf(local_buf,"%d",number_of_files); a_pipe_write(local_buf); for (i=0;i<number_of_files;i++) a_pipe_write(titles[i]); /* Make the table of play sequence */ file_table=(int *)safe_malloc(number_of_files*sizeof(int)); for (i=0;i<number_of_files;i++) file_table[i]=i; /* Draw the title of the first file */ current_no=0; if(number_of_files!=0){ snprintf(local_buf,sizeof(local_buf),"E %s",titles[file_table[0]]); a_pipe_write(local_buf); command=ctl_blocking_read(&val); } /* Main loop */ for (;;) { /* Play file */ if (command==RC_LOAD_FILE&&number_of_files!=0) { char *title; snprintf(local_buf,sizeof(local_buf),"E %s",titles[file_table[current_no]]); a_pipe_write(local_buf); if((title = get_midi_title(list_of_files[file_table[current_no]])) == NULL) title = list_of_files[file_table[current_no]]; snprintf(local_buf,sizeof(local_buf),"e %s", title); a_pipe_write(local_buf); command=play_midi_file(list_of_files[file_table[current_no]]); } else { if (command==RC_CHANGE_VOLUME) amplitude+=val; if (command==RC_JUMP) ; if (command==RC_TOGGLE_SNDSPEC) ; /* Quit timidity*/ if (exitflag & EXITFLG_QUIT) return; /* Stop playing */ if (command==RC_QUIT) { sprintf(local_buf,"T 00:00"); a_pipe_write(local_buf); /* Shuffle the table */ if (randomflag) { if(number_of_files == 0) { randomflag=0; continue; } current_no=0; if (randomflag==1) { shuffle(number_of_files,file_table); randomflag=0; command=RC_LOAD_FILE; continue; } randomflag=0; for (i=0;i<number_of_files;i++) file_table[i]=i; snprintf(local_buf,sizeof(local_buf),"E %s",titles[file_table[current_no]]); a_pipe_write(local_buf); } /* Play the selected file */ if (selectflag) { for (i=0;i<number_of_files;i++) if (file_table[i]==selectflag-1) break; if (i!=number_of_files) current_no=i; selectflag=0; command=RC_LOAD_FILE; continue; } /* After the all file played */ } else if (command==RC_TUNE_END || command==RC_ERROR) { if (current_no+1<number_of_files) { current_no++; command=RC_LOAD_FILE; continue; } else if (exitflag & EXITFLG_AUTOQUIT) { return; /* Repeat */ } else if (repeatflag) { current_no=0; command=RC_LOAD_FILE; continue; /* Off the play button */ } else { a_pipe_write("O"); } /* Play the next */ } else if (command==RC_NEXT) { if (current_no+1<number_of_files) current_no++; command=RC_LOAD_FILE; continue; /* Play the previous */ } else if (command==RC_REALLY_PREVIOUS) { if (current_no>0) current_no--; command=RC_LOAD_FILE; continue; } command=ctl_blocking_read(&val); } } }