source: roaraudio/libroar/ctl.c @ 17:411717cefded

Last change on this file since 17:411717cefded was 17:411717cefded, checked in by phi, 16 years ago

now we can change the volume, but it will not work if you set it... haha...

File size: 5.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 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
158
159// converts: *_m2*, *_*2m
160
161int roar_ctl_f2m      (struct roar_message * m, unsigned char   filter, unsigned char   cmp, uint32_t   id) {
162
163 m->datalen = 7;
164
165 m->data[0] = 0;
166 m->data[1] = filter;
167 m->data[2] = cmp;
168 *((uint32_t*)&(m->data[3])) = ROAR_HOST2NET32(id);
169
170 return 0;
171}
172int roar_ctl_m2f      (struct roar_message * m, unsigned char * filter, unsigned char * cmp, uint32_t * id) {
173
174 if ( m->datalen != 7 )
175  return -1;
176
177 if ( m->data[0] != 0 ) {
178  ROAR_ERR("roar_ctl_m2f(*): version %i not supported!", m->data[0]);
179  return -1;
180 }
181
182 *filter = m->data[1];
183 *cmp    = m->data[2];
184
185 *id = ROAR_NET2HOST32(*((uint32_t*)&(m->data[3])));
186
187 return 0;
188}
189
190int roar_ctl_ia2m     (struct roar_message * m, int * data, int len) {
191 int i;
192
193 if ( len > LIBROAR_BUFFER_MSGDATA )
194  return -1;
195
196 m->datalen = len;
197
198 for (i = 0; i < len; i++)
199  m->data[i] = data[i];
200
201 return 0;
202}
203int roar_ctl_m2ia     (struct roar_message * m, int * data, int len) {
204 int i;
205
206 if ( m->datalen > len )
207  return -1;
208
209 for (i = 0; i < m->datalen; i++)
210  data[i] = m->data[i];
211
212 return m->datalen;
213}
214
215int roar_ctl_c2m      (struct roar_message * m, struct roar_client * c) {
216 int cur = 0;
217 int h;
218 int i;
219 int max_len;
220
221 if ( c == NULL )
222  return -1;
223
224 m->data[cur++] = 0;                       // 0: Version
225 m->data[cur++] = c->execed;               // 1: execed
226
227 h = 0;
228 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) {
229  if ( c->streams[i] != -1 )
230   m->data[cur+1+h++] = c->streams[i];
231 }
232
233 m->data[cur++] = h;                       // 2: num of streams
234 cur += h;
235
236 max_len = strlen(c->name);
237
238 // TODO: add some code to check if this fits in the pkg
239 // NOTE: add this code after we are sure how long this pkg will be
240 //       and fully decieded about this function.
241
242 m->data[cur++] = max_len;
243
244 strncpy((m->data)+cur, c->name, max_len);
245
246 cur += max_len;
247
248 m->datalen = cur;
249
250 return 0;
251}
252
253int roar_ctl_m2c      (struct roar_message * m, struct roar_client * c) {
254 int i;
255 int cur;
256
257 if ( m == NULL || c == NULL )
258  return -1;
259
260 if ( m->datalen == 0 )
261  return -1;
262
263 ROAR_DBG("roar_ctl_m2c(*): got data!, len = %i", m->datalen);
264
265 if ( m->data[0] != 0 ) {
266  ROAR_DBG("roar_ctl_m2c(*): wrong version!");
267  return -1;
268 }
269
270 if ( m->datalen < 3 )
271  return -1;
272
273 ROAR_DBG("roar_ctl_m2c(*): have usable data!");
274
275 c->execed = m->data[1];
276
277 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++)
278  c->streams[i] = -1;
279
280 for (i = 0; i < m->data[2]; i++)
281  c->streams[i] = m->data[3+i];
282
283 cur = 3 + m->data[2];
284
285 strncpy(c->name, (m->data)+cur+1, m->data[cur]);
286 c->name[(int)m->data[cur]] = 0;
287
288 return 0;
289}
290
291//ll
Note: See TracBrowser for help on using the repository browser.