Beispiel #1
0
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 ();
}
Beispiel #2
0
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;
}
Beispiel #3
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;
    }
}
Beispiel #4
0
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 ();
}
Beispiel #5
0
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();
}
Beispiel #6
0
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;
}
Beispiel #7
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;
    }
}