#include "compiler.h"
#include "soundmng.h"
#include "pccore.h"
#include "fdd_mtr.h"
#if defined(SUPPORT_SWSEEKSND)
#include "sound.h"
#include "fdd_mtr.res"
#endif
#if defined(SUPPORT_SWSEEKSND)
static struct {
UINT enable;
struct {
PMIXHDR hdr;
PMIXTRK trk[2];
} snd;
} mtrsnd;
void fddmtrsnd_initialize(UINT rate) {
ZeroMemory(&mtrsnd, sizeof(mtrsnd));
if (np2cfg.MOTORVOL) {
mtrsnd.enable = 1;
mtrsnd.snd.hdr.enable = 3;
pcmmix_regist(&mtrsnd.snd.trk[0].data,
(void *)fddseek, sizeof(fddseek), rate);
mtrsnd.snd.trk[0].flag = PMIXFLAG_L | PMIXFLAG_R | PMIXFLAG_LOOP;
mtrsnd.snd.trk[0].volume = (np2cfg.MOTORVOL << 12) / 100;
pcmmix_regist(&mtrsnd.snd.trk[1].data,
(void *)fddseek1, sizeof(fddseek1), rate);
mtrsnd.snd.trk[1].flag = PMIXFLAG_L | PMIXFLAG_R;
mtrsnd.snd.trk[1].volume = (np2cfg.MOTORVOL << 12) / 100;
}
}
void fddmtrsnd_bind(void) {
if (mtrsnd.enable) {
sound_streamregist(&mtrsnd.snd, (SOUNDCB)pcmmix_getpcm);
}
}
void fddmtrsnd_deinitialize(void) {
int i;
void *ptr;
for (i=0; i<2; i++) {
ptr = mtrsnd.snd.trk[i].data.sample;
mtrsnd.snd.trk[i].data.sample = NULL;
if (ptr) {
_MFREE(ptr);
}
}
}
static void fddmtrsnd_play(UINT num, BOOL play) {
PMIXTRK *trk;
if ((mtrsnd.enable) && (num < 2)) {
sound_sync();
trk = mtrsnd.snd.trk + num;
if (play) {
if (trk->data.sample) {
trk->pcm = trk->data.sample;
trk->remain = trk->data.samples;
mtrsnd.snd.hdr.playing |= (1 << num);
}
}
else {
mtrsnd.snd.hdr.playing &= ~(1 << num);
}
}
}
#endif
// ----
enum {
MOVE1TCK_MS = 15,
MOVEMOTOR1_MS = 25,
DISK1ROL_MS = 166
};
_FDDMTR fddmtr;
static void fddmtr_event(void) {
switch(fddmtr.curevent) {
case 100:
#if defined(SUPPORT_SWSEEKSND)
fddmtrsnd_play(0, FALSE);
#else
soundmng_pcmstop(SOUND_PCMSEEK);
#endif
fddmtr.curevent = 0;
break;
default:
fddmtr.curevent = 0;
break;
}
}
void fddmtr_initialize(void) {
#if defined(SUPPORT_SWSEEKSND)
fddmtrsnd_play(0, FALSE);
#else
soundmng_pcmstop(SOUND_PCMSEEK);
#endif
ZeroMemory(&fddmtr, sizeof(fddmtr));
FillMemory(fddmtr.head, sizeof(fddmtr.head), 42);
}
void fddmtr_callback(UINT nowtime) {
if ((fddmtr.curevent) && (nowtime >= fddmtr.nextevent)) {
fddmtr_event();
}
}
void fdbiosout(NEVENTITEM item) {
fddmtr.busy = 0;
(void)item;
}
void fddmtr_seek(REG8 drv, REG8 c, UINT size) {
int regmove;
SINT32 waitcnt;
drv &= 3;
regmove = c - fddmtr.head[drv];
fddmtr.head[drv] = c;
if (!np2cfg.MOTOR) {
if (size) {
fddmtr.busy = 1;
nevent_set(NEVENT_FDBIOSBUSY, size * pccore.multiple,
fdbiosout, NEVENT_ABSOLUTE);
}
return;
}
waitcnt = (size * DISK1ROL_MS) / (1024 * 8);
if (regmove < 0) {
regmove = 0 - regmove;
}
if (regmove == 1) {
if (fddmtr.curevent < 80) {
fddmtr_event();
#if defined(SUPPORT_SWSEEKSND)
fddmtrsnd_play(1, TRUE);
#else
soundmng_pcmplay(SOUND_PCMSEEK1, FALSE);
#endif
fddmtr.curevent = 80;
fddmtr.nextevent = GETTICK() + MOVEMOTOR1_MS;
}
}
else if (regmove) {
if (fddmtr.curevent < 100) {
fddmtr_event();
#if defined(SUPPORT_SWSEEKSND)
fddmtrsnd_play(0, TRUE);
#else
soundmng_pcmplay(SOUND_PCMSEEK, TRUE);
#endif
fddmtr.curevent = 100;
fddmtr.nextevent = GETTICK() + (regmove * MOVE1TCK_MS);
}
if (regmove >= 32) {
waitcnt += DISK1ROL_MS;
}
}
if (waitcnt) {
fddmtr.busy = 1;
nevent_setbyms(NEVENT_FDBIOSBUSY,
waitcnt, fdbiosout, NEVENT_ABSOLUTE);
}
(void)drv;
}
void fddmtr_reset(void) {
fddmtr.busy = 0;
nevent_reset(NEVENT_FDBIOSBUSY);
}
RetroPC.NET-CVS <cvs@retropc.net>