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