seqpScript.c 7.26 KB
#include <assert.h>
#include "audiotest.h"
#include "seqpTest.h"
#include "seqpScript.h"
#include "seqpActions.h"
#include "UniversalSP.h"


static TScript		script;
static char		sTestDoneRequested;
static void		CheckScript (TScript *pScript);
static void		CheckIfDone (void);

extern ALUSPlayer *	gSeqp;


/*
  This script tests the execution of stopping and starting
  a sequence from within the same frame.  Sequence should
  start up normally.
*/
static TScriptAction script0[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};


/*
  This script tests the execution of stopping the sequence
  while it is already stopped followed by playing the sequence.
  Sequence should start up normally.  Old seqplayer did not.
*/
static TScriptAction script1[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    ONE_SEC, (TScriptActionProc)actSeqpStop,
    ONE_SEC, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};
 
   
/*
  This script tests the execution of stopping a sequence,
  setting its volume, and restarting it in the same frame.
*/
static TScriptAction script2[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actSeqpSetVol,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};
  

/*
  This script tests the execution of stopping a sequence,
  setting a new sequence, and restarting it in the same frame.
*/
static TScriptAction script3[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};
    
  
/*
  This script tests the execution of stopping a sequence,
  rewinding, and restarting it in the same frame.
*/
static TScriptAction script4[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actSeqRTZ,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};
    
  
/*
  This script tests the execution of rewinding a sequence on the fly.
*/
static TScriptAction script5[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqpPlay,

    ONE_SEC, (TScriptActionProc)actSeqRTZ,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};
    
  
/*
  This script tests trying to play past the end of a sequence.
*/
static TScriptAction script6[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetNonNULLSeq,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqEOS,
    0, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpPlay,

    4*ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};
    
  
/*
  This sequence tests playing midi with a NULL target sequence.
*/
static TScriptAction script7[] =
{
    0, (TScriptActionProc)actSeqpNew,
    0, (TScriptActionProc)actSeqpSetBank,
    0, (TScriptActionProc)actSeqpPlay,

    ONE_SEC, (TScriptActionProc)actSeqpSendNoteOn,
    ONE_SEC, (TScriptActionProc)actSeqpSendNoteOff,
    ONE_SEC, (TScriptActionProc)actSeqpSendNoteOn,
    ONE_SEC, (TScriptActionProc)actSeqpSendNoteOff,
    ONE_SEC, (TScriptActionProc)actSeqpSendNoteOn,
    ONE_SEC, (TScriptActionProc)actSeqpSendNoteOff,

    ONE_SEC, (TScriptActionProc)actSeqpStop,
    0, (TScriptActionProc)actDone,
    END_OF_SCRIPT, (TScriptActionProc)actNull
};
    




  
void
SeqpScript_Init (int scriptNum)
{
    /* Setup this test's retrace proc and data. */
    seqpTest.retraceProc = SeqpScript_RetraceProc;
    seqpTest.buttonProc = SeqpScript_ButtonProc;
    seqpTest.retraceData = (TRetraceData)&script;
    script.fActionIndex = 0;
    sTestDoneRequested = FALSE;

    switch (scriptNum)
    {
        case 0:
	    PRINTF("Test stopping and playing a sequence in the same frame.\n");
	    script.fActionTable = script0;
	break;

        case 1:
	    PRINTF("Test that stopping a stopped sequence is okay.\n");
	    script.fActionTable = script1;
	break;

        case 2:
	    PRINTF("Test stopping, setting volume, and playing in same frame.\n");
	    script.fActionTable = script2;
	break;

        case 3:
	    PRINTF("Test stopping, setting a new sequence, and playing in same frame.\n");
	    script.fActionTable = script3;
	break;

        case 4:
	    PRINTF("Test stopping, rewinding, and playing in same frame.\n");
	    script.fActionTable = script4;
	break;

        case 5:
	    PRINTF("Test rewinding on the fly.\n");
	    PRINTF("Should leave stuck notes for ALSeqPlayer but be okay for ALCSPlayer.\n");
	    script.fActionTable = script5;
	break;

        case 6:
	    PRINTF("Test playing beyond the end of a sequence.\n");
	    script.fActionTable = script6;
	break;

        case 7:
	    PRINTF("Test sending midi notes with null target sequence.\n");
	    script.fActionTable = script7;
	break;
    }
}

void
SeqpScript_Fini (void)
{
    actSeqpDelete ();
}


void
SeqpScript_RetraceProc (TRetraceData data)
{
    if (!sTestDoneRequested)
	CheckScript ((TScript *)data);
    else
	CheckIfDone ();
}


void SeqpScript_ButtonProc(u16 oldButtons, u16 newButtons)
{
    u16 button;

    button = oldButtons^newButtons;  /* get the ones that have changed */
    button &= newButtons;            /* get only button downs */

    if (button & CONT_START)
    {
	sTestDoneRequested = TRUE;
	if (alUSPGetState(gSeqp) == AL_PLAYING)
	    actSeqpStop();
    }
}


static void
CheckScript (TScript *pScript)
{
    static u32		curFrames = 0;
    TScriptAction *	pAction = &pScript->fActionTable[pScript->fActionIndex];

    while (pAction->fDeltaFrames <= curFrames++)
    {
	(*(pAction->fActionProc))();
	pAction = &pScript->fActionTable[++pScript->fActionIndex];

	curFrames = 0;	/* reset frame counter to measure frames between actions. */
    }
}


static void
CheckIfDone (void)
{
    if (alUSPGetState(gSeqp) == AL_STOPPED)
	TestDone ();
}