static void driveclick_close(void) { driveclick_fdrawcmd_close (0); driveclick_fdrawcmd_close (1); for (int i = 0; i < 4; i++) { for (int j = 0; j < DS_END; j++) freesample (&drvs[i][j]); } memset (drvs, 0, sizeof (drvs)); click_initialized = 0; wave_initialized = 0; driveclick_reset (); }
void driveclick_free (void) { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < DS_END; j++) freesample (&drvs[i][j]); } memset (drvs, 0, sizeof (drvs)); free (clickbuffer); clickbuffer = 0; click_initialized = 0; }
void driveclick_init (void) { int v, vv, i, j; char tmp[1000]; driveclick_free (); vv = 0; for (i = 0; i < 4; i++) { if (currprefs.dfxclick[i]) { /* TODO: Implement location of sample data */ #if 0 if (currprefs.dfxclick[i] > 0) { v = 0; if (driveclick_loadresource (drvs[i], currprefs.dfxclick[i])) v = 3; } else if (currprefs.dfxclick[i] == -1) { sprintf (tmp, "%suae_data%cdrive_click_%s", start_path, FSDB_DIR_SEPARATOR, currprefs.dfxclickexternal[i]); v = loadsample (tmp, &drvs[i][DS_CLICK]); sprintf (tmp, "%suae_data%cdrive_spin_%s", start_path, FSDB_DIR_SEPARATOR, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_SPIN]); sprintf (tmp, "%suae_data%cdrive_spinnd_%s", start_path, FSDB_DIR_SEPARATOR, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_SPINND]); sprintf (tmp, "%suae_data%cdrive_startup_%s", start_path, FSDB_DIR_SEPARATOR, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_START]); sprintf (tmp, "%suae_data%cdrive_snatch_%s", start_path, FSDB_DIR_SEPARATOR, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_SNATCH]); } if (v == 0) { int j; for (j = 0; j < DS_END; j++) freesample (&drvs[i][j]); currprefs.dfxclick[i] = changed_prefs.dfxclick[i] = 0; } for (j = 0; j < DS_END; j++) drvs[i][j].len <<= DS_SHIFT; drvs[i][DS_CLICK].pos = drvs[i][DS_CLICK].len; drvs[i][DS_SNATCH].pos = drvs[i][DS_SNATCH].len; vv += currprefs.dfxclick[i]; #endif } } if (vv > 0) { driveclick_reset (); click_initialized = 1; } }
void driveclick_free (void) { int i, j; driveclick_fdrawcmd_close (0); driveclick_fdrawcmd_close (1); for (i = 0; i < 4; i++) { for (j = 0; j < DS_END; j++) freesample (&drvs[i][j]); drv_starting[i] = 0; drv_spinning[i] = 0; drv_has_spun[i] = 0; drv_has_disk[i] = 0; } memset (drvs, 0, sizeof (drvs)); click_initialized = 0; wave_initialized = 0; driveclick_reset (); }
void driveclick_init (void) { int v, vv; TCHAR tmp[MAX_DPATH]; #ifdef FSUAE write_log("driveclick_init\n"); #endif driveclick_fdrawcmd_detect (); driveclick_close(); vv = 0; for (int i = 0; i < 4; i++) { struct floppyslot *fs = &currprefs.floppyslots[i]; for (int j = 0; j < CLICK_TRACKS; j++) { drvs[i][DS_CLICK].indexes[j] = 0; drvs[i][DS_CLICK].lengths[j] = 0; } if (fs->dfxclick) { v = 0; if (fs->dfxclick > 0) { switch(fs->dfxclick) { case 1: if (driveclick_loadresource (drvs[i], fs->dfxclick)) v = 3; for (int j = 0; j < CLICK_TRACKS; j++) drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len; wave_initialized = 1; break; default: if (driveclick_fdrawcmd_open (fs->dfxclick - 2)) v = 1; break; } } else if (fs->dfxclick == -1) { TCHAR path2[MAX_DPATH]; wave_initialized = 1; for (int j = 0; j < CLICK_TRACKS; j++) drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len; get_plugin_path (path2, sizeof path2 / sizeof (TCHAR), _T("floppysounds")); _stprintf (tmp, _T("%sdrive_click_%s"), path2, fs->dfxclickexternal); v = loadsample (tmp, &drvs[i][DS_CLICK]); if (v) processclicks (&drvs[i][DS_CLICK]); _stprintf (tmp, _T("%sdrive_spin_%s"), path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_SPIN]); _stprintf (tmp, _T("%sdrive_spinnd_%s"), path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_SPINND]); _stprintf (tmp, _T("%sdrive_startup_%s"), path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_START]); _stprintf (tmp, _T("%sdrive_snatch_%s"), path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_SNATCH]); } if (v == 0) { for (int j = 0; j < DS_END; j++) freesample (&drvs[i][j]); fs->dfxclick = changed_prefs.floppyslots[i].dfxclick = 0; } else { vv++; } for (int j = 0; j < DS_END; j++) drvs[i][j].len <<= DS_SHIFT; drvs[i][DS_CLICK].pos = drvs[i][DS_CLICK].len; drvs[i][DS_SNATCH].pos = drvs[i][DS_SNATCH].len; } } if (vv > 0) { click_initialized = 1; } driveclick_reset(); }
int load_cur_song (char *name, int mode) { TokFile *f; long generaltok, curtoken, filevernumber = -1, /* no de version du fichier */ error = 0, reste; int filenbsample = -1, filemaxpatternrow = -1, filemaxpattern = -1, sampletoread, i, nosdst = 1, warnremain = 1; if ((f = ftok_open (name, FTOK_READ)) == NULL) { fprintf (stderr, "error: unable to open %s, aborting\n", name); return -1; } generaltok = ftok_readraw (f); if (generaltok != CHUNKgrov) { if (generaltok < 0) { fprintf (stderr, "error reading %s, could not read first token, aborting\n", name); ftok_close (f); return -1; } fprintf (stderr, "error reading %s, first token 0x%08lx inappropriate, aborting\n", name, generaltok); ftok_close (f); return -1; } while ((error == 0) && (curtoken = ftok_readraw (f)) > 0) { char tokname[6]; *(long *) tokname = curtoken; tokname[4] = 0; #ifdef DEBUGGROVIO fprintf (stderr, "entering token [%s]\n", tokname); #endif warnremain = 1; switch (curtoken) { case CHUNKable: if (cktread (&filevernumber, 4, f)) filevernumber = -1; filevernumber = VONClong (filevernumber); if (filevernumber != vernumber) { char *p = (char *) &filevernumber; if (filevernumber > vernumber) fprintf (stderr, "warning: %s has been writen by a newer version groovit-%d.%d.%d.%d\n", name, p[3], p[2], p[1], p[0]); else fprintf (stderr, "warning: %s has been writen by an older version groovit-%d.%d.%d.%d\n", name, p[3], p[2], p[1], p[0]); } error += cktread_short (f, &filemaxpattern); if (error == FTOK_EXCEED) { error = 0; filemaxpattern = MAXPATTERN; break; } if (error) break; break; case CHUNKgprm: /* General PaRaMeters */ error += cktread_short (f, &bpm); error += cktread_short (f, &pattpatbut.ncurpattern); break; case CHUNKdelp: /* DELay Parameters */ error += cktread_short (f, &decay); error += cktread_short (f, &delaytick); break; case CHUNKrptn: /* Rythms (samples) PaTerN */ error += cktread_short (f, &filenbsample); if (filenbsample > MAXSAMPLE) { fprintf (stderr, "warning: file %s uses %d samples and I handle only %d, truncate !\n", name, filenbsample, MAXSAMPLE); sampletoread = MAXSAMPLE; } else sampletoread = filenbsample; error += cktread_short (f, &filemaxpatternrow); if (filemaxpatternrow > MAXPATTERNROW) { fprintf (stderr, "warning: file %s uses %d rows in patterns and I handle only %d, truncate !\n", name, filemaxpatternrow, MAXPATTERNROW); } if (filemaxpatternrow > 10 * MAXPATTERNROW) { fprintf (stderr, "error: reading %s I cannot read %d raws in a pattern yet, sorry an aborting! \n", name, filemaxpatternrow); break; } { int numo[10 * MAXPATTERNROW], no, filenbrow; for (i = 0; i < MAXPATTERNROW; i++) numo[i] = 0; error += cktread_short (f, &no); if (error) break; if ((no < 0) || (no > filemaxpattern)) { fprintf (stderr, "error reading pattern in %s: %d is an invalid patnumber, skipped\n", name, no); break; } if (no >= MAXPATTERN) { fprintf (stderr, "warning reading pattern in %s: dont have enough pattern to read one numbered %d ! skipped\n", name, no); break; } error += cktread_short (f, &filenbrow); if (error) break; if ((filenbrow > filemaxpatternrow) || (filenbrow < 0)) { fprintf (stderr, "warning reading %s: pattern %d has %d rows which is more than the declared max (%d) of that file ?\nignored\n", name, no, filenbrow, filemaxpatternrow); filenbrow = (filenbrow > MAXPATTERNROW) ? MAXPATTERNROW : filenbrow; filenbrow = (filenbrow < 0) ? MAXPATTERNROW : filenbrow; } for (i = 0; i < sampletoread; i++) { error += ckfread_datas (f, numo, filemaxpatternrow); if (error) break; if (i < MAXSAMPLE) { memcpy (pattern[no].start[i], numo, MAXPATTERNROW * sizeof (int)); pattern[no].isnew = 0; pattern[no].nbrow = filenbrow > MAXPATTERNROW ? MAXPATTERNROW : filenbrow; } } for (i = 0; i < MAXPATTERNROW; i++) numo[i] = 0; for (i = sampletoread; i < MAXSAMPLE; i++) /* clearing voices remaining */ memcpy (pattern[no].start[i], numo, MAXPATTERNROW * sizeof (int)); } break; case CHUNKaptn: /* Analog PaTerN */ error += cktread_short (f, &filemaxpatternrow); if (error) break; if (filemaxpatternrow > MAXPATTERNROW) { fprintf (stderr, "warning: file %s uses %d rows in patterns and I handle only %d, truncate !\n", name, filemaxpatternrow, MAXPATTERNROW); } if (filemaxpatternrow > 10 * MAXPATTERNROW) { fprintf (stderr, "error: reading %s I cannot read %d raws in a pattern yet, sorry an aborting! \n", name, filemaxpatternrow); break; } { int numo[10 * MAXPATTERNROW], no, filenbrow; for (i = 0; i < MAXPATTERNROW; i++) numo[i] = 0; error += cktread_short (f, &no); if (error) break; if ((no < 0) || (no > filemaxpattern)) { fprintf (stderr, "error reading pattern in %s: %d is an invalid patnumber, skipped\n", name, no); break; } if (no >= MAXPATTERN) { fprintf (stderr, "warning reading pattern in %s: dont have enough pattern to read one numbered %d ! skipped\n", name, no); break; } error += cktread_short (f, &filenbrow); if (error) break; if ((filenbrow > filemaxpatternrow) || (filenbrow < 0)) { fprintf (stderr, "warning reading %s: pattern %d has %d rows which is more than the declared max (%d) of that file ?\nignored\n", name, no, filenbrow, filemaxpatternrow); filenbrow = (filenbrow > MAXPATTERNROW) ? MAXPATTERNROW : filenbrow; filenbrow = (filenbrow < 0) ? MAXPATTERNROW : filenbrow; } error += ckfread_datas (f, numo, filemaxpatternrow); if (error) break; memcpy (apattern[no].freqbase, numo, MAXPATTERNROW * sizeof (int)); apattern[no].isnew = 0; apattern[no].nbrow = filenbrow > MAXPATTERNROW ? MAXPATTERNROW : filenbrow; } break; case CHUNKfptn: /* Filter PaTerN */ error += cktread_short (f, &filemaxpatternrow); if (error) break; if (filemaxpatternrow > MAXPATTERNROW) { fprintf (stderr, "warning: file %s uses %d rows in patterns and I handle only %d, truncate !\n", name, filemaxpatternrow, MAXPATTERNROW); } if (filemaxpatternrow > 10 * MAXPATTERNROW) { fprintf (stderr, "error: reading %s I cannot read %d raws in a pattern yet, sorry an aborting! \n", name, filemaxpatternrow); break; } { int numo[10 * MAXPATTERNROW], no, filenbrow; for (i = 0; i < MAXPATTERNROW; i++) numo[i] = 0; error += cktread_short (f, &no); if (error) break; if (no < 0) { fprintf (stderr, "error reading pattern in %s: %d is an invalid patnumber, skipped\n", name, no); break; } if (no >= MAXPATTERN) { fprintf (stderr, "warning reading filter pattern in %s: dont have enough filter pattern to read one numbered %d ! skipped\n", name, no); break; } error += cktread_short (f, &filenbrow); if (error) break; if ((filenbrow > filemaxpatternrow) || (filenbrow < 0)) { fprintf (stderr, "warning reading %s: pattern %d has %d rows which is more than the declared max (%d) of that file ?\nignored\n", name, no, filenbrow, filemaxpatternrow); filenbrow = (filenbrow > MAXPATTERNROW) ? MAXPATTERNROW : filenbrow; filenbrow = (filenbrow < 0) ? MAXPATTERNROW : filenbrow; } error += ckfread_datas (f, numo, filemaxpatternrow); if (error) break; memcpy (fpattern[no].freqbase, numo, MAXPATTERNROW * sizeof (int)); fpattern[no].isnew = 0; fpattern[no].nbrow = filenbrow > MAXPATTERNROW ? MAXPATTERNROW : filenbrow; } break; case CHUNKfprm: /* Filter PaRaMeters */ { int no; int voice; error += cktread_short (f, &no); if (error) break; if (no < 0) { fprintf (stderr, "error reading %s: invalid filter voice number %d, skipped\n", name, no); break; } if (no >= MAXDYFILT) { fprintf (stderr, "warning reading %s: cannot handle filter voices numbered %d, will steer only %d...\n", name, no, MAXANALOG); break; } voice = MAXSAMPLE + MAXANALOG + no; /* JDJDJDJD a parfaire */ #ifdef DEB_VOICEAFF fprintf (stderr, "filter no:%d voice:%d\n", no, voice); #endif error += cktread_short (f, &dyfilter[no].patbut.ncurpattern); error += cktread_short (f, &dyfilter[no].reso.ctfreqcut); error += cktread_short (f, &dyfilter[no].reso.ctfreqcut2); error += cktread_short (f, &dyfilter[no].reso.ctreso); error += cktread_short (f, &dyfilter[no].reso.ctdecay); /* error += cktread_short (f, &filter.level); error += cktread_short (f, &filter.pan); error += cktread_short (f, &filter.revlevel); */ error += cktread_short (f, &vlevel[voice]); /* JDJDJDJD a parfaire */ error += cktread_short (f, &vpan[voice]); error += cktread_short (f, &mixeur[0].level[voice]); error += cktread_short (f, &mixeur[1].level[voice]); if (error == FTOK_EXCEED) error = 0; } break; case 0x6D746167: { long dummy = -1, last = -1, k = runningk; while ((error = cktread (&dummy, sizeof (long), f)) == 0) last = dummy; if (error != FTOK_EXCEED) break; error = 0; last = VONClong (last); if (last != k) fprintf (stderr, "%ld != %ld\n", last, k); } break; case CHUNKaprm: /* Analog PaRaMeters */ { int no; int voice; error += cktread_short (f, &no); if (error) break; if (no < 0) break; if (no >= MAXANALOG) { fprintf (stderr, "warning reading %s: cannot handle analog voices numbered %d, will steer only %d...\n", name, no, MAXANALOG); break; } voice = MAXSAMPLE + no; /* JDJDJDJDJD a parfaire */ #ifdef DEB_VOICEAFF fprintf (stderr, "analog no:%d voice:%d\n", no, voice); #endif error += cktread_short (f, &anvoice[no].patbut.ncurpattern); error += cktread_short (f, &anvoice[no].reso.ctfreqcut); error += cktread_short (f, &anvoice[no].reso.ctfreqcut2); error += cktread_short (f, &anvoice[no].reso.ctreso); error += cktread_short (f, &anvoice[no].reso.ctdecay); /* error += cktread_short (f, &analog[no].level); error += cktread_short (f, &analog[no].pan); error += cktread_short (f, &analog[no].revlevel); */ error += cktread_short (f, &vlevel[voice]); /* JDJDJDJD a parfaire */ error += cktread_short (f, &vpan[voice]); error += cktread_short (f, &mixeur[0].level[voice]); error += cktread_short (f, &mixeur[1].level[voice]); if (error == FTOK_EXCEED) error = 0; } break; case CHUNKsdst: /* Sample DiSTribution */ if (nosdst == 0) fprintf (stderr, "warning: reading %s a second sample dist chunk !!!???\n", name); nosdst = 0; error += cktread_short (f, &filenbsample); if (error) break; if (filenbsample < 0) { filenbsample = -1; break; } if (filenbsample > MAXSAMPLE) { fprintf (stderr, "warning: file %s uses %d samples and I handle only %d, truncate !\n", name, filenbsample, MAXSAMPLE); sampletoread = MAXSAMPLE; } else sampletoread = filenbsample; for (i = 0; i < filenbsample; i++) { int no, lname; int voice; char samplename[MAXDIRSIZE]; int level, pan, revlevel, filtl; error += cktread_short (f, &no); if (error == FTOK_EXCEED) { error = 0; break; } error += cktread_short (f, &lname); if (error) break; if ((lname > MAXDIRSIZE - 2) || (lname < 0)) { fprintf (stderr, "error: reading %s, mispelled sample entry len=%d\n", name, lname); break; } error += cktread (samplename, lname, f); /* no endianess needed here neither */ samplename[lname] = 0; if (error) break; error += cktread_short (f, &level); error += cktread_short (f, &pan); error += cktread_short (f, &revlevel); error += cktread_short (f, &filtl); if (no < sampletoread) { #ifdef VERYNASTYDEBUG fprintf (stderr, "attributing levels to sample[%d]\n", no); #endif /* sample[no].level = level; sample[no].pan = pan; sample[no].revlevel = revlevel; sample[no].filtl = filtl; */ voice = no; /* JDJDJDJD a parfaire */ vlevel[voice] = level; vpan[voice] = pan; mixeur[0].level[voice] = revlevel; mixeur[1].level[voice] = filtl; /* autant dire qu'on n'est pas dans la merde ! */ { char buf[MAXDIRSIZE]; Sample *newsample = &sample[no]; cursamp[no] = 0; freesample (newsample); if (samplename[0] != '/') { strcpy (buf, SAMPLEPATH); strcat (buf, "/"); strcat (buf, samplename); } else strcpy (buf, samplename); #ifdef VERYNASTYDEBUG fprintf (stderr, "attributing %s to sample[%d]\n", buf, no); #endif if (readsample (buf, newsample) == NULL) freesample (newsample); relooksimplebutton (hbt_sample[no], '@', CONTBLUE + CONTNOPUCE, newsample->shortname); } } } break; default: fprintf (stderr, "warning: unknown token %s in %s\n", tokname, name); warnremain = 0; } ftok_closereadraw (f, curtoken, &reste); #ifdef DEBUGGROVIO fprintf (stderr, " gone out [%s] size: %ld\n", tokname, reste); #endif } ftok_closereadraw (f, generaltok, &reste); if (reste != 0) fprintf (stderr, "warning reading %s, %ld bytes miscounted at end of file, skipped\n", name, reste); ftok_close (f); return 0; }
void driveclick_init (void) { int v, vv, i, j; TCHAR tmp[MAX_DPATH]; driveclick_fdrawcmd_detect (); driveclick_free (); vv = 0; for (i = 0; i < 4; i++) { for (j = 0; j < CLICK_TRACKS; j++) { drvs[i][DS_CLICK].indexes[j] = 0; drvs[i][DS_CLICK].lengths[j] = 0; } if (currprefs.dfxclick[i]) { if (currprefs.dfxclick[i] > 0) { v = 0; switch(currprefs.dfxclick[i]) { case 1: if (driveclick_loadresource (drvs[i], currprefs.dfxclick[i])) v = 3; for (j = 0; j < CLICK_TRACKS; j++) drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len; wave_initialized = 1; break; default: if (driveclick_fdrawcmd_open (currprefs.dfxclick[i] - 2)) v = 1; break; } } else if (currprefs.dfxclick[i] == -1) { TCHAR path2[MAX_DPATH]; wave_initialized = 1; for (j = 0; j < CLICK_TRACKS; j++) drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len; // _stprintf (tmp, "%splugins%cfloppysounds%c", "./", FSDB_DIR_SEPARATOR, FSDB_DIR_SEPARATOR, FSDB_DIR_SEPARATOR); // if (my_existsdir (tmp)) // _tcscpy (path2, tmp); // else _stprintf (path2, "%suae_data%c", "./", FSDB_DIR_SEPARATOR); _stprintf (tmp, "%sdrive_click_LOUD%s", path2, currprefs.dfxclickexternal[i]); v = loadsample (tmp, &drvs[i][DS_CLICK]); if (v) processclicks (&drvs[i][DS_CLICK]); _stprintf (tmp, "%sdrive_spin_LOUD%s", path2, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_SPIN]); _stprintf (tmp, "%sdrive_spinnd_LOUD%s", path2, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_SPINND]); _stprintf (tmp, "%sdrive_startup_LOUD%s", path2, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_START]); _stprintf (tmp, "%sdrive_snatch_LOUD%s", path2, currprefs.dfxclickexternal[i]); v += loadsample (tmp, &drvs[i][DS_SNATCH]); } if (v == 0) { int j; for (j = 0; j < DS_END; j++) freesample (&drvs[i][j]); currprefs.dfxclick[i] = changed_prefs.dfxclick[i] = 0; } else { vv++; } for (j = 0; j < DS_END; j++) drvs[i][j].len <<= DS_SHIFT; drvs[i][DS_CLICK].pos = drvs[i][DS_CLICK].len; drvs[i][DS_SNATCH].pos = drvs[i][DS_SNATCH].len; } } if (vv > 0) { driveclick_reset (); click_initialized = 1; } }