PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
ps2snd.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2005, James Lee (jbit<at>jbit<dot>net)
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11
12#include <types.h>
13#include <irx.h>
14#include <sifrpc.h>
15#include <loadcore.h>
16#include <stdio.h>
17#include <libsd.h>
18#include <thbase.h>
19#include <intrman.h>
20#include <sysmem.h>
21#include <thsemap.h>
22#include <ps2snd.h>
23#include "mod.h"
24IRX_ID(MODNAME,VER_MAJOR,VER_MINOR)
25int debug_level = OUT_WARNING;
26
27static SifRpcDataQueue_t queue;
28static SifRpcServerData_t server;
29
30static u32 rpc_buffer[2][32] __attribute__((__aligned__(4))); /* XXX: how big should this be? */
31
32
33#define DS ((u32*)data)
34#define DU ((u32*)data)
35
36
37void *rpc_server(u32 func, void *data, u32 size)
38{
39 u32 *ru = rpc_buffer[1];
40 s32 *rs = (s32*)rpc_buffer[1];
41
42 (void)size;
43
44 switch(func)
45 {
46 case PS2SND_Init: *rs = sceSdInit (DS[0]); break;
47 case PS2SND_SetParam: sceSdSetParam (DU[0], DU[1]); break;
48 case PS2SND_GetParam: *ru = sceSdGetParam (DU[0]); break;
49 case PS2SND_SetSwitch: sceSdSetSwitch (DU[0], DU[1]); break;
50 case PS2SND_GetSwitch: *ru = sceSdGetSwitch (DU[0]); break;
51 case PS2SND_SetAddr: sceSdSetAddr (DU[0], DU[1]); break;
52 case PS2SND_GetAddr: *ru = sceSdGetAddr (DU[0]); break;
53 case PS2SND_SetCoreAttr: sceSdSetCoreAttr(DU[0], DU[1]); break;
54 case PS2SND_GetCoreAttr: *ru = sceSdGetCoreAttr(DU[0]); break;
55 case PS2SND_Note2Pitch: *ru = sceSdNote2Pitch (DU[0], DU[1], DU[2], DS[3]); break;
56 case PS2SND_Pitch2Note: *ru = sceSdPitch2Note (DU[0], DU[1], DU[2]); break;
57 case PS2SND_ProcBatch: *rs = sceSdProcBatch ((sceSdBatch *)&DU[1], &ru[1], DU[0]); break;
58 case PS2SND_ProcBatchEx: *rs = sceSdProcBatchEx((sceSdBatch *)&DU[2], &ru[1], DU[0], DU[1]); break;
59 case PS2SND_VoiceTrans: *rs = sceSdVoiceTrans(DS[0], DU[1], (u8 *)DU[2], (u32 *)DU[3], DU[4]); break;
60 case PS2SND_BlockTrans: *rs = sceSdBlockTrans(DS[0], DU[1], (u8 *)DU[2], DU[3], (u8 *)DU[4]); break;
61 case PS2SND_VoiceTransStatus: *ru = sceSdVoiceTransStatus (DS[0], DS[1]); break;
62 case PS2SND_BlockTransStatus: *ru = sceSdBlockTransStatus (DS[0], DS[1]); break;
63// case PS2SND_SetTransCallback: void* sceSdSetTransCallback (u16 channel, void SD_TRANS_CBProc(void *) );
64// case PS2SND_SetIRQCallback: void* sceSdSetIRQCallback ( void SD_IRQ_CBProc(void *) );
65 case PS2SND_SetEffectAttr: *rs = sceSdSetEffectAttr (DU[0], (sceSdEffectAttr *)&DU[1]); break;
66 case PS2SND_GetEffectAttr: sceSdGetEffectAttr (DU[0], (sceSdEffectAttr *)rpc_buffer[1]); break;
67 case PS2SND_ClearEffectWorkArea: *rs = sceSdClearEffectWorkArea (DS[0], DS[1], DS[2]); break;
68// case PS2SND_SetTransIntrHandler: SdIntrHandler sceSdSetTransIntrHandler(int channel, SdIntrHandler func, void *arg);
69// case PS2SND_SetSpu2IntrHandler: SdIntrHandler sceSdSetSpu2IntrHandler(SdIntrHandler func, void *arg);
70
71 case PS2SND_StreamOpen: *rs = sndStreamOpen((char*)&DS[4], DU[0], DU[1], DU[2], DU[3]); break;
72 case PS2SND_StreamClose: *rs = sndStreamClose(); break;
73 case PS2SND_StreamPlay: *rs = sndStreamPlay(); break;
74 case PS2SND_StreamPause: *rs = sndStreamPause(); break;
75 case PS2SND_StreamSetPosition: *rs = sndStreamSetPosition(DS[0]); break;
76 case PS2SND_StreamGetPosition: *rs = sndStreamGetPosition(); break;
77 case PS2SND_StreamSetVolume: *rs = sndStreamSetVolume(DS[0], DS[1]); break;
78
79 case PS2SND_QueryMaxFreeMemSize: *ru = QueryMaxFreeMemSize(); break;
80 default:
81 dprintf(OUT_WARNING, "Unknown function id '%u'\n", (unsigned int)func);
82 return(NULL);
83 }
84
85 return(rpc_buffer[1]);
86}
87
88
89void rpc_thread(void *d)
90{
91 (void)d;
92
93 printf(BANNER, VER_MAJOR, VER_MINOR);
94 sceSifInitRpc(0);
95 sceSifSetRpcQueue(&queue, GetThreadId());
96 sceSifRegisterRpc(&server, BINDID_PS2SND, (void*)rpc_server, rpc_buffer[0], 0, 0, &queue);
97 sceSifRpcLoop(&queue);
98}
99
100int _start(int argc, char *argv[])
101{
103 int threadid;
104
105 FlushDcache();
106 CpuEnableIntr(0);
107
108 if (argc>=1)
109 {
110 switch(argv[1][0])
111 {
112 case 'e': debug_level = OUT_ERROR; break; /* only errors */
113 case 'w': debug_level = OUT_WARNING; break; /* warnings too */
114 case 'i': debug_level = OUT_INFO; break; /* and info */
115 case 'd': debug_level = OUT_DEBUG; break; /* and debuging */
116 }
117 printf("debug_level = %d (%c)\n", debug_level, argv[1][0]);
118 }
119
120 thread.attr = TH_C;
121 thread.thread = rpc_thread;
122 thread.priority = 40;
123 thread.stacksize = 0x800;
124 thread.option = 0;
125 threadid = CreateThread(&thread);
126 if (threadid < 0)
127 {
128 dprintf(OUT_ERROR, "Failed to make thread\n");
129 return MODULE_NO_RESIDENT_END;
130 }
131
132 StartThread(threadid, 0);
133
134 return MODULE_RESIDENT_END;
135}
136
int CpuEnableIntr()
Definition intrman.c:250
typedef __attribute__
Definition tlbfunc.c:60