source: roaraudio/libroar/ctl.c @ 300:e6ba051b5eb2

Last change on this file since 300:e6ba051b5eb2 was 300:e6ba051b5eb2, checked in by phi, 16 years ago

fixed byte-order bug in *_set/get_vol(), hey! one bug more :)

File size: 6.9 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] = ROAR_HOST2NET16(id);
162 info[2] = ROAR_HOST2NET16(ROAR_SET_VOL_ALL);
163
164 for (i = 0; i < channels; i++)
165  info[i+3] = ROAR_HOST2NET16(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] = ROAR_HOST2NET16(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 info[1] = ROAR_NET2HOST16(info[1]);
198
199 if ( channels != NULL )
200  *channels = info[1];
201
202 if ( info[1] > ROAR_MAX_CHANNELS )
203  return -1;
204
205 for (i = 0; i < info[1]; i++)
206  mixer->mixer[i] = ROAR_NET2HOST16(info[i+2]);
207
208 return 0;
209}
210
211// converts: *_m2*, *_*2m
212
213int roar_ctl_f2m      (struct roar_message * m, unsigned char   filter, unsigned char   cmp, uint32_t   id) {
214
215 m->datalen = 7;
216
217 m->data[0] = 0;
218 m->data[1] = filter;
219 m->data[2] = cmp;
220 *((uint32_t*)&(m->data[3])) = ROAR_HOST2NET32(id);
221
222 return 0;
223}
224int roar_ctl_m2f      (struct roar_message * m, unsigned char * filter, unsigned char * cmp, uint32_t * id) {
225
226 if ( m->datalen != 7 )
227  return -1;
228
229 if ( m->data[0] != 0 ) {
230  ROAR_ERR("roar_ctl_m2f(*): version %i not supported!", m->data[0]);
231  return -1;
232 }
233
234 *filter = m->data[1];
235 *cmp    = m->data[2];
236
237 *id = ROAR_NET2HOST32(*((uint32_t*)&(m->data[3])));
238
239 return 0;
240}
241
242int roar_ctl_ia2m     (struct roar_message * m, int * data, int len) {
243 int i;
244
245 if ( len > LIBROAR_BUFFER_MSGDATA )
246  return -1;
247
248 m->datalen = len;
249
250 for (i = 0; i < len; i++)
251  m->data[i] = data[i];
252
253 return 0;
254}
255int roar_ctl_m2ia     (struct roar_message * m, int * data, int len) {
256 int i;
257
258 if ( m->datalen > len )
259  return -1;
260
261 for (i = 0; i < m->datalen; i++)
262  data[i] = m->data[i];
263
264 return m->datalen;
265}
266
267int roar_ctl_c2m      (struct roar_message * m, struct roar_client * c) {
268 int cur = 0;
269 int h;
270 int i;
271 int max_len;
272
273 if ( c == NULL )
274  return -1;
275
276 m->data[cur++] = 0;                       // 0: Version
277 m->data[cur++] = c->execed;               // 1: execed
278
279 h = 0;
280 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) {
281  if ( c->streams[i] != -1 )
282   m->data[cur+1+h++] = c->streams[i];
283 }
284
285 m->data[cur++] = h;                       // 2: num of streams
286 cur += h;
287
288 max_len = strlen(c->name);
289
290 // TODO: add some code to check if this fits in the pkg
291 // NOTE: add this code after we are sure how long this pkg will be
292 //       and fully decieded about this function.
293
294 m->data[cur++] = max_len;
295
296 strncpy((m->data)+cur, c->name, max_len);
297
298 cur += max_len;
299
300 m->datalen = cur;
301
302 return 0;
303}
304
305int roar_ctl_m2c      (struct roar_message * m, struct roar_client * c) {
306 int i;
307 int cur;
308
309 if ( m == NULL || c == NULL )
310  return -1;
311
312 if ( m->datalen == 0 )
313  return -1;
314
315 ROAR_DBG("roar_ctl_m2c(*): got data!, len = %i", m->datalen);
316
317 if ( m->data[0] != 0 ) {
318  ROAR_DBG("roar_ctl_m2c(*): wrong version!");
319  return -1;
320 }
321
322 if ( m->datalen < 3 )
323  return -1;
324
325 ROAR_DBG("roar_ctl_m2c(*): have usable data!");
326
327 c->execed = m->data[1];
328
329 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++)
330  c->streams[i] = -1;
331
332 for (i = 0; i < m->data[2]; i++)
333  c->streams[i] = m->data[3+i];
334
335 cur = 3 + m->data[2];
336
337 strncpy(c->name, (m->data)+cur+1, m->data[cur]);
338 c->name[(int)m->data[cur]] = 0;
339
340 return 0;
341}
342
343//ll
Note: See TracBrowser for help on using the repository browser.