
/*
**
**		$VER: slide.c 1.0 (12.04.96)
**
**		Simple slide module for audio.device
**
**		written by Grzegorz Calkowski
**
**		(c) 1996 The Beet Research
**			 All Rights Reserved
**
*/

#include <exec/types.h>
#include <exec/memory.h>
#include <devices/audio.h>

#include "slideinfo.h"

#define __USE_SYSBASE
#include <proto/exec.h>

/*****************************************************************************/

struct SlideInfo *InitSlide(UBYTE startvol, UBYTE endvol, WORD rate, struct IOAudio *aio, UWORD period)
{
	struct SlideInfo *slideinfo;

	/* alloc the SlideInfo struct */
	if (!(slideinfo = AllocMem(sizeof(struct SlideInfo), MEMF_PUBLIC | MEMF_CLEAR)))
		return NULL;

	slideinfo->aio = aio;
	slideinfo->volume = startvol;
	slideinfo->work = startvol << 7;
	slideinfo->endvol = endvol;
	slideinfo->cnt = rate;
	slideinfo->period = period;

	/* compute the delta */
	slideinfo->delta = ((endvol - startvol) << 7) / rate;

	return slideinfo; /* ok */
}

/*****************************************************************************/

void FreeSlide(struct SlideInfo *slideinfo)
{
	if (slideinfo)
		FreeMem(slideinfo, sizeof(struct SlideInfo));
}

/*****************************************************************************/

BOOL Slide(struct SlideInfo *slideinfo, BOOL io)
{
	UBYTE  vol;
	BOOL	 done;
	struct IOAudio *aio;

	/* if no slideinfo (bad!) we gonna better tell that we've finished */
	if (!slideinfo)
		done = TRUE;
	else
	{
		if (slideinfo->cnt--)
		{
			vol = (slideinfo->work += slideinfo->delta) >> 7;
			done = FALSE;
		}
		else
		{
			vol = slideinfo->endvol;
			done = TRUE;
		}

		/* set it */
		if ((aio = slideinfo->aio) && io)
		{
			aio->ioa_Request.io_Command	= ADCMD_PERVOL;
			aio->ioa_Period					= slideinfo->period;
			aio->ioa_Volume					= vol;
			BeginIO((struct IORequest *)aio);
		}
	}

	return done;
}


