static bool Load(const wchar_t *filename){ struct Root *newroot; dc.success=true; curr_disk_line = 0; dc.file=DISK_open_for_reading(filename); if(dc.file==NULL){ GFX_Message(NULL,"Could not open \"%s\" for loading\n",STRING_get_chars(filename)); return false; } DC_fgets(); if (dc.success==false) return false; if(strcmp("RADIUM SONG",dc.ls)){ GFX_Message(NULL,"First line in song was not 'RADIUM SONG', but '%s'. Last: %d\n",dc.ls,dc.ls[strlen(dc.ls)-1]); DISK_close_and_delete(dc.file); return false; } disk_load_version=DC_LoadF(); if (dc.success==false) return false; if(disk_load_version>0.4201 && disk_load_version<0.50){ disk_load_version=0.51; dc.colorize=true; dc.startcolor=5; }else{ dc.colorize=false; } #if 0 if (disk_load_version < 0.75){ GFX_Message(NULL, "<p>Note! The portamento behavior for polyphonic tracks changed in Radium V3.4.9" "</p>" "<p>" "Before Radium V3.4.9, the default final portamento value was the pitch value of the next note after the <i>start</i> of the note. " "Now, the default final portamento value is the pitch value of the next note after the <i>end</i> of the note." "</p>" "<p>" "Old songs with portamento in polyphonic tracks might not sound the same." "</p>" ); } #endif if(disk_load_version>DISKVERSION+0.0001){ GFX_Message(NULL,"Need a newer version of Radium to load this song. The song version is %f, while this program only supports %f.\n",disk_load_version,DISKVERSION); return false; }else{ printf("Song diskVersion: %f\n",disk_load_version); } dc.filename=filename; dc.playlist=NULL; DC_Next(); if (dc.success==false) return false; if(strcmp(dc.ls,"OSSTUFF")){ GFX_Message(NULL, "OSSTUFF not found, but: '%s'. File: '%s'\n",dc.ls,STRING_get_chars(filename)); DISK_close_and_delete(dc.file); EndProgram(); exit(4); } LoadOsStuff(); printf("dc.ls: -%s-\n",dc.ls); if(strcmp(dc.ls,"ROOT")){ GFX_Message(NULL, "ROOT not found. Found '%s' instead.\n", dc.ls); DISK_close_and_delete(dc.file); EndProgram(); exit(5); } newroot=LoadRoot(); DISK_close_and_delete(dc.file); if(!dc.success){ GFX_Message(NULL, "Loading failed.\n"); EndProgram(); exit(6); } ResetUndo(); #ifdef _AMIGA CloseHelpWindow(); CloseCPPWindowWindow(); CloseBlockSelectWindow(); #endif CloseAllTrackerWindows(); GL_lock();{ GL_pause_gl_thread_a_short_while(); }GL_unlock(); //GL_draw_lock();{ PLAYER_lock();{ //<-- Locks within locks are dangerous. But it doesn't matter since the player isn't playing now anyway. root=newroot; //BANG! }PLAYER_unlock(); //}GL_draw_unlock(); Undo_start_ignoring_undo_operations();{ DLoadRoot(newroot); }Undo_stop_ignoring_undo_operations(); GL_create_all(root->song->tracker_windows); if(COMMENT_show_after_loading()) COMMENTDIALOG_open(); #ifdef _AMIGA currpatch=-1; #endif ResetUndo(); return true; }
struct Root *LoadRoot(void){ static char *objs[1]={ "SONG" }; static char *vars[14]={ "def_instrument", "curr_block", "tempo", "lpb", "signature_numerator", "signature_denominator", "quantitize", "quantitize_numerator", "quantitize_denominator", "grid_numerator", "grid_denominator", "keyoct", "min_standardvel", "standardvel" }; struct Root *ret=DC_alloc(sizeof(struct Root)); ret->quantitize_options = root->quantitize_options; ret->scrollplayonoff=true; ret->min_standardvel=MAX_VELOCITY*40/100; ret->editonoff=true; ret->grid_numerator=1; ret->grid_denominator=1; ret->signature.numerator=4; ret->signature.denominator=4; GENERAL_LOAD(1,14); obj0: ret->song=LoadSong(); goto start; var0: goto start; // Don't bother with instruments yet. var1: ret->curr_block=DC_LoadN(); goto start; var2: ret->tempo=DC_LoadI(); goto start; var3: ret->lpb=DC_LoadI(); goto start; var4: ret->signature.numerator=DC_LoadI(); goto start; var5: ret->signature.denominator=DC_LoadI(); goto start; var6: DC_LoadF(); goto start; var7: ret->quantitize_options.quant.numerator = DC_LoadI(); goto start; var8: ret->quantitize_options.quant.denominator = DC_LoadI(); goto start; var9: ret->grid_numerator=DC_LoadI(); goto start; var10: ret->grid_denominator=DC_LoadI(); goto start; var11: ret->keyoct=DC_LoadI(); goto start; var12: ret->min_standardvel=DC_LoadI(); goto start; var13: ret->standardvel=DC_LoadI(); goto start; var14: var15: var16: var17: var18: var19: var20: obj1: obj2: obj3: obj4: obj5: obj6: debug("loadroot, very wrong\n"); error: debug("loadroot, goto error\n"); end: return ret; }