PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
libspu2.h
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#ifndef _LIBSPU2_H
12#define _LIBSPU2_H
13
14#define SPU_SUCCESS 0
15#define SPU_INVALID_ARGS (-3)
16#define SPU_DIAG (-2)
17#define SPU_CHECK (-1)
18#define SPU_OFF 0
19#define SPU_ON 1
20#define SPU_CLEAR 2
21#define SPU_RESET 3
22#define SPU_DONT_CARE 4
23#define SPU_ALL 0
24#define SPU_CDONLY 5
25#define SPU_VOICEONLY 6
26#define SPU_CONT 7
27#define SPU_BIT 8
28#define SPU_NULL 0
29
30#define SpuDiag SPU_DIAG
31#define SpuCheck SPU_CHECK
32#define SpuOff SPU_OFF
33#define SpuOn SPU_ON
34#define SpuClear SPU_CLEAR
35#define SpuReset SPU_RESET
36#define SpuDontCare SPU_DONT_CARE
37#define SpuALL SPU_ALL
38#define SpuCDOnly SPU_CDONLY
39#define SpuVoiceOnly SPU_VOICEONLY
40#define SpuCont SPU_CONT
41#define SpuNull SPU_NULL
42
43#define SPU_OFF_ENV_ON 2
44#define SPU_ON_ENV_OFF 3
45
46#define SpuOffEnvOn SPU_OFF_ENV_ON
47#define SpuOnEnvOff SPU_ON_ENV_OFF
48
49#define SPU_ERROR (-1)
50#define SpuError SPU_ERROR
51
52#define SPU_TRANSFER_BY_DMA 0
53#define SPU_TRANSFER_BY_IO 1
54
55#define SpuTransferByDMA SPU_TRANSFER_BY_DMA
56#define SpuTransferByIO SPU_TRANSFER_BY_IO
57#define SpuTransByDMA SPU_TRANSFER_BY_DMA
58#define SpuTransByIO SPU_TRANSFER_BY_IO
59
60#define SPU_TRANSFER_WAIT 1
61#define SPU_TRANSFER_PEEK 0
62#define SPU_TRANSFER_GLANCE SPU_TRANSFER_PEEK
63
64#define SPU_AUTODMA_ONESHOT 0
65#define SPU_AUTODMA_LOOP 1
66#define SPU_AUTODMA_START_ADDR (1 << 1)
67#define SPU_AUTODMA_BIT4 (1 << 4)
68#define SPU_AUTODMA_BIT6 (1 << 6)
69#define SPU_AUTODMA_BIT7 (1 << 6)
70
71#define SPU_00CH ((u32)1 << 0)
72#define SPU_01CH ((u32)1 << 1)
73#define SPU_02CH ((u32)1 << 2)
74#define SPU_03CH ((u32)1 << 3)
75#define SPU_04CH ((u32)1 << 4)
76#define SPU_05CH ((u32)1 << 5)
77#define SPU_06CH ((u32)1 << 6)
78#define SPU_07CH ((u32)1 << 7)
79#define SPU_08CH ((u32)1 << 8)
80#define SPU_09CH ((u32)1 << 9)
81#define SPU_10CH ((u32)1 << 10)
82#define SPU_11CH ((u32)1 << 11)
83#define SPU_12CH ((u32)1 << 12)
84#define SPU_13CH ((u32)1 << 13)
85#define SPU_14CH ((u32)1 << 14)
86#define SPU_15CH ((u32)1 << 15)
87#define SPU_16CH ((u32)1 << 16)
88#define SPU_17CH ((u32)1 << 17)
89#define SPU_18CH ((u32)1 << 18)
90#define SPU_19CH ((u32)1 << 19)
91#define SPU_20CH ((u32)1 << 20)
92#define SPU_21CH ((u32)1 << 21)
93#define SPU_22CH ((u32)1 << 22)
94#define SPU_23CH ((u32)1 << 23)
95
96#define SPU_0CH SPU_00CH
97#define SPU_1CH SPU_01CH
98#define SPU_2CH SPU_02CH
99#define SPU_3CH SPU_03CH
100#define SPU_4CH SPU_04CH
101#define SPU_5CH SPU_05CH
102#define SPU_6CH SPU_06CH
103#define SPU_7CH SPU_07CH
104#define SPU_8CH SPU_08CH
105#define SPU_9CH SPU_09CH
106
107#define SPU_ALLCH \
108 (SPU_00CH | SPU_01CH | SPU_02CH | SPU_03CH | SPU_04CH | SPU_05CH | SPU_06CH | SPU_07CH | SPU_08CH | SPU_09CH \
109 | SPU_10CH | SPU_11CH | SPU_12CH | SPU_13CH | SPU_14CH | SPU_15CH | SPU_16CH | SPU_17CH | SPU_18CH | SPU_19CH \
110 | SPU_20CH | SPU_21CH | SPU_22CH | SPU_23CH | 0)
111
112#define SPU_KEYCH(x) ((u32)1 << (x))
113#define SPU_VOICECH(...) SPU_VOICECH(__VA_ARGS__)
114
115#define SPU_VOICE_VOLL ((u32)1 << 0)
116#define SPU_VOICE_VOLR ((u32)1 << 1)
117#define SPU_VOICE_VOLMODEL ((u32)1 << 2)
118#define SPU_VOICE_VOLMODER ((u32)1 << 3)
119#define SPU_VOICE_PITCH ((u32)1 << 4)
120#define SPU_VOICE_NOTE ((u32)1 << 5)
121#define SPU_VOICE_SAMPLE_NOTE ((u32)1 << 6)
122#define SPU_VOICE_WDSA ((u32)1 << 7)
123#define SPU_VOICE_ADSR_AMODE ((u32)1 << 8)
124#define SPU_VOICE_ADSR_SMODE ((u32)1 << 9)
125#define SPU_VOICE_ADSR_RMODE ((u32)1 << 10)
126#define SPU_VOICE_ADSR_AR ((u32)1 << 11)
127#define SPU_VOICE_ADSR_DR ((u32)1 << 12)
128#define SPU_VOICE_ADSR_SR ((u32)1 << 13)
129#define SPU_VOICE_ADSR_RR ((u32)1 << 14)
130#define SPU_VOICE_ADSR_SL ((u32)1 << 15)
131#define SPU_VOICE_LSAX ((u32)1 << 16)
132#define SPU_VOICE_ADSR_ADSR1 ((u32)1 << 17)
133#define SPU_VOICE_ADSR_ADSR2 ((u32)1 << 18)
134
135enum libspu2_spu_voice_enum
136{
137 SPU_VOICE_DIRECT = 0,
138 SPU_VOICE_LINEARIncN,
139 SPU_VOICE_LINEARIncR,
140 SPU_VOICE_LINEARDecN,
141 SPU_VOICE_LINEARDecR,
142 SPU_VOICE_EXPIncN,
143 SPU_VOICE_EXPIncR,
144 SPU_VOICE_EXPDec,
145 SPU_VOICE_EXPDecN = 7,
146 SPU_VOICE_EXPDecR = 7,
147};
148
149#define SPU_DECODED_FIRSTHALF 0
150#define SPU_DECODED_SECONDHALF 1
151#define SPU_DECODE_FIRSTHALF SPU_DECODED_FIRSTHALF
152#define SPU_DECODE_SECONDHALF SPU_DECODED_SECONDHALF
153
154#define SPU_COMMON_MVOLL (1 << 0)
155#define SPU_COMMON_MVOLR (1 << 1)
156#define SPU_COMMON_MVOLMODEL (1 << 2)
157#define SPU_COMMON_MVOLMODER (1 << 3)
158#define SPU_COMMON_RVOLL (1 << 4)
159#define SPU_COMMON_RVOLR (1 << 5)
160#define SPU_COMMON_CDVOLL (1 << 6)
161#define SPU_COMMON_CDVOLR (1 << 7)
162#define SPU_COMMON_CDREV (1 << 8)
163#define SPU_COMMON_CDMIX (1 << 9)
164#define SPU_COMMON_EXTVOLL (1 << 10)
165#define SPU_COMMON_EXTVOLR (1 << 11)
166#define SPU_COMMON_EXTREV (1 << 12)
167#define SPU_COMMON_EXTMIX (1 << 13)
168
169#define SPU_REV_MODE (1 << 0)
170#define SPU_REV_DEPTHL (1 << 1)
171#define SPU_REV_DEPTHR (1 << 2)
172#define SPU_REV_DELAYTIME (1 << 3)
173#define SPU_REV_FEEDBACK (1 << 4)
174
175enum libspu2_spu_rev_type_enum
176{
177 SPU_REV_MODE_CHECK = -1,
178 SPU_REV_MODE_OFF = 0,
179 SPU_REV_MODE_ROOM,
180 SPU_REV_MODE_STUDIO_A,
181 SPU_REV_MODE_STUDIO_B,
182 SPU_REV_MODE_STUDIO_C,
183 SPU_REV_MODE_HALL,
184 SPU_REV_MODE_SPACE,
185 SPU_REV_MODE_ECHO,
186 SPU_REV_MODE_DELAY,
187 SPU_REV_MODE_PIPE,
188 SPU_REV_MODE_MAX,
189};
190
191#define SPU_REV_MODE_CLEAR_WA 0x100
192
193#define SPU_EVENT_KEY (1 << 0)
194#define SPU_EVENT_PITCHLFO (1 << 1)
195#define SPU_EVENT_NOISE (1 << 2)
196#define SPU_EVENT_REVERB (1 << 3)
197
198enum libspu2_spu_spdif_out_enum
199{
200 SPU_SPDIF_OUT_OFF = 0,
201 SPU_SPDIF_OUT_PCM,
202 SPU_SPDIF_OUT_BITSTREAM,
203 SPU_SPDIF_OUT_BYPASS,
204};
205
206#define SPU_SPDIF_COPY_NORMAL 0x00
207#define SPU_SPDIF_COPY_PROHIBIT 0x80
208
209#define SPU_SPDIF_MEDIA_CD 0x000
210#define SPU_SPDIF_MEDIA_DVD 0x800
211
212#define SPU_DECODEDDATA_SIZE 0x200
213#define SPU_DECODEDATA_SIZE SPU_DECODEDDATA_SIZE
214
215// sizeof(libspu2_malloc_t)
216#define SPU_MALLOC_RECSIZ 8
217
218#define SPU_ENV_EVENT_QUEUEING (1 << 0)
219
220#define SPU_ST_NOT_AVAILABLE 0
221#define SPU_ST_ACCEPT 1
222#define SPU_ST_ERROR (-1)
223#define SPU_ST_INVALID_ARGUMENT (-2)
224#define SPU_ST_WRONG_STATUS (-3)
225#define SPU_ST_STOP 2
226#define SPU_ST_IDLE 3
227#define SPU_ST_PREPARE 4
228#define SPU_ST_START 5
229#define SPU_ST_PLAY 6
230#define SPU_ST_TRANSFER 7
231#define SPU_ST_FINAL 8
232
233#define SPU_ST_VAG_HEADER_SIZE 0x30
234
235typedef struct SpuVolume_
236{
237 s16 left;
238 s16 right;
239} SpuVolume;
240
241typedef struct SpuVoiceAttr_
242{
243 unsigned int voice;
244 unsigned int mask;
245 SpuVolume volume;
246 SpuVolume volmode;
247 SpuVolume volumex;
248 u16 pitch;
249 u16 note;
250 u16 sample_note;
251 s16 envx;
252 unsigned int addr;
253 unsigned int loop_addr;
254 int a_mode;
255 int s_mode;
256 int r_mode;
257 u16 ar;
258 u16 dr;
259 u16 sr;
260 u16 rr;
261 u16 sl;
262 u16 adsr1;
263 u16 adsr2;
265
266typedef struct SpuLVoiceAttr_
267{
268 s16 voiceNum;
269 s16 pad;
270 SpuVoiceAttr attr;
272
273typedef struct SpuReverbAttr_
274{
275 unsigned int mask;
276 int mode;
277 SpuVolume depth;
278 int delay;
279 int feedback;
281
282typedef struct SpuDecodedData_
283{
284 s16 cd_left[SPU_DECODEDDATA_SIZE];
285 s16 cd_right[SPU_DECODEDDATA_SIZE];
286 s16 voice1[SPU_DECODEDDATA_SIZE];
287 s16 voice3[SPU_DECODEDDATA_SIZE];
289
290typedef struct SpuExtAttr_
291{
292 SpuVolume volume;
293 int reverb;
294 int mix;
295} SpuExtAttr;
296
297typedef struct SpuCommonAttr_
298{
299 unsigned int mask;
300 SpuVolume mvol;
301 SpuVolume mvolmode;
302 SpuVolume mvolx;
303 SpuExtAttr cd;
304 SpuExtAttr ext;
306
307typedef void (*SpuIRQCallbackProc)(void);
308typedef void (*SpuTransferCallbackProc)(void);
309
310typedef struct SpuEnv_
311{
312 unsigned int mask;
313 unsigned int queueing;
314} SpuEnv;
315
316typedef struct SpuStVoiceAttr_
317{
318 char status;
319 char pad1;
320 char pad2;
321 char pad3;
322 int last_size;
323 unsigned int buf_addr;
324 unsigned int data_addr;
326
327typedef struct SpuStEnv_
328{
329 int size;
330 int low_priority;
331 SpuStVoiceAttr voice[24];
332} SpuStEnv;
333
334typedef void (*SpuStCallbackProc)(unsigned int voice_bit, int status);
335
336extern void SpuSetDigitalOut(int mode);
337#define SpuSetDegitalOut(...) SpuSetDigitalOut(__VA_ARGS__)
338extern void SpuStart(void);
339extern void SpuInit(void);
340extern unsigned int SpuSetCore(unsigned int which_core);
341extern unsigned int SpuGetCore(void);
342extern void SpuSetReverbEndAddr(unsigned int eea);
343extern unsigned int SpuGetReverbEndAddr(void);
344extern void SpuInitHot(void);
345extern void SpuQuit(void);
346extern int SpuSetMute(int on_off);
347extern int SpuGetMute(void);
348extern int SpuInitMalloc(int num, char *top);
349extern int SpuMalloc(int size);
350extern int SpuMallocWithStartAddr(unsigned int addr, int size);
351extern void SpuFree(unsigned int addr);
352extern void SpuSetEnv(const SpuEnv *env);
353extern unsigned int SpuFlush(unsigned int ev);
354extern unsigned int SpuSetNoiseVoice(int on_off, unsigned int voice_bit);
355extern unsigned int SpuGetNoiseVoice(void);
356extern int SpuSetNoiseClock(int n_clock);
357extern int SpuGetNoiseClock(void);
358extern int SpuSetReverb(int on_off);
359extern int SpuGetReverb(void);
360extern int SpuSetReverbModeParam(SpuReverbAttr *attr);
361extern void SpuGetReverbModeParam(SpuReverbAttr *attr);
362extern int SpuReserveReverbWorkArea(int on_off);
363extern int SpuIsReverbWorkAreaReserved(int on_off);
364extern int SpuSetReverbDepth(SpuReverbAttr *attr);
365extern unsigned int SpuSetReverbVoice(int on_off, unsigned int voice_bit);
366extern unsigned int SpuGetReverbVoice(void);
367extern int SpuClearReverbWorkArea(int mode);
368extern int SpuReadDecodedData(SpuDecodedData *d_data, int flag);
369extern int SpuSetIRQ(int on_off);
370extern int SpuGetIRQ(void);
371extern unsigned int SpuSetIRQAddr(unsigned int addr);
372extern unsigned int SpuGetIRQAddr(void);
373extern unsigned int SpuGetNextAddr(int v_num);
374extern SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func);
375extern void SpuSetKey(int on_off, unsigned int voice_bit);
376extern int SpuGetKeyStatus(unsigned int voice_bit);
377extern void SpuSetKeyOnWithAttr(SpuVoiceAttr *attr);
378extern void SpuGetVoiceEnvelopeAttr(int v_num, int *key_stat, s16 *envx);
379extern unsigned int SpuRead(u8 *addr, unsigned int size);
380extern unsigned int SpuWrite(u8 *addr, unsigned int size);
381extern unsigned int SpuAutoDMAWrite(u8 *addr, unsigned int size, unsigned int mode, ...);
382extern int SpuAutoDMAStop(void);
383extern int SpuAutoDMAGetStatus(void);
384extern unsigned int SpuWrite0(unsigned int size);
385extern unsigned int SpuSetTransferStartAddr(unsigned int addr);
386extern unsigned int SpuGetTransferStartAddr(void);
387extern int SpuSetTransferMode(int mode);
388extern int SpuGetTransferMode(void);
389extern unsigned int SpuWritePartly(u8 *addr, unsigned int size);
390extern int SpuIsTransferCompleted(int flag);
391extern SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func);
392extern SpuTransferCallbackProc SpuAutoDMASetCallback(SpuTransferCallbackProc func);
393extern unsigned int SpuSetPitchLFOVoice(int on_off, unsigned int voice_bit);
394extern unsigned int SpuGetPitchLFOVoice(void);
395extern void SpuSetCommonAttr(SpuCommonAttr *attr);
396extern void SpuGetCommonAttr(SpuCommonAttr *attr);
397extern int SpuRGetAllKeysStatus(int min_, int max_, char *status);
398extern void SpuGetAllKeysStatus(char *status);
399extern int SpuStTransfer(int flag, unsigned int voice_bit);
400extern SpuStEnv *SpuStInit(int mode);
401extern int SpuStQuit(void);
402extern int SpuStGetStatus(void);
403extern unsigned int SpuStGetVoiceStatus(void);
404extern SpuStCallbackProc SpuStSetPreparationFinishedCallback(SpuStCallbackProc func);
405extern SpuStCallbackProc SpuStSetTransferFinishedCallback(SpuStCallbackProc func);
406extern SpuStCallbackProc SpuStSetStreamFinishedCallback(SpuStCallbackProc func);
407extern unsigned int SpuStSetCore(unsigned int core);
408extern void SpuSetVoiceVolume(int v_num, s16 voll, s16 volr);
409extern void SpuSetVoiceVolumeAttr(int v_num, s16 voll, s16 volr, s16 voll_mode, s16 volr_mode);
410extern void SpuSetVoicePitch(int v_num, u16 pitch);
411extern void SpuSetVoiceNote(int v_num, u16 note);
412extern void SpuSetVoiceSampleNote(int v_num, u16 sample_note);
413extern void SpuSetVoiceStartAddr(int v_num, unsigned int start_addr);
414extern void SpuSetVoiceLoopStartAddr(int v_num, unsigned int lsa);
415extern void SpuSetVoiceAR(int v_num, u16 ar);
416extern void SpuSetVoiceDR(int v_num, u16 dr);
417extern void SpuSetVoiceSR(int v_num, u16 sr);
418extern void SpuSetVoiceRR(int v_num, u16 rr);
419extern void SpuSetVoiceSL(int v_num, u16 sl);
420extern void SpuSetVoiceARAttr(int v_num, u16 ar, int ar_mode);
421extern void SpuSetVoiceSRAttr(int v_num, u16 sr, int sr_mode);
422extern void SpuSetVoiceRRAttr(int v_num, u16 rr, int rr_mode);
423extern void SpuSetVoiceADSR(int v_num, u16 ar, u16 dr, u16 sr, u16 rr, u16 sl);
424extern void
425SpuSetVoiceADSRAttr(int v_num, u16 ar, u16 dr, u16 sr, u16 rr, u16 sl, int ar_mode, int sr_mode, int rr_mode);
426extern void SpuSetVoiceAttr(SpuVoiceAttr *arg);
427extern int SpuRSetVoiceAttr(int min_, int max_, SpuVoiceAttr *arg);
428extern void SpuNSetVoiceAttr(int v_num, SpuVoiceAttr *arg);
429extern void SpuLSetVoiceAttr(int num, SpuLVoiceAttr *arg_list);
430extern void SpuGetVoiceVolume(int v_num, s16 *voll, s16 *volr);
431extern void SpuGetVoiceVolumeAttr(int v_num, s16 *voll, s16 *volr, s16 *voll_mode, s16 *volr_mode);
432extern void SpuGetVoiceVolumeX(int v_num, s16 *voll_x, s16 *volr_x);
433extern void SpuGetVoicePitch(int v_num, u16 *pitch);
434extern void SpuGetVoiceNote(int v_num, u16 *note);
435extern void SpuGetVoiceSampleNote(int v_num, u16 *sample_note);
436extern void SpuGetVoiceEnvelope(int v_num, s16 *envx);
437extern void SpuGetVoiceStartAddr(int v_num, unsigned int *start_addr);
438extern void SpuGetVoiceLoopStartAddr(int v_num, unsigned int *loop_start_addr);
439extern void SpuGetVoiceAR(int v_num, u16 *ar);
440extern void SpuGetVoiceDR(int v_num, u16 *dr);
441extern void SpuGetVoiceSR(int v_num, u16 *sr);
442extern void SpuGetVoiceRR(int v_num, u16 *rr);
443extern void SpuGetVoiceSL(int v_num, u16 *sl);
444extern void SpuGetVoiceARAttr(int v_num, u16 *ar, int *ar_mode);
445extern void SpuGetVoiceSRAttr(int v_num, u16 *sr, int *sr_mode);
446extern void SpuGetVoiceRRAttr(int v_num, u16 *rr, int *rr_mode);
447extern void SpuGetVoiceADSR(int v_num, u16 *ar, u16 *dr, u16 *sr, u16 *rr, u16 *sl);
448extern void
449SpuGetVoiceADSRAttr(int v_num, u16 *ar, u16 *dr, u16 *sr, u16 *rr, u16 *sl, int *ar_mode, int *sr_mode, int *rr_mode);
450extern void SpuSetCommonMasterVolume(s16 mvol_left, s16 mvol_right);
451extern void SpuSetCommonMasterVolumeAttr(s16 mvol_left, s16 mvol_right, s16 mvolmode_left, s16 mvolmode_right);
452extern void SpuSetCommonCDVolume(s16 cd_left, s16 cd_right);
453extern void SpuSetCommonCDReverb(int cd_reverb);
454extern void SpuSetCommonCDMix(int cd_mix);
455extern void SpuGetCommonMasterVolume(s16 *mvol_left, s16 *mvol_right);
456extern void SpuGetCommonMasterVolumeX(s16 *mvolx_left, s16 *mvolx_right);
457extern void SpuGetCommonMasterVolumeAttr(s16 *mvol_left, s16 *mvol_right, s16 *mvolmode_left, s16 *mvolmode_right);
458extern void SpuGetCommonCDVolume(s16 *cd_left, s16 *cd_right);
459extern void SpuGetCommonCDReverb(int *cd_reverb);
460extern void SpuGetCommonCDMix(int *cd_mix);
461extern int SpuSetReverbModeType(int mode);
462extern void SpuSetReverbModeDepth(s16 depth_left, s16 depth_right);
463extern void SpuSetReverbModeDelayTime(int delay);
464extern void SpuSetReverbModeFeedback(int feedback);
465extern void SpuGetReverbModeType(int *mode);
466extern void SpuGetReverbModeDepth(s16 *depth_left, s16 *depth_right);
467extern void SpuGetReverbModeDelayTime(int *delay);
468extern void SpuGetReverbModeFeedback(int *feedback);
469extern void SpuGetVoiceAttr(SpuVoiceAttr *arg);
470extern void SpuNGetVoiceAttr(int v_num, SpuVoiceAttr *arg);
471extern void SpuSetESA(int rev_addr);
472extern void SpuSetAutoDMAAttr(s16 vol_l, s16 vol_r, s16 dry_on, s16 effect_on);
473extern void SpuSetSerialInAttr(s16 dry_on, s16 effect_on);
474
475#endif