1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - include - snd - common
3 File: channel.h
4
5 Copyright 2004-2008 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Date:: 2008-09-17#$
14 $Rev: 8556 $
15 $Author: okubata_ryoma $
16 *---------------------------------------------------------------------------*/
17
18 #ifndef NITRO_SND_COMMON_CHANNEL_H_
19 #define NITRO_SND_COMMON_CHANNEL_H_
20
21 #include <nitro/types.h>
22
23 #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
24 #include <nitro/misc.h>
25 #include <nitro/hw/common/armArch.h> // for HW_CPU_CLOCK_ARM7
26
27 #ifdef SDK_ARM7
28 #include <nitro/hw/ARM7/ioreg_SND.h>
29 #ifdef SDK_NITRO
30 #include <nitro/hw/ARM7/mmap_global.h>
31 #else //SDK_TWL
32 #include <twl/hw/ARM7/mmap_global.h>
33 #endif
34 #endif /* SDK_ARM7 */
35
36 #else
37
38 #define HW_CPU_CLOCK_ARM7 33513982
39
40 #endif /* SDK_FROM_TOOL */
41
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45
46 /******************************************************************************
47 macro definition
48 ******************************************************************************/
49
50 #define SND_TIMER_CLOCK ( HW_CPU_CLOCK_ARM7 / 2 )
51
52 #define SND_CHANNEL_NUM 16
53 #define SND_CHANNEL_MIN 0
54 #define SND_CHANNEL_MAX 15
55
56 #define SND_PSG_CHANNEL_MIN 8
57 #define SND_PSG_CHANNEL_MAX 13
58 #define SND_PSG_CHANNEL_NUM ( SND_PSG_CHANNEL_MAX - SND_PSG_CHANNEL_MIN + 1 )
59
60 #define SND_NOISE_CHANNEL_MIN 14
61 #define SND_NOISE_CHANNEL_MAX 15
62 #define SND_NOISE_CHANNEL_NUM ( SND_NOISE_CHANNEL_MAX - SND_NOISE_CHANNEL_MIN + 1 )
63
64 #define SND_CHANNEL_PAN_MIN 0
65 #define SND_CHANNEL_PAN_CENTER 64
66 #define SND_CHANNEL_PAN_MAX 0x7f
67
68 #define SND_CHANNEL_VOLUME_MIN 0
69 #define SND_CHANNEL_VOLUME_MAX 0x7f
70
71 #define SND_CHANNEL_TIMER_MIN 0x10
72 #define SND_CHANNEL_TIMER_MAX 0xffff
73
74 #define SND_CHANNEL_LOOP_START_MAX 0xffff
75 #define SND_CHANNEL_LOOP_LEN_MAX 0x3fffff
76
77 #define SND_CHANNEL_SAD_MASK 0x07fffffc
78
79 #define SND_PCM_CHANNEL_MASK 0xffff
80 #define SND_PSG_CHANNEL_MASK 0x3f00
81 #define SND_NOISE_CHANNEL_MASK 0xc000
82 #define SND_CAPIN_CHANNEL_MASK 0x0005
83 #define SND_CAPOUT_CHANNEL_MASK 0x000a
84
85 #define SND_CHANNEL_STOP_HOLD ( 1 << 0 )
86
87 #define SND_CHANNEL_REG_OFFSET( ch ) ( (ch) << 4 )
88
89 #ifdef SDK_ARM9
90
91 #define REG_SND_SOUND0CNT_E_SHIFT 31
92 #define REG_SND_SOUND0CNT_E_SIZE 1
93 #define REG_SND_SOUND0CNT_E_MASK 0x80000000
94
95 #define REG_SND_SOUND0CNT_FORMAT_SHIFT 29
96 #define REG_SND_SOUND0CNT_FORMAT_SIZE 2
97 #define REG_SND_SOUND0CNT_FORMAT_MASK 0x60000000
98
99 #define REG_SND_SOUND0CNT_REPEAT_SHIFT 27
100 #define REG_SND_SOUND0CNT_REPEAT_SIZE 2
101 #define REG_SND_SOUND0CNT_REPEAT_MASK 0x18000000
102
103 #define REG_SND_SOUND0CNT_DUTY_SHIFT 24
104 #define REG_SND_SOUND0CNT_DUTY_SIZE 3
105 #define REG_SND_SOUND0CNT_DUTY_MASK 0x07000000
106
107 #define REG_SND_SOUND0CNT_PAN_SHIFT 16
108 #define REG_SND_SOUND0CNT_PAN_SIZE 7
109 #define REG_SND_SOUND0CNT_PAN_MASK 0x007f0000
110
111 #define REG_SND_SOUND0CNT_HOLD_SHIFT 15
112 #define REG_SND_SOUND0CNT_HOLD_SIZE 1
113 #define REG_SND_SOUND0CNT_HOLD_MASK 0x00008000
114
115 #define REG_SND_SOUND0CNT_SHIFT_SHIFT 8
116 #define REG_SND_SOUND0CNT_SHIFT_SIZE 2
117 #define REG_SND_SOUND0CNT_SHIFT_MASK 0x00000300
118
119 #define REG_SND_SOUND0CNT_VOLUME_SHIFT 0
120 #define REG_SND_SOUND0CNT_VOLUME_SIZE 7
121 #define REG_SND_SOUND0CNT_VOLUME_MASK 0x0000007f
122
123 #endif /* SDK_ARM9 */
124
125 /******************************************************************************
126 enum definition
127 ******************************************************************************/
128
129 typedef enum
130 {
131 SND_CHANNEL_0,
132 SND_CHANNEL_1,
133 SND_CHANNEL_2,
134 SND_CHANNEL_3,
135 SND_CHANNEL_4,
136 SND_CHANNEL_5,
137 SND_CHANNEL_6,
138 SND_CHANNEL_7,
139 SND_CHANNEL_8,
140 SND_CHANNEL_9,
141 SND_CHANNEL_10,
142 SND_CHANNEL_11,
143 SND_CHANNEL_12,
144 SND_CHANNEL_13,
145 SND_CHANNEL_14,
146 SND_CHANNEL_15
147 }
148 SNDChannelId;
149
150 typedef enum
151 {
152 SND_WAVE_FORMAT_PCM8,
153 SND_WAVE_FORMAT_PCM16,
154 SND_WAVE_FORMAT_ADPCM,
155 SND_WAVE_FORMAT_PSG,
156 SND_WAVE_FORMAT_NOISE = SND_WAVE_FORMAT_PSG
157 }
158 SNDWaveFormat;
159
160 typedef enum
161 {
162 SND_CHANNEL_LOOP_MANUAL,
163 SND_CHANNEL_LOOP_REPEAT,
164 SND_CHANNEL_LOOP_1SHOT
165 }
166 SNDChannelLoop;
167
168 #define SND_CHANNEL_LOOP_REPAET SND_CHANNEL_LOOP_REPEAT // for compatibility
169
170 typedef enum
171 {
172 SND_DUTY_1_8,
173 SND_DUTY_2_8,
174 SND_DUTY_3_8,
175 SND_DUTY_4_8,
176 SND_DUTY_5_8,
177 SND_DUTY_6_8,
178 SND_DUTY_7_8
179 }
180 SNDDuty;
181
182 typedef enum
183 {
184 SND_CHANNEL_DATASHIFT_NONE,
185 SND_CHANNEL_DATASHIFT_1BIT,
186 SND_CHANNEL_DATASHIFT_2BIT,
187 SND_CHANNEL_DATASHIFT_4BIT
188 }
189 SNDChannelDataShift;
190
191 /******************************************************************************
192 inline function
193 ******************************************************************************/
194
195 #ifdef SDK_ARM7
196 #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
197
198 /*---------------------------------------------------------------------------*
199 Name: SND_StartChannel
200
201 Description: Start channel
202
203 Arguments: chNo channel number
204
205 Returns: none
206 *---------------------------------------------------------------------------*/
SND_StartChannel(int chNo)207 static inline void SND_StartChannel(int chNo)
208 {
209 SDK_MINMAX_ASSERT(chNo, SND_CHANNEL_MIN, SND_CHANNEL_MAX);
210
211 *((REGType8v *)(REG_SOUND0CNT_8_ADDR + SND_CHANNEL_REG_OFFSET(chNo)))
212 |= REG_SND_SOUND0CNT_8_E_MASK;
213 }
214
215 #else
216
217 void SND_StartChannel(int chNo);
218
219 #endif /* SDK_FROM_TOOL */
220
221 #endif /* SDK_ARM7 */
222
223 /******************************************************************************
224 public function declaration
225 ******************************************************************************/
226
227 #ifdef SDK_ARM7
228
229 void SND_SetupChannelPcm(int chNo,
230 const void *dataaddr,
231 SNDWaveFormat format,
232 SNDChannelLoop loop,
233 int loopStart,
234 int loopLen, int volume, SNDChannelDataShift shift, int timer, int pan);
235 void SND_SetupChannelPsg(int chNo,
236 SNDDuty duty,
237 int volume, SNDChannelDataShift shift, int timer, int pan);
238 void SND_SetupChannelNoise(int chNo, int volume, SNDChannelDataShift shift, int timer, int pan);
239
240 void SND_StopChannel(int chNo, s32 flags);
241
242 void SND_SetChannelVolume(int chNo, int volume, SNDChannelDataShift shift);
243 void SND_SetChannelTimer(int chNo, int timer);
244 void SND_SetChannelPan(int chNo, int pan);
245
246 BOOL SND_IsChannelActive(int chNo);
247
248 void SND_SetMasterPan(int pan);
249
250 u32 SND_GetChannelControl(int chNo);
251
252 #endif /* SDK_ARM7 */
253
254 /******************************************************************************
255 private function declaration
256 ******************************************************************************/
257
258 #ifdef SDK_ARM7
259
260 void SNDi_SetSurroundDecay(int decay);
261
262 #endif /* SDK_ARM7 */
263
264
265 #ifdef __cplusplus
266 } /* extern "C" */
267 #endif
268
269 #endif /* NITRO_SND_COMMON_CHANNEL_H_ */
270