source: roaraudio/libroar/ctl.c @ 578:51e28ac3912e

Last change on this file since 578:51e28ac3912e was 578:51e28ac3912e, checked in by phi, 16 years ago

added call roar_terminate() to libroar

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