source: roaraudio/libroar/stream.c @ 465:82fd66e50dc3

Last change on this file since 465:82fd66e50dc3 was 465:82fd66e50dc3, checked in by phi, 16 years ago

added support to get the size of optimal read() and write()s

File size: 4.5 KB
Line 
1//stream.c:
2
3#include "libroar.h"
4
5int roar_stream_connect (struct roar_connection * con, struct roar_stream * s, int dir) {
6 struct roar_message m;
7
8 s->dir = dir;
9
10 m.cmd     = ROAR_CMD_NEW_STREAM;
11 m.stream  = -1;
12 m.pos     = 0;
13
14 roar_stream_s2m(s, &m);
15
16 if ( roar_req(con, &m, NULL) != 0 )
17  return -1;
18
19 if ( m.cmd == ROAR_CMD_OK ) {
20  s->id = m.stream;
21
22  ROAR_DBG("roar_stream_connect(*) = 0");
23  return 0;
24 }
25
26 ROAR_ERR("roar_stream_connect(*): Connecting new stream faild!");
27 ROAR_DBG("roar_stream_connect(*) = -1");
28 return -1;
29}
30
31int roar_stream_new (struct roar_stream * s, unsigned int rate,
32                     unsigned int channels, unsigned int bits, unsigned int codec) {
33
34
35 s->fh         = -1;
36 s->id         = -1;
37 s->pos        = 0;
38 s->pos_rel_id = -1;
39
40 s->dir        = ROAR_DIR_DEFAULT;
41
42 s->datalen    = 0;
43 s->offset     = 0;
44
45 s->database   = NULL;
46 s->dataoff    = NULL;
47
48 s->info.rate     = rate;
49 s->info.channels = channels;
50 s->info.bits     = bits;
51 s->info.codec    = codec;
52
53 if ( bits > ROAR_BITS_MAX )
54  return -1;
55
56 return 0;
57}
58
59int roar_stream_exec    (struct roar_connection * con, struct roar_stream * s) {
60 struct roar_message m;
61
62 m.cmd     = ROAR_CMD_EXEC_STREAM;
63 m.stream  = s->id;
64 m.datalen = 0;
65 m.pos     = 0;
66
67 if ( roar_req(con, &m, NULL) == -1 )
68  return -1;
69
70 if ( m.cmd == ROAR_CMD_OK )
71  return 0;
72 return -1;
73}
74
75int roar_stream_connect_to (struct roar_connection * con, struct roar_stream * s, int type, char * host, int port) {
76 struct roar_message m;
77
78 if ( roar_stream_connect_to_ask(con, s, type, host, port) == -1 )
79  return -1;
80
81 if ( roar_recv_message(con, &m, NULL) == -1 )
82  return -1;
83
84 if ( m.cmd == ROAR_CMD_OK )
85  return 0;
86 return -1;
87}
88
89int roar_stream_connect_to_ask (struct roar_connection * con, struct roar_stream * s, int type, char * host, int port) {
90 struct roar_message m;
91 int len = 0;
92
93 if ( host == NULL )
94  return -1;
95
96 m.cmd     = ROAR_CMD_CON_STREAM;
97 m.stream  = s->id;
98 m.pos     = 0;
99
100 m.data[0] = 0;
101 m.data[1] = type;
102 ((uint16_t*)&(m.data))[1] = ROAR_HOST2NET16(port);
103
104 len = strlen(host);
105
106 if ( len > 76 )
107  return -1;
108
109 strncpy(&(m.data[4]), host, len);
110
111 m.datalen = len + 4;
112
113 if ( roar_send_message(con, &m, NULL) == -1 )
114  return -1;
115
116 return 0;
117}
118
119int roar_stream_add_data (struct roar_connection * con, struct roar_stream * s, char * data, size_t len) {
120 struct roar_message m;
121
122 m.cmd     = ROAR_CMD_ADD_DATA;
123 m.stream  = s->id;
124 m.pos     = 0;
125 m.datalen = len;
126
127// if ( roar_req(con, &m, (void**)&data) == -1 )
128//  return -1;
129 if ( roar_send_message(con, &m, data) != 0 )
130  return -1;
131
132 if ( roar_recv_message(con, &m, NULL) == -1 )
133  return -1;
134
135 if ( m.cmd == ROAR_CMD_OK )
136  return 0;
137 return -1;
138}
139
140int roar_stream_get_info (struct roar_connection * con, struct roar_stream * s, struct roar_stream_info * info) {
141 struct roar_message m;
142 uint16_t * data = (uint16_t *) m.data;
143 int i;
144
145 m.cmd     = ROAR_CMD_GET_STREAM_PARA;
146 m.stream  = s->id;
147 m.datalen = 4;
148 m.pos     = 0;
149
150 data[0] = 0; // Version and reserved
151 data[1] = 1; // stream
152
153 for (i = 0; i < m.datalen/2; i++) {
154  data[i] = ROAR_HOST2NET16(data[i]);
155 }
156
157 if ( roar_req(con, &m, NULL) == -1 )
158  return -1;
159
160 if ( m.cmd != ROAR_CMD_OK )
161  return -1;
162
163 for (i = 0; i < m.datalen/2; i++) {
164  data[i] = ROAR_NET2HOST16(data[i]);
165 }
166
167 if ( m.datalen < 3*2 )
168  return -1;
169
170 if ( data[0] != 0 || data[1] != 1 )
171  return -1;
172
173 info->block_size = data[2];
174
175 return 0;
176}
177
178#define _ROAR_STREAM_MESSAGE_LEN ((5+1)*4)
179
180int roar_stream_s2m     (struct roar_stream * s, struct roar_message * m) {
181 uint32_t * data;
182 int i;
183
184 if ( !(s && m) )
185  return -1;
186
187 m->datalen = _ROAR_STREAM_MESSAGE_LEN;
188 data = (uint32_t*) m->data;
189
190 data[0] = s->dir;
191 data[1] = s->pos_rel_id;
192 data[2] = s->info.rate;
193 data[3] = s->info.bits;
194 data[4] = s->info.channels;
195 data[5] = s->info.codec;
196
197 for (i = 0; i < _ROAR_STREAM_MESSAGE_LEN/4; i++)
198  data[i] = ROAR_HOST2NET32(data[i]);
199
200 ROAR_DBG("roar_stream_s2m(*): s->info:");
201 roar_debug_audio_info_print(&s->info);
202
203 return 0;
204}
205int roar_stream_m2s     (struct roar_stream * s, struct roar_message * m) {
206 uint32_t * data;
207 int i;
208
209 if ( !(s && m) )
210  return -1;
211
212 if ( m->datalen != _ROAR_STREAM_MESSAGE_LEN )
213  return -1;
214
215 data = (uint32_t*) m->data;
216
217 for (i = 0; i < _ROAR_STREAM_MESSAGE_LEN/4; i++)
218  data[i] = ROAR_NET2HOST32(data[i]);
219
220 s->id            = m->stream;
221 s->dir           = data[0];
222 s->pos_rel_id    = data[1];
223 s->info.rate     = data[2];
224 s->info.bits     = data[3];
225 s->info.channels = data[4];
226 s->info.codec    = data[5];
227
228 ROAR_DBG("roar_stream_m2s(*): s->info:");
229 roar_debug_audio_info_print(&s->info);
230
231 return 0;
232}
233
234//ll
Note: See TracBrowser for help on using the repository browser.