/* Copyright 1992 by Abacus Research and
 * Development, Inc.  All rights reserved.
 */

#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_snth5[] =
	    "$Id: snth5.c 63 2004-12-24 18:19:43Z ctm $";
#endif

#include "rsys/common.h"
#include "SoundMgr.h"
#include "rsys/soundopts.h"

/*
 * It's not really clear how an actual synthesizer is expected to work
 * with the Sound Manager's queues.  In this implementation we start
 * the relavent command playing and see that the ROMLIB_soundcomplete()
 * function is called when we're done.
 */

typedef pascal void (*callbackfp)(SndChannelPtr, SndCommand *);

P3(PUBLIC pascal, BOOLEAN, snth5, SndChannelPtr, chanp, SndCommand *, cmdp,
							   ModifierStubPtr, mp)
{
#if defined(NEXTSTEP)
    soundbuffer_t *bufp;
    BOOLEAN done;
    static BOOLEAN beenhere = 0;

    if (!beenhere) {
	/* ROMlib_soundreserve(); */
	beenhere = 1;
    }
    done = TRUE;
    switch (Cx(cmdp->cmd)) {
    case initCmd:
	SoundActive = soundactive5;
	/* TODO */
	break;
    case freeCmd:
	SoundActive = 0;
	done = FALSE;
	/* TODO */
	break;
    case quietCmd:
	/* TODO */
	break;
    case flushCmd:
	/* TODO */
	break;
    case waitCmd:
	/* TODO */
	break;
    case pauseCmd:
	/* TODO */
	break;
    case resumeCmd:
	/* TODO */
	break;
    case callBackCmd:
#if 0
	printf("CB"); fflush(stdout);
#endif
	CToPascalCall(MR(chanp->callBack), CTOP_StuffHex, chanp, cmdp);
	break;
    case syncCmd:
	/* TODO */
	break;
    case availableCmd:
	done = FALSE;
	/* TODO */
	break;
    case bufferCmd:
	bufp = (soundbuffer_t *) Cx(cmdp->param2);
#if 0
	printf("offset = %d, nsamples = %d, rate = 0x%x\n", Cx(bufp->offset),
						   Cx(bufp->nsamples), Cx(bufp->rate));
	printf("BU"); fflush(stdout);
#endif
	ROMlib_outbuffer((char *) bufp->buf, Cx(bufp->nsamples), Cx(bufp->rate),
									chanp);
	done = FALSE;
	break;

    case requestNextCmd:	/* not needed */
    case tickleCmd:		/* not implemented */
    case howOftenCmd:		/* not implemented */
    case wakeUpCmd:		/* not implemented */
    case noteCmd:		/* not implemented */
    case restCmd:		/* not implemented */
    case freqCmd:		/* not implemented */
    case ampCmd:		/* not implemented */
    case timbreCmd:		/* not implemented */
    case waveTableCmd:		/* not implemented */
    case phaseCmd:		/* not implemented */
    case soundCmd:		/* not implemented */
    case rateCmd:		/* not implemented */
    case emptyCmd:		/* does nothing */
    case nullCmd:		/* does nothing */
    case midiDataCmd:		/* not implemented */
    default:
#if 1
	printf("unexpected sound command %d\n", (LONGINT) Cx(cmdp->cmd));
#endif
	break;
    }
    if (done)
	ROMlib_callcompletion(chanp);
#endif
    return FALSE;
}
