source: roaraudio/libroar/ctl.c @ 299:96c37f163aa6

Last change on this file since 299:96c37f163aa6 was 299:96c37f163aa6, checked in by phi, 16 years ago

fixed byte-order bug in *_kick()

File size: 6.7 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 struct roar_message mes;
63
64 memset(&mes, 0, sizeof(struct roar_message)); // make valgrind happy!
65
66 mes.cmd = ROAR_CMD_EXIT;
67 mes.datalen = 0;
68 if ( roar_req(con, &mes, NULL) == -1 )
69  return -1;
70
71 if ( mes.cmd != ROAR_CMD_OK )
72  return -1;
73
74 return 0;
75}
76
77int roar_list         (struct roar_connection * con, int * items,   int max, int cmd) {
78 struct roar_message m;
79
80 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
81
82 roar_ctl_f2m_any(&m);
83 m.cmd = cmd;
84
85 if ( roar_req(con, &m, NULL) == -1 )
86  return -1;
87
88 return roar_ctl_m2ia(&m, items, max);
89}
90
91int roar_get_client   (struct roar_connection * con, struct roar_client * client, int id) {
92 struct roar_message m;
93
94 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
95
96 m.cmd     = ROAR_CMD_GET_CLIENT;
97 m.datalen = 1;
98 m.data[0] = id;
99
100 ROAR_DBG("roar_get_client(*): id = %i", id);
101
102 if ( roar_req(con, &m, NULL) == -1 )
103  return -1;
104
105 if ( m.cmd != ROAR_CMD_OK )
106  return -1;
107
108 ROAR_DBG("roar_get_client(*): got ok");
109
110 return roar_ctl_m2c(&m, client);
111}
112
113int roar_get_stream   (struct roar_connection * con, struct roar_stream * stream, int id) {
114 struct roar_message m;
115
116 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
117
118 m.cmd     = ROAR_CMD_GET_STREAM;
119 m.datalen = 1;
120 m.data[0] = id;
121
122 if ( roar_req(con, &m, NULL) == -1 )
123  return -1;
124
125 if ( m.cmd != ROAR_CMD_OK )
126  return -1;
127
128 return roar_stream_m2s(stream, &m);
129}
130
131int roar_kick         (struct roar_connection * con, int type, int id) {
132 struct roar_message m;
133 uint16_t * info = (uint16_t *) m.data;
134
135 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
136
137 m.cmd     = ROAR_CMD_KICK;
138 m.datalen = 4;
139 info[0] = ROAR_HOST2NET16(type);
140 info[1] = ROAR_HOST2NET16(id);
141
142 if ( roar_req(con, &m, NULL) == -1 )
143  return -1;
144
145 if ( m.cmd != ROAR_CMD_OK )
146  return -1;
147
148 return 0;
149}
150
151int roar_set_vol      (struct roar_connection * con, int id, struct roar_mixer_settings * mixer, int channels) {
152 struct roar_message m;
153 uint16_t * info = (uint16_t *) m.data;
154 int i;
155
156 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
157
158 m.cmd     = ROAR_CMD_SET_VOL;
159 m.datalen = (3 + channels) * 2;
160 info[0] = 0;
161 info[1] = id;
162 info[2] = ROAR_SET_VOL_ALL;
163
164 for (i = 0; i < channels; i++)
165  info[i+3] = mixer->mixer[i];
166
167 if ( roar_req(con, &m, NULL) == -1 )
168  return -1;
169
170 if ( m.cmd != ROAR_CMD_OK )
171  return -1;
172
173 return 0;
174}
175
176int roar_get_vol      (struct roar_connection * con, int id, struct roar_mixer_settings * mixer, int * channels) {
177 struct roar_message m;
178 uint16_t * info = (uint16_t *) m.data;
179 int i;
180
181 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
182
183 m.cmd     = ROAR_CMD_GET_VOL;
184 m.datalen = 2*2;
185 info[0] = 0;
186 info[1] = id;
187
188 if ( roar_req(con, &m, NULL) == -1 )
189  return -1;
190
191 if ( m.cmd != ROAR_CMD_OK )
192  return -1;
193
194 if ( info[0] != 0 )
195  return -1;
196
197 if ( channels != NULL )
198  *channels = info[1];
199
200 if ( info[1] > ROAR_MAX_CHANNELS )
201  return -1;
202
203 for (i = 0; i < info[1]; i++)
204  mixer->mixer[i] = info[i+2];
205
206 return 0;
207}
208
209// converts: *_m2*, *_*2m
210
211int roar_ctl_f2m      (struct roar_message * m, unsigned char   filter, unsigned char   cmp, uint32_t   id) {
212
213 m->datalen = 7;
214
215 m->data[0] = 0;
216 m->data[1] = filter;
217 m->data[2] = cmp;
218 *((uint32_t*)&(m->data[3])) = ROAR_HOST2NET32(id);
219
220 return 0;
221}
222int roar_ctl_m2f      (struct roar_message * m, unsigned char * filter, unsigned char * cmp, uint32_t * id) {
223
224 if ( m->datalen != 7 )
225  return -1;
226
227 if ( m->data[0] != 0 ) {
228  ROAR_ERR("roar_ctl_m2f(*): version %i not supported!", m->data[0]);
229  return -1;
230 }
231
232 *filter = m->data[1];
233 *cmp    = m->data[2];
234
235 *id = ROAR_NET2HOST32(*((uint32_t*)&(m->data[3])));
236
237 return 0;
238}
239
240int roar_ctl_ia2m     (struct roar_message * m, int * data, int len) {
241 int i;
242
243 if ( len > LIBROAR_BUFFER_MSGDATA )
244  return -1;
245
246 m->datalen = len;
247
248 for (i = 0; i < len; i++)
249  m->data[i] = data[i];
250
251 return 0;
252}
253int roar_ctl_m2ia     (struct roar_message * m, int * data, int len) {
254 int i;
255
256 if ( m->datalen > len )
257  return -1;
258
259 for (i = 0; i < m->datalen; i++)
260  data[i] = m->data[i];
261
262 return m->datalen;
263}
264
265int roar_ctl_c2m      (struct roar_message * m, struct roar_client * c) {
266 int cur = 0;
267 int h;
268 int i;
269 int max_len;
270
271 if ( c == NULL )
272  return -1;
273
274 m->data[cur++] = 0;                       // 0: Version
275 m->data[cur++] = c->execed;               // 1: execed
276
277 h = 0;
278 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) {
279  if ( c->streams[i] != -1 )
280   m->data[cur+1+h++] = c->streams[i];
281 }
282
283 m->data[cur++] = h;                       // 2: num of streams
284 cur += h;
285
286 max_len = strlen(c->name);
287
288 // TODO: add some code to check if this fits in the pkg
289 // NOTE: add this code after we are sure how long this pkg will be
290 //       and fully decieded about this function.
291
292 m->data[cur++] = max_len;
293
294 strncpy((m->data)+cur, c->name, max_len);
295
296 cur += max_len;
297
298 m->datalen = cur;
299
300 return 0;
301}
302
303int roar_ctl_m2c      (struct roar_message * m, struct roar_client * c) {
304 int i;
305 int cur;
306
307 if ( m == NULL || c == NULL )
308  return -1;
309
310 if ( m->datalen == 0 )
311  return -1;
312
313 ROAR_DBG("roar_ctl_m2c(*): got data!, len = %i", m->datalen);
314
315 if ( m->data[0] != 0 ) {
316  ROAR_DBG("roar_ctl_m2c(*): wrong version!");
317  return -1;
318 }
319
320 if ( m->datalen < 3 )
321  return -1;
322
323 ROAR_DBG("roar_ctl_m2c(*): have usable data!");
324
325 c->execed = m->data[1];
326
327 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++)
328  c->streams[i] = -1;
329
330 for (i = 0; i < m->data[2]; i++)
331  c->streams[i] = m->data[3+i];
332
333 cur = 3 + m->data[2];
334
335 strncpy(c->name, (m->data)+cur+1, m->data[cur]);
336 c->name[(int)m->data[cur]] = 0;
337
338 return 0;
339}
340
341//ll
Note: See TracBrowser for help on using the repository browser.