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