source: roaraudio/libroar/ctl.c @ 24:951795a0bd65

Last change on this file since 24:951795a0bd65 was 24:951795a0bd65, checked in by phi, 16 years ago

added roar_get_vol()

File size: 6.0 KB
Line 
1//ctl.c:
2
3#include "libroar.h"
4
5int roar_server_oinfo   (struct roar_connection * con, struct roar_stream * sa) {
6 struct roar_message mes;
7
8 mes.cmd     = ROAR_CMD_SERVER_OINFO;
9 mes.datalen = 0;
10
11 if ( roar_req(con, &mes, NULL) == -1 )
12  return -1;
13
14 if ( mes.cmd != ROAR_CMD_OK )
15  return -1;
16
17 if ( roar_stream_m2s(sa, &mes) == -1 )
18  return -1;
19
20 return 0;
21}
22
23int roar_get_standby   (struct roar_connection * con) {
24 struct roar_message mes;
25
26 mes.cmd = ROAR_CMD_GET_STANDBY;
27 mes.datalen = 0;
28
29 if ( roar_req(con, &mes, NULL) == -1 )
30  return -1;
31
32 if ( mes.cmd != ROAR_CMD_OK )
33  return -1;
34
35 return ROAR_NET2HOST16(*((uint16_t*)mes.data));
36}
37
38int roar_set_standby   (struct roar_connection * con, int state) {
39 struct roar_message mes;
40
41 mes.cmd = ROAR_CMD_SET_STANDBY;
42 mes.datalen = 2;
43
44 *((uint16_t*)mes.data) = ROAR_HOST2NET16((unsigned) state);
45
46 if ( roar_req(con, &mes, NULL) == -1 )
47  return -1;
48
49 if ( mes.cmd != ROAR_CMD_OK )
50  return -1;
51
52 return 0;
53}
54
55int roar_exit   (struct roar_connection * con) {
56 struct roar_message mes;
57
58 mes.cmd = ROAR_CMD_EXIT;
59 mes.datalen = 0;
60 if ( roar_req(con, &mes, NULL) == -1 )
61  return -1;
62
63 if ( mes.cmd != ROAR_CMD_OK )
64  return -1;
65
66 return 0;
67}
68
69int roar_list         (struct roar_connection * con, int * items,   int max, int cmd) {
70 struct roar_message m;
71
72 roar_ctl_f2m_any(&m);
73 m.cmd = cmd;
74
75 if ( roar_req(con, &m, NULL) == -1 )
76  return -1;
77
78 return roar_ctl_m2ia(&m, items, max);
79}
80
81int roar_get_client   (struct roar_connection * con, struct roar_client * client, int id) {
82 struct roar_message m;
83
84 m.cmd     = ROAR_CMD_GET_CLIENT;
85 m.datalen = 1;
86 m.data[0] = id;
87
88 ROAR_DBG("roar_get_client(*): id = %i", id);
89
90 if ( roar_req(con, &m, NULL) == -1 )
91  return -1;
92
93 if ( m.cmd != ROAR_CMD_OK )
94  return -1;
95
96 ROAR_DBG("roar_get_client(*): got ok");
97
98 return roar_ctl_m2c(&m, client);
99}
100
101int roar_get_stream   (struct roar_connection * con, struct roar_stream * stream, int id) {
102 struct roar_message m;
103
104 m.cmd     = ROAR_CMD_GET_STREAM;
105 m.datalen = 1;
106 m.data[0] = id;
107
108 if ( roar_req(con, &m, NULL) == -1 )
109  return -1;
110
111 if ( m.cmd != ROAR_CMD_OK )
112  return -1;
113
114 return roar_stream_m2s(stream, &m);
115}
116
117int roar_kick         (struct roar_connection * con, int type, int id) {
118 struct roar_message m;
119 uint16_t * info = (uint16_t *) m.data;
120
121 m.cmd     = ROAR_CMD_KICK;
122 m.datalen = 4;
123 info[0] = type;
124 info[1] = id;
125
126 if ( roar_req(con, &m, NULL) == -1 )
127  return -1;
128
129 if ( m.cmd != ROAR_CMD_OK )
130  return -1;
131
132 return 0;
133}
134
135int roar_set_vol      (struct roar_connection * con, int id, struct roar_mixer_settings * mixer, int channels) {
136 struct roar_message m;
137 uint16_t * info = (uint16_t *) m.data;
138 int i;
139
140 m.cmd     = ROAR_CMD_SET_VOL;
141 m.datalen = (3 + channels) * 2;
142 info[0] = 0;
143 info[1] = id;
144 info[2] = ROAR_SET_VOL_ALL;
145
146 for (i = 0; i < channels; i++)
147  info[i+3] = mixer->mixer[i];
148
149 if ( roar_req(con, &m, NULL) == -1 )
150  return -1;
151
152 if ( m.cmd != ROAR_CMD_OK )
153  return -1;
154
155 return 0;
156}
157
158int roar_get_vol      (struct roar_connection * con, int id, struct roar_mixer_settings * mixer, int * channels) {
159 struct roar_message m;
160 uint16_t * info = (uint16_t *) m.data;
161 int i;
162
163 m.cmd     = ROAR_CMD_GET_VOL;
164 m.datalen = 2*2;
165 info[0] = 0;
166 info[1] = id;
167
168 if ( roar_req(con, &m, NULL) == -1 )
169  return -1;
170
171 if ( m.cmd != ROAR_CMD_OK )
172  return -1;
173
174 if ( info[0] != 0 )
175  return -1;
176
177 if ( channels != NULL )
178  *channels = info[1];
179
180 if ( info[1] > ROAR_MAX_CHANNELS )
181  return -1;
182
183 for (i = 0; i < info[1]; i++)
184  mixer->mixer[i] = info[i+2];
185
186 return 0;
187}
188
189// converts: *_m2*, *_*2m
190
191int roar_ctl_f2m      (struct roar_message * m, unsigned char   filter, unsigned char   cmp, uint32_t   id) {
192
193 m->datalen = 7;
194
195 m->data[0] = 0;
196 m->data[1] = filter;
197 m->data[2] = cmp;
198 *((uint32_t*)&(m->data[3])) = ROAR_HOST2NET32(id);
199
200 return 0;
201}
202int roar_ctl_m2f      (struct roar_message * m, unsigned char * filter, unsigned char * cmp, uint32_t * id) {
203
204 if ( m->datalen != 7 )
205  return -1;
206
207 if ( m->data[0] != 0 ) {
208  ROAR_ERR("roar_ctl_m2f(*): version %i not supported!", m->data[0]);
209  return -1;
210 }
211
212 *filter = m->data[1];
213 *cmp    = m->data[2];
214
215 *id = ROAR_NET2HOST32(*((uint32_t*)&(m->data[3])));
216
217 return 0;
218}
219
220int roar_ctl_ia2m     (struct roar_message * m, int * data, int len) {
221 int i;
222
223 if ( len > LIBROAR_BUFFER_MSGDATA )
224  return -1;
225
226 m->datalen = len;
227
228 for (i = 0; i < len; i++)
229  m->data[i] = data[i];
230
231 return 0;
232}
233int roar_ctl_m2ia     (struct roar_message * m, int * data, int len) {
234 int i;
235
236 if ( m->datalen > len )
237  return -1;
238
239 for (i = 0; i < m->datalen; i++)
240  data[i] = m->data[i];
241
242 return m->datalen;
243}
244
245int roar_ctl_c2m      (struct roar_message * m, struct roar_client * c) {
246 int cur = 0;
247 int h;
248 int i;
249 int max_len;
250
251 if ( c == NULL )
252  return -1;
253
254 m->data[cur++] = 0;                       // 0: Version
255 m->data[cur++] = c->execed;               // 1: execed
256
257 h = 0;
258 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) {
259  if ( c->streams[i] != -1 )
260   m->data[cur+1+h++] = c->streams[i];
261 }
262
263 m->data[cur++] = h;                       // 2: num of streams
264 cur += h;
265
266 max_len = strlen(c->name);
267
268 // TODO: add some code to check if this fits in the pkg
269 // NOTE: add this code after we are sure how long this pkg will be
270 //       and fully decieded about this function.
271
272 m->data[cur++] = max_len;
273
274 strncpy((m->data)+cur, c->name, max_len);
275
276 cur += max_len;
277
278 m->datalen = cur;
279
280 return 0;
281}
282
283int roar_ctl_m2c      (struct roar_message * m, struct roar_client * c) {
284 int i;
285 int cur;
286
287 if ( m == NULL || c == NULL )
288  return -1;
289
290 if ( m->datalen == 0 )
291  return -1;
292
293 ROAR_DBG("roar_ctl_m2c(*): got data!, len = %i", m->datalen);
294
295 if ( m->data[0] != 0 ) {
296  ROAR_DBG("roar_ctl_m2c(*): wrong version!");
297  return -1;
298 }
299
300 if ( m->datalen < 3 )
301  return -1;
302
303 ROAR_DBG("roar_ctl_m2c(*): have usable data!");
304
305 c->execed = m->data[1];
306
307 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++)
308  c->streams[i] = -1;
309
310 for (i = 0; i < m->data[2]; i++)
311  c->streams[i] = m->data[3+i];
312
313 cur = 3 + m->data[2];
314
315 strncpy(c->name, (m->data)+cur+1, m->data[cur]);
316 c->name[(int)m->data[cur]] = 0;
317
318 return 0;
319}
320
321//ll
Note: See TracBrowser for help on using the repository browser.