nuaustlmgr.c
4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*======================================================================*/
/* 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++;
}
}