ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
ahx_rpc.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # Copyright 2001-2004, 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 
16 #include <tamtypes.h>
17 #include <kernel.h>
18 #include <sifrpc.h>
19 #include <stdarg.h>
20 #include <string.h>
21 #include <malloc.h>
22 #include <fcntl.h>
23 #include <unistd.h>
24 #include <stdio.h>
25 #include "ahx_rpc.h"
26 
27 static unsigned sbuff[64] __attribute__((aligned (64)));
28 static struct t_SifRpcClientData cd0;
30 #define IOP_MEM 0xbc000000
32 int ahx_init_done = 0;
33 
39 void iop_readwrite(void *addr, void *buf, u32 size, u32 read)
40 {
41  DI();
43  if (read) memcpy(buf, addr + IOP_MEM, size); else memcpy(addr + IOP_MEM, buf, size);
44  ee_kmode_exit();
45  EI();
46 }
47 
48 int AHX_Init()
49 {
50  int i;
51  // struct t_SifDmaTransfer sdt;
52 
53  // if already init'd, exit
54  if (ahx_init_done) return 0;
55 
56  // bind rpc
57  while(1){
58  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1; // bind error
59  if (cd0.server != 0) break;
60  i = 0x10000;
61  while(i--);
62  }
63 
64  SifCallRpc(&cd0,AHX_INIT,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
65 
66  songbuffer_addr = (char*)sbuff[1];
67 
68  // set flag, init done
69  ahx_init_done = 1;
70  return 0;
71 }
72 
73 int AHX_Play()
74 {
75  int i;
76  while(1){
77  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
78  if (cd0.server != 0) break;
79  i = 0x10000;
80  while(i--);
81  }
82  SifCallRpc(&cd0,AHX_PLAY,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
83  return 0;
84 }
85 
86 int AHX_Pause()
87 {
88  int i;
89  while(1){
90  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
91  if (cd0.server != 0) break;
92  i = 0x10000;
93  while(i--);
94  }
95  SifCallRpc(&cd0,AHX_PAUSE,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
96  return 0;
97 }
98 
99 int AHX_SubSong(int songNo)
100 {
101  int i;
102  while(1){
103  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
104  if (cd0.server != 0) break;
105  i = 0x10000;
106  while(i--);
107  }
108  sbuff[0] = (unsigned)songNo;
109  SifCallRpc(&cd0,AHX_PAUSE,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
110  return 0;
111 }
112 
113 int AHX_SetVolume(int volumePercentage)
114 {
115  int i;
116  while(1){
117  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
118  if (cd0.server != 0) break;
119  i = 0x10000;
120  while(i--);
121  }
122  sbuff[0] = (unsigned)volumePercentage;
123  SifCallRpc(&cd0,AHX_QUIT,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
124  return 0;
125 }
126 
127 int AHX_SetBoost(int boostValue)
128 {
129  int i;
130  while(1){
131  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
132  if (cd0.server != 0) break;
133  i = 0x10000;
134  while(i--);
135  }
136  sbuff[0] = (unsigned)boostValue;
137  SifCallRpc(&cd0,AHX_SETBOOST,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
138  return 0;
139 }
140 
142 {
143  int i;
144  while(1){
145  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
146  if (cd0.server != 0) break;
147  i = 0x10000;
148  while(i--);
149  }
150  SifCallRpc(&cd0,AHX_OVERSAMPLING,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
151  return 0;
152 }
153 
154 int AHX_Quit()
155 {
156  int i;
157  while(1){
158  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
159  if (cd0.server != 0) break;
160  i = 0x10000;
161  while(i--);
162  }
163  SifCallRpc(&cd0,AHX_QUIT,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
164  return 0;
165 }
166 
167 int AHX_LoadSongBuffer(char* songdata, int songsize)
168 {
169  int i;
170 
171  // write song data to IOP song buffer
172  iop_readwrite(songbuffer_addr, songdata, songsize, 0);
173 
174  while(1){
175  if (SifBindRpc( &cd0, AHX_IRX, 0) < 0) return -1;
176  if (cd0.server != 0) break;
177  i = 0x10000;
178  while(i--);
179  }
180 
181  // set oversample and boost
182  sbuff[0] = (unsigned)songsize;
183 
184  // call rpc
185  SifCallRpc(&cd0,AHX_LOADSONG,0,(void*)(&sbuff[0]),64,(void*)(&sbuff[0]),64,NULL,NULL);
186 
187  // return number of sub-songs
188  return (int)sbuff[1];
189 }
190 
191 int AHX_LoadSong(char* filename)
192 {
193  int fd, fdSize;
194  char* buffer;
195 
196  fd = open(filename, O_RDONLY);
197  if(fd < 0)
198  {
199  printf("ERROR LOADING SONG\n");
200  return -1;
201  }
202  fdSize = lseek(fd, 0, SEEK_END);
203  lseek(fd, 0, SEEK_SET);
204  buffer = malloc(fdSize);
205  if(!buffer)
206  {
207  printf("ERROR ALLOCATING SONG MEMORY SONG\n");
208  return -1;
209  }
210  read(fd, buffer, fdSize);
211  close(fd);
212  return AHX_LoadSongBuffer(buffer, fdSize);
213 }
static struct t_SifRpcClientData cd0
Definition: ahx_rpc.c:28
static unsigned sbuff[64]
Definition: ahx_rpc.c:27
int AHX_SetBoost(int boostValue)
Definition: ahx_rpc.c:127
#define IOP_MEM
Definition: ahx_rpc.c:30
int AHX_LoadSongBuffer(char *songdata, int songsize)
Definition: ahx_rpc.c:167
int AHX_Init()
Definition: ahx_rpc.c:48
int AHX_Play()
Definition: ahx_rpc.c:73
void iop_readwrite(void *addr, void *buf, u32 size, u32 read)
Definition: ahx_rpc.c:39
int ahx_init_done
Definition: ahx_rpc.c:32
int AHX_SetVolume(int volumePercentage)
Definition: ahx_rpc.c:113
int AHX_SubSong(int songNo)
Definition: ahx_rpc.c:99
int AHX_ToggleOversampling()
Definition: ahx_rpc.c:141
int AHX_Quit()
Definition: ahx_rpc.c:154
int AHX_Pause()
Definition: ahx_rpc.c:86
char * songbuffer_addr
Definition: ahx_rpc.c:31
int AHX_LoadSong(char *filename)
Definition: ahx_rpc.c:191
#define AHX_PAUSE
Definition: ahx_rpc.h:22
#define AHX_INIT
Definition: ahx_rpc.h:20
#define AHX_IRX
Definition: ahx_rpc.h:19
#define AHX_PLAY
Definition: ahx_rpc.h:21
#define AHX_OVERSAMPLING
Definition: ahx_rpc.h:27
#define AHX_QUIT
Definition: ahx_rpc.h:23
#define AHX_SETBOOST
Definition: ahx_rpc.h:26
#define AHX_LOADSONG
Definition: ahx_rpc.h:24
static int ee_kmode_exit()
Definition: kernel.h:198
static int ee_kmode_enter()
Definition: kernel.h:181
#define DI
Definition: kernel.h:24
#define EI
Definition: kernel.h:25
u8 buffer[128]
Definition: rpc_client.c:19
int SifBindRpc(SifRpcClientData_t *client, int rpc_number, int mode)
int SifCallRpc(SifRpcClientData_t *client, int rpc_number, int mode, void *send, int ssize, void *receive, int rsize, SifRpcEndFunc_t end_function, void *end_param)
#define NULL
Definition: tamtypes.h:91
unsigned int u32
Definition: tamtypes.h:30