nuaustlmgr.c 4.02 KB
/*======================================================================*/
/*		NuSYS							*/
/*		nuaustlmgr.c						*/
/*									*/
/*		Copyright (C) 1997, NINTENDO Co,Ltd.			*/
/*									*/
/*======================================================================*/
/* $Id: nuaustlmgr.c,v 1.1.1.1 2002/10/30 02:07:09 blythe Exp $		*/
/*======================================================================*/
#include <nusys.h>
#include <nualstl.h>

u8			nuAuTaskStop = 1;
u8			nuAuPreNMI = 0;
NUAuPreNMIFunc		nuAuPreNMIFunc = NULL;

NUScTask		nuAuTask;
OSMesgQueue		nuAuMesgQ;
OSMesgQueue 		nuAuRtnMesgQ;
NUScClient		nuAuClient;
static OSMesg		nuAuMesgBuf[NU_AU_MESG_MAX];
static OSMesg		nuAuRtnMesgBuf;


static void nuAuStlSchedInstall(void);
static void nuAuStlSchedWaitFrame(void);
static void nuAuStlSchedDoTask(musTask *task);

musSched nuAuStlSchedFunc = {
    nuAuStlSchedInstall, nuAuStlSchedWaitFrame, nuAuStlSchedDoTask
};

/*----------------------------------------------------------------------*/
/*	nuAuStlMgrInit -オーディオマネージャの初期化			*/
/*	IN:	config	SoundTools初期設定構造体			*/
/*	RET:	使用ヒープサイズ					*/
/*----------------------------------------------------------------------*/
s32 nuAuStlMgrInit(musConfig* config)
{
    nuAuTaskStop = NU_AU_TASK_RUN;	/* タスク実行可 */
    
    nuAuTask.msg			= 0;
    nuAuTask.msgQ			= &nuAuRtnMesgQ;
    nuAuTask.list.t.type		= M_AUDTASK;
    nuAuTask.list.t.ucode_boot		= (u64*)rspbootTextStart;
    nuAuTask.list.t.ucode_boot_size	=
	((int) rspbootTextEnd - (int) rspbootTextStart);
    nuAuTask.list.t.ucode_data_size	= SP_UCODE_DATA_SIZE;
    nuAuTask.list.t.dram_stack		= (u64*) NULL;
    nuAuTask.list.t.dram_stack_size	= 0;
    nuAuTask.list.t.output_buff		= (u64*) NULL;
    nuAuTask.list.t.output_buff_size	= 0;
    nuAuTask.list.t.yield_data_ptr	= NULL;
    nuAuTask.list.t.yield_data_size	= 0;

    MusSetScheduler(&nuAuStlSchedFunc);
    return(MusInitialize(config));
}

/*----------------------------------------------------------------------*/
/*	nuAuStlSchedInstall -スケジューラの初期化			*/
/*	スケジューラにリトレースとPRE NMIのメッセージを受ける		*/
/*	メッセージキューを登録する。					*/
/*	IN:	無し							*/
/*	RET:	無し							*/
/*----------------------------------------------------------------------*/
static void nuAuStlSchedInstall(void)
{
    osCreateMesgQueue(&nuAuMesgQ, nuAuMesgBuf, NU_AU_MESG_MAX);
    osCreateMesgQueue(&nuAuRtnMesgQ, &nuAuRtnMesgBuf, 1);
    nuScAddClient(&nuAuClient, &nuAuMesgQ, NU_SC_RETRACE_MSG | NU_SC_PRENMI_MSG);
}

/*----------------------------------------------------------------------*/
/*	nuAuStlSchedWaitFrame - スケジューラからのメッセージ待ち	*/
/*	IN:	無し							*/
/*	RET:	無し							*/
/*----------------------------------------------------------------------*/
static void nuAuStlSchedWaitFrame(void)
{
    NUScMsg*	mesg_type;
    while(1){
	osRecvMesg(&nuAuMesgQ, (OSMesg*)&mesg_type, OS_MESG_BLOCK);
	switch(*mesg_type){
	case NU_SC_RETRACE_MSG:
	    return;
	case NU_SC_PRENMI_MSG:
	    if(nuAuPreNMIFunc){
		(*nuAuPreNMIFunc)(NU_SC_PRENMI_MSG, nuAuPreNMI);
	    }
	    nuAuPreNMI++;
	    break;
	default:
	    break;
	}
    }
}

/*----------------------------------------------------------------------*/
/*	nuAuStlSchedDoTask - タスクの起動				*/
/*	オーディオタスクを起動する。PRE NMI後,コールバック関数が	*/
/*	登録されていればその関数を呼び続ける				*/
/*	IN:	無し							*/
/*	RET:	無し							*/
/*----------------------------------------------------------------------*/
static void nuAuStlSchedDoTask(musTask *task)
{
    if(nuAuTaskStop == NU_AU_TASK_RUN){
	nuAuTask.list.t.data_ptr  = task->data; 
	nuAuTask.list.t.data_size = task->data_size;

	nuAuTask.list.t.ucode		= (u64*)task->ucode;
	nuAuTask.list.t.ucode_data	= (u64*)task->ucode_data;
	osSendMesg(&nusched.audioRequestMQ, (OSMesg*)&nuAuTask, OS_MESG_BLOCK);
	osRecvMesg(&nuAuRtnMesgQ, NULL, OS_MESG_BLOCK);
    }
    
    /* PRE NMIメッセージが来たら,その後この関数が呼ばれつづける */
    if((u32)nuAuPreNMIFunc && nuAuPreNMI){
	(*nuAuPreNMIFunc)(NU_SC_RETRACE_MSG, nuAuPreNMI);
	nuAuPreNMI++;
    }
}