19static SifRpcClientData_t sd_client ALIGNED(64);
21int sceSdInit(
int flag)
23 s32 buf[1] ALIGNED(64);
24 if (HasIopRebootedSinceLastCall())
25 memset(&sd_client, 0,
sizeof(sd_client));
31 if (sceSifBindRpc(&sd_client, BINDID_PS2SND, 0) < 0)
33 printf(
"%s: Failed to bind to rpc '0x%08x'\n", __FUNCTION__, BINDID_PS2SND);
37 if (sd_client.server != NULL)
46 sceSifCallRpc(&sd_client, PS2SND_Init, 0, buf, 4, buf, 4, NULL, NULL);
51void sceSdSetParam(u16 entry, u16 value)
53 u32 buf[2] ALIGNED(64);
56 sceSifCallRpc(&sd_client, PS2SND_SetParam, 0, buf, 8, NULL, 0, NULL, NULL);
59u16 sceSdGetParam(u16 entry)
61 u32 buf[1] ALIGNED(64);
63 sceSifCallRpc(&sd_client, PS2SND_GetParam, 0, buf, 4, buf, 4, NULL, NULL);
67void sceSdSetSwitch(u16 entry, u32 value)
69 u32 buf[2] ALIGNED(64);
72 sceSifCallRpc(&sd_client, PS2SND_SetSwitch, 0, buf, 8, NULL, 0, NULL, NULL);
75u32 sceSdGetSwitch(u16 entry)
77 u32 buf[1] ALIGNED(64);
79 sceSifCallRpc(&sd_client, PS2SND_GetSwitch, 0, buf, 4, buf, 4, NULL, NULL);
83void sceSdSetAddr(u16 entry, u32 value)
85 u32 buf[2] ALIGNED(64);
88 sceSifCallRpc(&sd_client, PS2SND_SetAddr, 0, buf, 8, NULL, 0, NULL, NULL);
91u32 sceSdGetAddr(u16 entry)
93 u32 buf[1] ALIGNED(64);
95 sceSifCallRpc(&sd_client, PS2SND_GetAddr, 0, buf, 4, buf, 4, NULL, NULL);
99void sceSdSetCoreAttr(u16 entry, u16 value)
101 u32 buf[2] ALIGNED(64);
104 sceSifCallRpc(&sd_client, PS2SND_SetCoreAttr, 0, buf, 8, NULL, 0, NULL, NULL);
107u16 sceSdGetCoreAttr(u16 entry)
109 u32 buf[1] ALIGNED(64);
111 sceSifCallRpc(&sd_client, PS2SND_GetCoreAttr, 0, buf, 4, buf, 4, NULL, NULL);
115u16 sceSdNote2Pitch(u16 center_note, u16 center_fine, u16 note, s16 fine)
126u16 sceSdPitch2Note(u16 center_note, u16 center_fine, u16 pitch)
136int sceSdProcBatch(
const sceSdBatch* batch, u32 returns[], u32 num)
146int sceSdProcBatchEx(
const sceSdBatch* batch, u32 returns[], u32 num, u32 voice)
158int sceSdVoiceTrans(s16 channel, u16 mode, u8 *m_addr, u32 *s_addr, u32 size)
160 u32 buf[5] ALIGNED(64);
161 ((s32 *)buf)[0] = channel;
163 buf[2] = (u32)m_addr;
164 buf[3] = (u32)s_addr;
167 sceSifCallRpc(&sd_client, PS2SND_VoiceTrans, 0, buf, 20, buf, 4, NULL, NULL);
168 return(((s32 *)buf)[0]);
171int sceSdBlockTrans(s16 channel, u16 mode, u8 *m_addr, u32 size, ...)
181u32 sceSdVoiceTransStatus (s16 channel, s16 flag)
183 s32 buf[2] ALIGNED(64);
187 sceSifCallRpc(&sd_client, PS2SND_VoiceTransStatus, 0, buf, 8, buf, 4, NULL, NULL);
188 return(((u32 *)buf)[0]);
191u32 sceSdBlockTransStatus (s16 channel, s16 flag)
193 s32 buf[2] ALIGNED(64);
197 sceSifCallRpc(&sd_client, PS2SND_BlockTransStatus, 0, buf, 8, buf, 4, NULL, NULL);
198 return(((u32 *)buf)[0]);
209 sceSifCallRpc(&sd_client, PS2SND_SetEffectAttr, 0, buf, 4+
sizeof(
sceSdEffectAttr), buf, 4, NULL, NULL);
217 sceSifCallRpc(&sd_client, PS2SND_GetEffectAttr, 0, buf, 4, buf,
sizeof(
sceSdEffectAttr), NULL, NULL);
221int sceSdClearEffectWorkArea (
int core,
int channel,
int effect_mode)
223 s32 buf[3] ALIGNED(64);
226 buf[2] = effect_mode;
227 sceSifCallRpc(&sd_client, PS2SND_ClearEffectWorkArea, 0, buf, 12, buf, 4, NULL, NULL);
232u32 sndQueryMaxFreeMemSize(
void)
234 u32 buf[1] ALIGNED(64);
235 sceSifCallRpc(&sd_client, PS2SND_QueryMaxFreeMemSize, 0, NULL, 0, buf, 4, NULL, NULL);
239int sndStreamOpen(
char *file, u32 voices, u32 flags, u32 bufaddr, u32 bufsize)
241 u32 buf[32] ALIGNED(64);
246 strlcpy((
char*)&buf[4], file, 27*4);
249 sceSifCallRpc(&sd_client, PS2SND_StreamOpen, 0, buf, 128, buf, 4, NULL, NULL);
250 return(((s32 *)buf)[0]);
254int sndStreamClose(
void)
256 s32 buf[1] ALIGNED(64);
257 sceSifCallRpc(&sd_client, PS2SND_StreamClose, 0, NULL, 0, buf, 4, NULL, NULL);
261int sndStreamPlay(
void)
263 s32 buf[1] ALIGNED(64);
264 sceSifCallRpc(&sd_client, PS2SND_StreamPlay, 0, NULL, 0, buf, 4, NULL, NULL);
269int sndStreamPause(
void)
271 s32 buf[1] ALIGNED(64);
272 sceSifCallRpc(&sd_client, PS2SND_StreamPause, 0, NULL, 0, buf, 4, NULL, NULL);
276int sndStreamSetPosition(
int block)
278 s32 buf[1] ALIGNED(64);
280 sceSifCallRpc(&sd_client, PS2SND_StreamSetPosition, 0, buf, 4, buf, 4, NULL, NULL);
284int sndStreamSetVolume(
int left,
int right)
286 s32 buf[2] ALIGNED(64);
289 sceSifCallRpc(&sd_client, PS2SND_StreamSetVolume, 0, buf, 8, buf, 4, NULL, NULL);
293int sndStreamGetPosition(
void)
295 s32 buf[1] ALIGNED(64);
296 sceSifCallRpc(&sd_client, PS2SND_StreamGetPosition, 0, NULL, 0, buf, 4, NULL, NULL);
300int sndLoadSample(
void *buf, u32 spuaddr,
int size)
304 SifDmaTransfer_t sifdma;
306 iopfree = sndQueryMaxFreeMemSize()/2;
312 iopbuf = SifAllocIopHeap(size);
323 id = sceSifSetDma(&sifdma, 1);
324 while(sceSifDmaStat(
id) >= 0);;
327 sceSdVoiceTrans(0, SD_TRANS_WRITE,
iopbuf, (
void*)spuaddr, size);
328 sceSdVoiceTransStatus(0, 1);