source: roaraudio/libroar/stream.c @ 3724:0c89cc821485

Last change on this file since 3724:0c89cc821485 was 3724:0c89cc821485, checked in by phi, 14 years ago

added additional stream roles

File size: 21.5 KB
Line 
1//stream.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008
5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 *  NOTE for everyone want's to change something and send patches:
25 *  read README and HACKING! There a addition information on
26 *  the license of this document you need to read before you send
27 *  any patches.
28 *
29 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
30 *  or libpulse*:
31 *  The libs libroaresd, libroararts and libroarpulse link this lib
32 *  and are therefore GPL. Because of this it may be illigal to use
33 *  them with any software that uses libesd, libartsc or libpulse*.
34 */
35
36#include "libroar.h"
37
38int roar_stream_connect (struct roar_connection * con, struct roar_stream * s, int dir) {
39 struct roar_libroar_config * config = roar_libroar_get_config();
40 struct roar_stream  ms;
41 struct roar_message m;
42
43 s->dir = dir;
44
45 memcpy(&ms, s, sizeof(ms));
46
47 m.cmd     = ROAR_CMD_NEW_STREAM;
48 m.stream  = -1;
49 m.pos     = 0;
50
51 if ( config != NULL ) {
52  if ( config->info.rate )
53   ms.info.rate = config->info.rate;
54  if ( config->info.bits )
55   ms.info.bits = config->info.bits;
56  if ( config->info.channels )
57   ms.info.channels = config->info.channels;
58  if ( config->info.codec )
59   ms.info.codec = config->info.codec;
60 }
61
62 roar_stream_s2m(&ms, &m);
63
64 if ( roar_req(con, &m, NULL) != 0 )
65  return -1;
66
67 if ( m.cmd == ROAR_CMD_OK ) {
68  s->id = m.stream;
69
70  ROAR_DBG("roar_stream_connect(*) = 0");
71  return 0;
72 }
73
74 ROAR_ERR("roar_stream_connect(*): Connecting new stream faild!");
75 ROAR_DBG("roar_stream_connect(*) = -1");
76 return -1;
77}
78
79int roar_stream_new (struct roar_stream * s, unsigned int rate,
80                     unsigned int channels, unsigned int bits, unsigned int codec) {
81
82 if ( s == NULL )
83  return -1;
84
85 s->fh         = -1;
86 s->id         = -1;
87 s->pos        =  0;
88 s->pos_rel_id = -1;
89
90 s->dir        = ROAR_DIR_DEFAULT;
91
92/*
93 s->datalen    = 0;
94 s->offset     = 0;
95
96 s->database   = NULL;
97 s->dataoff    = NULL;
98*/
99
100 s->info.rate     = rate;
101 s->info.channels = channels;
102 s->info.bits     = bits;
103 s->info.codec    = codec;
104
105 if ( bits > ROAR_BITS_MAX )
106  return -1;
107
108 return 0;
109}
110
111int roar_stream_set_rel_id(struct roar_stream * s, int id) {
112 if ( s == NULL )
113  return -1;
114
115 s->pos_rel_id = id;
116
117 return 0;
118}
119
120int roar_stream_get_rel_id(struct roar_stream * s) {
121 if ( s == NULL )
122  return -1;
123
124 return s->pos_rel_id;
125}
126
127int roar_stream_new_by_id(struct roar_stream * s, int id) {
128 if ( s == NULL )
129  return -1;
130
131 if ( roar_stream_new_empty(s) == -1 )
132  return -1;
133
134 return roar_stream_set_id(s, id);
135}
136
137int roar_stream_new_empty(struct roar_stream * s) {
138 if ( s == NULL )
139  return -1;
140
141 return roar_stream_new(s, 0, 0, 0, 0);
142}
143
144int roar_stream_set_id (struct roar_stream * s, int id) {
145 if ( s == NULL )
146  return -1;
147
148 s->id = id;
149
150 return 0;
151}
152
153int roar_stream_get_id (struct roar_stream * s) {
154 if ( s == NULL )
155  return -1;
156
157 return s->id;
158}
159
160int roar_stream_set_fh (struct roar_stream * s, int fh) {
161 if ( s == NULL )
162  return -1;
163
164 s->fh = fh;
165
166 return 0;
167}
168
169int roar_stream_get_fh (struct roar_stream * s) {
170 if ( s == NULL )
171  return -1;
172
173 return s->fh;
174}
175
176int roar_stream_set_dir (struct roar_stream * s, int dir) {
177 if ( s == NULL )
178  return -1;
179
180 s->dir = dir;
181
182 return 0;
183}
184
185int roar_stream_get_dir (struct roar_stream * s) {
186 if ( s == NULL )
187  return -1;
188
189 return s->dir;
190}
191
192
193int roar_stream_exec    (struct roar_connection * con, struct roar_stream * s) {
194 struct roar_message m;
195
196 m.cmd     = ROAR_CMD_EXEC_STREAM;
197 m.stream  = s->id;
198 m.datalen = 0;
199 m.pos     = 0;
200
201 if ( roar_req(con, &m, NULL) == -1 )
202  return -1;
203
204 if ( m.cmd == ROAR_CMD_OK )
205  return 0;
206 return -1;
207}
208
209int roar_stream_connect_to (struct roar_connection * con, struct roar_stream * s, int type, char * host, int port) {
210 struct roar_message m;
211
212 if ( roar_stream_connect_to_ask(con, s, type, host, port) == -1 )
213  return -1;
214
215 if ( roar_recv_message(con, &m, NULL) == -1 )
216  return -1;
217
218 if ( m.cmd == ROAR_CMD_OK )
219  return 0;
220 return -1;
221}
222
223int roar_stream_connect_to_ask (struct roar_connection * con, struct roar_stream * s, int type, char * host, int port) {
224 struct roar_message m;
225 int len = 0;
226
227 if ( host == NULL )
228  return -1;
229
230 ROAR_DBG("roar_stream_connect_to_ask(*): Ask the server to connect to: %s:%i", host, port);
231
232 m.cmd     = ROAR_CMD_CON_STREAM;
233 m.stream  = s->id;
234 m.pos     = 0;
235
236 m.data[0] = 0;
237 m.data[1] = type;
238 ((uint16_t*)&(m.data))[1] = ROAR_HOST2NET16(port);
239
240 len = strlen(host);
241
242 if ( len > 76 )
243  return -1;
244
245 strncpy(&(m.data[4]), host, len);
246
247 m.datalen = len + 4;
248
249 if ( roar_send_message(con, &m, NULL) == -1 )
250  return -1;
251
252 return 0;
253}
254
255int roar_stream_passfh  (struct roar_connection * con, struct roar_stream * s, int fh) {
256 struct roar_message m;
257 int confh;
258
259 m.cmd     = ROAR_CMD_PASSFH;
260 m.stream  = s->id;
261 m.pos     = 0;
262 m.datalen = 0;
263
264 ROAR_DBG("roar_stream_passfh(con=%p{...}, s={.id=%i,...}, fh=%i) = ?", con, s->id, fh);
265
266 if ( (confh = roar_get_connection_fh(con)) == -1 )
267  return -1;
268
269 if ( roar_send_message(con, &m, NULL) == -1 ) {
270  ROAR_DBG("roar_stream_passfh(con=%p{...}, s={.id=%i,...}, fh=%i) = -1 // can not send message", con, s->id, fh);
271  return -1;
272 }
273
274 ROAR_DBG("roar_stream_passfh(*): msg send");
275
276 if ( roar_socket_send_fh(confh, fh, NULL, 0) == -1 )
277  return -1;
278
279 ROAR_DBG("roar_stream_passfh(*): fh send");
280
281 if ( roar_recv_message(con, &m, NULL) == -1 )
282  return -1;
283
284 ROAR_DBG("roar_stream_passfh(*): mes recved");
285
286 if ( m.cmd == ROAR_CMD_OK )
287  return 0;
288
289 return -1;
290}
291
292int roar_stream_attach_simple (struct roar_connection * con, struct roar_stream * s, int client) {
293 struct roar_message m;
294 uint16_t * info = (uint16_t *) m.data;
295 int i;
296
297 m.cmd     = ROAR_CMD_ATTACH;
298 m.stream  = s->id;
299 m.pos     = 0;
300 m.datalen = 6;
301
302 info[0] = 0;
303 info[1] = ROAR_ATTACH_SIMPLE;
304 info[2] = client;
305
306 for (i = 0; i < m.datalen/2; i++) {
307  info[i] = ROAR_HOST2NET16(info[i]);
308 }
309
310 if ( roar_req(con, &m, NULL) == -1 )
311  return -1;
312
313 if ( m.cmd != ROAR_CMD_OK )
314  return -1;
315
316 return 0;
317}
318
319int roar_stream_add_data (struct roar_connection * con, struct roar_stream * s, char * data, size_t len) {
320 struct roar_message m;
321
322 m.cmd     = ROAR_CMD_ADD_DATA;
323 m.stream  = s->id;
324 m.pos     = 0;
325 m.datalen = len;
326
327// if ( roar_req(con, &m, (void**)&data) == -1 )
328//  return -1;
329 if ( roar_send_message(con, &m, data) != 0 )
330  return -1;
331
332 if ( roar_recv_message(con, &m, NULL) == -1 )
333  return -1;
334
335 if ( m.cmd == ROAR_CMD_OK )
336  return 0;
337 return -1;
338}
339
340int roar_stream_send_data (struct roar_connection * con, struct roar_stream * s, char * data, size_t len) {
341 if ( ! s )
342  return -1;
343
344 if ( s->fh == -1 ) {
345  if ( !con )
346   return -1;
347
348  if ( roar_stream_add_data(con, s, data, len) == -1 )
349   return -1;
350
351  return len;
352 }
353
354#ifdef ROAR_HAVE_IO_POSIX
355 return write(s->fh, data, len);
356#endif
357
358 return -1;
359}
360
361int roar_stream_get_info (struct roar_connection * con, struct roar_stream * s, struct roar_stream_info * info) {
362 struct roar_message m;
363 uint16_t * data = (uint16_t *) m.data;
364 int i;
365
366 m.cmd     = ROAR_CMD_GET_STREAM_PARA;
367 m.stream  = s->id;
368 m.datalen = 4;
369 m.pos     = 0;
370
371 data[0] = 0; // Version and reserved
372 data[1] = ROAR_STREAM_PARA_INFO; // stream
373
374 for (i = 0; i < m.datalen/2; i++) {
375  data[i] = ROAR_HOST2NET16(data[i]);
376 }
377
378 if ( roar_req(con, &m, NULL) == -1 )
379  return -1;
380
381 if ( m.cmd != ROAR_CMD_OK )
382  return -1;
383
384 for (i = 0; i < m.datalen/2; i++) {
385  data[i] = ROAR_NET2HOST16(data[i]);
386 }
387
388 if ( m.datalen < 7*2 )
389  return -1;
390
391 if ( data[0] != 0 || data[1] != 1 )
392  return -1;
393
394 memset(info, 0, sizeof(struct roar_stream_info));
395 info->mixer = -1;
396 info->role  = ROAR_ROLE_UNKNOWN;
397
398 info->block_size     = data[2];
399 info->pre_underruns  = data[3];
400 info->post_underruns = data[4];
401 info->codec          = data[5];
402 info->flags          = data[6];
403 info->delay          = data[7]*1000;
404
405 if ( m.datalen < 9*2 ) {
406  info->state         = ROAR_STREAMSTATE_UNKNOWN;
407  return 0;
408 } else {
409  info->state         = data[8];
410 }
411
412 if ( m.datalen < 10*2 ) {
413  return 0;
414 } else {
415  info->flags        |= ((uint32_t)data[9]) << 16;
416 }
417
418 if ( m.datalen < 11*2 ) {
419  return 0;
420 } else {
421  info->mixer         = data[10];
422 }
423
424 if ( m.datalen < 12*2 ) {
425  return 0;
426 } else {
427  info->role          = data[11];
428 }
429
430 return 0;
431}
432
433int roar_stream_get_name (struct roar_connection * con, struct roar_stream * s, char * name, size_t len) {
434 struct roar_message m;
435 uint16_t * data = (uint16_t *) m.data;
436
437 if ( con == NULL || s == NULL || name == NULL || len == 0 )
438  return -1;
439
440 name[0] = 0; // just in case...
441
442 m.cmd     = ROAR_CMD_GET_STREAM_PARA;
443 m.stream  = s->id;
444 m.datalen = 4;
445 m.pos     = 0;
446
447 data[0] = 0; // Version and reserved
448 data[1] = ROAR_STREAM_PARA_NAME; // stream
449
450 data[0] = ROAR_HOST2NET16(data[0]);
451 data[1] = ROAR_HOST2NET16(data[1]);
452
453 ROAR_DBG("roar_stream_get_name(*) = ?");
454
455 if ( roar_req(con, &m, NULL) == -1 )
456  return -1;
457
458 ROAR_DBG("roar_stream_get_name(*) = ?");
459
460 if ( m.cmd != ROAR_CMD_OK )
461  return -1;
462
463 ROAR_DBG("roar_stream_get_name(*) = ?");
464
465 if ( m.datalen < 4 )
466  return -1;
467
468 data[0] = ROAR_NET2HOST16(data[0]);
469 data[1] = ROAR_NET2HOST16(data[1]);
470
471 ROAR_DBG("roar_stream_get_name(*) = ?");
472
473 if ( data[0] != 0 || data[1] != ROAR_STREAM_PARA_NAME )
474  return -1;
475
476 m.datalen -= 4;
477
478 len--;
479
480 if ( len > m.datalen )
481  len = m.datalen;
482
483 strncpy(name, ((char*)m.data)+4, len);
484 name[len] = 0;
485
486 ROAR_DBG("roar_stream_get_name(*) = 0");
487
488 return 0;
489}
490
491int roar_stream_get_chanmap (struct roar_connection * con, struct roar_stream * s, char * map, size_t * len) {
492 struct roar_message m;
493 uint16_t * data = (uint16_t *) m.data;
494
495 ROAR_DBG("roar_stream_get_chanmap(con=%p, s=%p, map=%p, len=%p) = ?", con, s, map, len);
496
497 if ( con == NULL || s == NULL || map == NULL || len == NULL )
498  return -1;
499
500 if ( *len == 0 )
501  return -1;
502
503 memset(&m, 0, sizeof(m));
504
505 m.cmd     = ROAR_CMD_GET_STREAM_PARA;
506 m.stream  = s->id;
507 m.datalen = 2*2;
508
509 data[0] = 0; // Version and reserved
510 data[1] = ROAR_STREAM_PARA_CHANMAP;
511
512 data[0] = ROAR_HOST2NET16(data[0]);
513 data[1] = ROAR_HOST2NET16(data[1]);
514
515 if ( roar_req(con, &m, NULL) == -1 )
516  return -1;
517
518 ROAR_DBG("roar_stream_get_chanmap(con=%p, s=%p{.id=%i}, map=%p, len=%p) = ?", con, s, s->id, map, len);
519
520 if ( m.cmd != ROAR_CMD_OK )
521  return -1;
522
523 ROAR_DBG("roar_stream_get_chanmap(con=%p, s=%p{.id=%i}, map=%p, len=%p) = ?", con, s, s->id, map, len);
524
525 if ( m.datalen < 4 )
526  return -1;
527
528 data[0] = ROAR_NET2HOST16(data[0]);
529 data[1] = ROAR_NET2HOST16(data[1]);
530
531 ROAR_DBG("roar_stream_get_chanmap(con=%p, s=%p{.id=%i}, map=%p, len=%p) = ?", con, s, s->id, map, len);
532
533 if ( data[0] != 0 || data[1] != ROAR_STREAM_PARA_CHANMAP )
534  return -1;
535
536 ROAR_DBG("roar_stream_get_chanmap(con=%p, s=%p{.id=%i}, map=%p, len=%p) = ?", con, s, s->id, map, len);
537
538 m.datalen -= 4;
539
540 if ( m.datalen > *len )
541  return -1;
542
543 ROAR_DBG("roar_stream_get_chanmap(con=%p, s=%p{.id=%i}, map=%p, len=%p) = ?", con, s, s->id, map, len);
544
545 memcpy(map, &(m.data[4]), m.datalen);
546
547 *len = m.datalen;
548
549 ROAR_DBG("roar_stream_get_chanmap(con=%p, s=%p{.id=%i}, map=%p, len=%p) = 0", con, s, s->id, map, len);
550 return 0;
551}
552
553int roar_stream_set_chanmap (struct roar_connection * con, struct roar_stream * s, char * map, size_t   len) {
554 struct roar_message m;
555 uint16_t * data = (uint16_t *) m.data;
556
557 if ( con == NULL || s == NULL || map == NULL )
558  return -1;
559
560 if ( len == 0 )
561  return 0;
562
563 memset(&m, 0, sizeof(m));
564
565 m.cmd     = ROAR_CMD_SET_STREAM_PARA;
566 m.stream  = s->id;
567 m.datalen = 2*2 + len;
568
569 if ( m.datalen > sizeof(m.data) )
570  return -1;
571
572 data[0] = 0; // Version and reserved
573 data[1] = ROAR_STREAM_PARA_CHANMAP;
574
575 data[0] = ROAR_HOST2NET16(data[0]);
576 data[1] = ROAR_HOST2NET16(data[1]);
577
578 memcpy(&(m.data[4]), map, len);
579
580 if ( roar_req(con, &m, NULL) == -1 )
581  return -1;
582
583 if ( m.cmd != ROAR_CMD_OK )
584  return -1;
585
586 return 0;
587}
588
589
590int roar_stream_set_flags (struct roar_connection * con, struct roar_stream * s, int flags, int reset) {
591 struct roar_message m;
592 uint16_t * data = (uint16_t *) m.data;
593 int i;
594
595 m.cmd     = ROAR_CMD_SET_STREAM_PARA;
596 m.stream  = s->id;
597 m.datalen = 8;
598 m.pos     = 0;
599
600 data[0] = 0; // Version and reserved
601 data[1] = ROAR_STREAM_PARA_FLAGS; // flags
602 data[2] = reset == ROAR_RESET_FLAG ? ROAR_RESET_FLAG : ROAR_SET_FLAG;
603 data[3] = flags;
604
605 for (i = 0; i < m.datalen/2; i++) {
606  data[i] = ROAR_HOST2NET16(data[i]);
607 }
608
609 if ( roar_req(con, &m, NULL) == -1 )
610  return -1;
611
612 if ( m.cmd != ROAR_CMD_OK )
613  return -1;
614
615 return 0;
616}
617
618int roar_stream_set_role  (struct roar_connection * con, struct roar_stream * s, int role) {
619 struct roar_message m;
620 uint16_t * data = (uint16_t *) m.data;
621 int i;
622
623 m.cmd     = ROAR_CMD_SET_STREAM_PARA;
624 m.stream  = s->id;
625 m.datalen = 6;
626 m.pos     = 0;
627
628 data[0] = 0; // Version and reserved
629 data[1] = ROAR_STREAM_PARA_ROLE; // flags
630 data[2] = role;
631
632 for (i = 0; i < m.datalen/2; i++) {
633  data[i] = ROAR_HOST2NET16(data[i]);
634 }
635
636 if ( roar_req(con, &m, NULL) == -1 )
637  return -1;
638
639 if ( m.cmd != ROAR_CMD_OK )
640  return -1;
641
642 return 0;
643}
644
645#define _ROAR_STREAM_MESSAGE_LEN ((5+1)*4)
646
647int roar_stream_s2m     (struct roar_stream * s, struct roar_message * m) {
648 uint32_t * data;
649 int i;
650
651 if ( !(s && m) )
652  return -1;
653
654 m->datalen = _ROAR_STREAM_MESSAGE_LEN;
655 data = (uint32_t*) m->data;
656
657 data[0] = s->dir;
658 data[1] = s->pos_rel_id;
659 data[2] = s->info.rate;
660 data[3] = s->info.bits;
661 data[4] = s->info.channels;
662 data[5] = s->info.codec;
663
664 for (i = 0; i < _ROAR_STREAM_MESSAGE_LEN/4; i++)
665  data[i] = ROAR_HOST2NET32(data[i]);
666
667 ROAR_DBG("roar_stream_s2m(*): s->info:");
668 roar_debug_audio_info_print(&s->info);
669
670 m->pos = s->pos;
671
672 return 0;
673}
674int roar_stream_m2s     (struct roar_stream * s, struct roar_message * m) {
675 uint32_t * data;
676 int i;
677
678 if ( !(s && m) )
679  return -1;
680
681 if ( m->datalen != _ROAR_STREAM_MESSAGE_LEN )
682  return -1;
683
684 s->pos = m->pos;
685
686 data = (uint32_t*) m->data;
687
688 for (i = 0; i < _ROAR_STREAM_MESSAGE_LEN/4; i++)
689  data[i] = ROAR_NET2HOST32(data[i]);
690
691 s->id            = m->stream;
692 s->dir           = data[0];
693 s->pos_rel_id    = data[1];
694 s->info.rate     = data[2];
695 s->info.bits     = data[3];
696 s->info.channels = data[4];
697 s->info.codec    = data[5];
698
699 ROAR_DBG("roar_stream_m2s(*): s->info:");
700 roar_debug_audio_info_print(&s->info);
701
702 return 0;
703}
704
705// stream direction funcs:
706/*
707#define roar_dir2str(x)   ((x) == ROAR_DIR_PLAY   ? "play"   : (x) == ROAR_DIR_MONITOR ? "monitor" : \
708                           (x) == ROAR_DIR_FILTER ? "filter" : (x) == ROAR_DIR_RECORD  ? "record"  : \
709                           (x) == ROAR_DIR_OUTPUT ? "output" : (x) == ROAR_DIR_BIDIR   ? "bidir"   : \
710                           (x) == ROAR_DIR_MIXING ? "mixing" : \
711                           "unknown")
712*/
713
714struct {
715 int    dir;
716 char * name;
717} _libroar_dir[] = {
718 {ROAR_DIR_PLAY,        "play"       },
719 {ROAR_DIR_RECORD,      "record"     },
720 {ROAR_DIR_MONITOR,     "monitor"    },
721 {ROAR_DIR_FILTER,      "filter"     },
722 {ROAR_DIR_OUTPUT,      "output"     },
723 {ROAR_DIR_MIXING,      "mixing"     },
724 {ROAR_DIR_META,        "meta"       },
725 {ROAR_DIR_BIDIR,       "bidir"      },
726 {ROAR_DIR_THRU,        "thru"       },
727 {ROAR_DIR_BRIDGE,      "bridge"     },
728 {ROAR_DIR_MIDI_IN,     "midi_in"    },
729 {ROAR_DIR_MIDI_OUT,    "midi_out"   },
730 {ROAR_DIR_LIGHT_IN,    "light_in"   },
731 {ROAR_DIR_LIGHT_OUT,   "light_out"  },
732 {ROAR_DIR_RAW_IN,      "raw_in"     },
733 {ROAR_DIR_RAW_OUT,     "raw_out"    },
734 {ROAR_DIR_COMPLEX_IN,  "complex_in" },
735 {ROAR_DIR_COMPLEX_OUT, "complex_out"},
736 {ROAR_DIR_RDTCS_IN,    "rdtcs_in"   },
737 {ROAR_DIR_RDTCS_OUT,   "rdtcs_out"  },
738 {-1,                   "unknown"    }
739};
740
741char * roar_dir2str (int dir) {
742 int i;
743
744 for (i = 0; _libroar_dir[i].dir != -1; i++)
745  if ( _libroar_dir[i].dir == dir )
746   return _libroar_dir[i].name;
747
748 return _libroar_dir[i].name;
749}
750
751int roar_str2dir (char * name) {
752 int i;
753
754 for (i = 0; _libroar_dir[i].dir != -1; i++)
755  if ( !strcmp(_libroar_dir[i].name, name) )
756   return _libroar_dir[i].dir;
757
758 return _libroar_dir[i].dir;
759}
760
761// codec funcs:
762
763/*
764#define roar_codec2str(x) ((x) == ROAR_CODEC_PCM_S_LE  ? "pcm_s_le"  : (x) == ROAR_CODEC_PCM_S_BE  ? "pcm_s_be"  : \
765                           (x) == ROAR_CODEC_PCM_S_PDP ? "pcm_s_pdp" : (x) == ROAR_CODEC_MIDI_FILE ? "midi_file" : \
766                           "unknown" )
767*/
768
769struct {
770 int    codec;
771 char * name;
772} _libroar_codec[] = {
773 // PCM:
774 {ROAR_CODEC_PCM_S_LE,    "pcm_s_le"   },
775 {ROAR_CODEC_PCM_S_BE,    "pcm_s_be"   },
776 {ROAR_CODEC_PCM_S_PDP,   "pcm_s_pdp"  },
777 {ROAR_CODEC_PCM_U_LE,    "pcm_u_le"   },
778 {ROAR_CODEC_PCM_U_BE,    "pcm_u_be"   },
779 {ROAR_CODEC_PCM_U_PDP,   "pcm_u_pdp"  },
780 {ROAR_CODEC_DEFAULT,     "default"    }, // alias
781 {ROAR_CODEC_DEFAULT,     "pcm"        }, // alias
782 {ROAR_CODEC_DEFAULT,     "raw"        }, // alias
783
784 // MIDI:
785 {ROAR_CODEC_MIDI_FILE,   "midi_file"  },
786 {ROAR_CODEC_MIDI,        "midi"       },
787
788 // XIPH:
789 {ROAR_CODEC_OGG_VORBIS,  "ogg_vorbis" },
790 {ROAR_CODEC_OGG_VORBIS,  "vorbis"     }, // alias
791 {ROAR_CODEC_FLAC,        "flac"       },
792 {ROAR_CODEC_OGG_SPEEX,   "ogg_speex"  },
793 {ROAR_CODEC_OGG_SPEEX,   "speex"      }, // alias
794 {ROAR_CODEC_OGG_FLAC,    "ogg_flac"   },
795 {ROAR_CODEC_OGG_GENERAL, "ogg_general"},
796 {ROAR_CODEC_OGG_CELT,    "ogg_celt"   },
797 {ROAR_CODEC_OGG,         "ogg"        },
798 {ROAR_CODEC_ROAR_CELT,   "roar_celt"  },
799 {ROAR_CODEC_ROAR_SPEEX,  "roar_speex" },
800
801 // RAUM:
802 {ROAR_CODEC_RAUM,        "raum"       },
803 {ROAR_CODEC_RAUM_VORBIS, "raum_vorbis"},
804 {ROAR_CODEC_RAUM_FLAC,   "raum_flac"  },
805
806 // RIFF/WAVE like:
807 {ROAR_CODEC_RIFF_WAVE,   "riff_wave"  },
808 {ROAR_CODEC_RIFF_WAVE,   "wave"       }, // alias
809 {ROAR_CODEC_RIFF_WAVE,   "wav"        }, // alias
810
811 //Log codecs:
812 {ROAR_CODEC_ALAW,        "alaw"       },
813 {ROAR_CODEC_MULAW,       "mulaw"      },
814 {ROAR_CODEC_MULAW,       "ulaw"       }, // alias
815
816 // Meta Codecs:
817 {ROAR_CODEC_META_VCLT,     "meta_vclt"    },
818 {ROAR_CODEC_META_RALT,     "meta_ralt"    },
819 {ROAR_CODEC_META_RALB,     "meta_ralb"    },
820 {ROAR_CODEC_META_RALB_LE,  "meta_ralb_le" },
821 {ROAR_CODEC_META_RALB_BE,  "meta_ralb_be" },
822 {ROAR_CODEC_META_RALB_PDP, "meta_ralb_pdp"},
823
824 // light control:
825 {ROAR_CODEC_DMX512,      "dmx512"     },
826 {ROAR_CODEC_ROARDMX,     "roardmx"    },
827
828 // Radio Data and Transmitter Control System:
829 {ROAR_CODEC_RDS,         "rds"        },
830
831 // User specific:
832 {ROAR_CODEC_USER0,       "user0"      },
833 {ROAR_CODEC_USER1,       "user1"      },
834 {ROAR_CODEC_USER2,       "user2"      },
835 {ROAR_CODEC_USER3,       "user3"      },
836 {ROAR_CODEC_USER4,       "user4"      },
837 {ROAR_CODEC_USER5,       "user5"      },
838 {ROAR_CODEC_USER6,       "user6"      },
839 {ROAR_CODEC_USER7,       "user7"      },
840 {ROAR_CODEC_USER8,       "user8"      },
841 {ROAR_CODEC_USER9,       "user9"      },
842 {ROAR_CODEC_USER10,      "user10"     },
843 {ROAR_CODEC_USER11,      "user11"     },
844 {ROAR_CODEC_USER12,      "user12"     },
845 {ROAR_CODEC_USER13,      "user13"     },
846 {ROAR_CODEC_USER14,      "user14"     },
847 {ROAR_CODEC_USER15,      "user15"     },
848 {-1, NULL}
849};
850
851int roar_str2codec(char * codec) {
852 int i;
853 int guess;
854
855 if ( codec == NULL || *codec == 0 )
856  return ROAR_CODEC_DEFAULT;
857
858 if ( (guess = atoi(codec)) > 0 )
859  return guess;
860
861 if ( codec == NULL || *codec == 0 )
862  return ROAR_CODEC_DEFAULT;
863
864 for (i = 0; _libroar_codec[i].codec != -1; i++)
865  if ( strcasecmp(_libroar_codec[i].name, codec) == 0 )
866   return _libroar_codec[i].codec;
867
868 return -1;
869}
870
871
872char * roar_codec2str (int codec) {
873 int i;
874
875 for (i = 0; _libroar_codec[i].codec != -1; i++)
876  if ( _libroar_codec[i].codec == codec )
877   return _libroar_codec[i].name;
878
879 return "unknown";
880}
881
882char * roar_streamstate2str(int streamstate) {
883 switch (streamstate) {
884  case ROAR_STREAMSTATE_UNUSED:  return "unused";  break;
885  case ROAR_STREAMSTATE_INITING: return "initing"; break;
886  case ROAR_STREAMSTATE_NEW:     return "new";     break;
887  case ROAR_STREAMSTATE_OLD:     return "old";     break;
888  case ROAR_STREAMSTATE_CLOSING: return "closing"; break;
889 }
890
891 return "unknown";
892}
893
894struct {
895 int    role;
896 char * name;
897} _libroar_role[] = {
898 {ROAR_ROLE_UNKNOWN,          "unknown"         },
899 {ROAR_ROLE_NONE,             "none"            },
900 {ROAR_ROLE_MUSIC,            "music"           },
901 {ROAR_ROLE_VIDEO,            "video"           },
902 {ROAR_ROLE_GAME,             "game"            },
903 {ROAR_ROLE_EVENT,            "event"           },
904 {ROAR_ROLE_BEEP,             "beep"            },
905 {ROAR_ROLE_PHONE,            "phone"           },
906 {ROAR_ROLE_BACKGROUND_MUSIC, "background music"},
907 {ROAR_ROLE_BACKGROUND_MUSIC, "background_music"}, // alias
908 {ROAR_ROLE_VOICE,            "voice"           },
909 {ROAR_ROLE_INSTRUMENT,       "instrument"      },
910 {ROAR_ROLE_RHYTHM,           "rhythm"          },
911 {ROAR_ROLE_CLICK,            "click",          },
912 {ROAR_ROLE_MIXED,            "mixed",          },
913 {-1, NULL}
914};
915
916int    roar_str2role  (char * role) {
917 int i;
918
919 for (i = 0; _libroar_role[i].name != NULL; i++)
920  if ( !strcasecmp(_libroar_role[i].name, role) )
921   return _libroar_role[i].role;
922
923 return ROAR_ROLE_UNKNOWN;
924}
925
926char * roar_role2str  (int    role) {
927 int i;
928
929 for (i = 0; _libroar_role[i].name != NULL; i++)
930  if ( _libroar_role[i].role == role )
931   return _libroar_role[i].name;
932
933 return "unknown";
934}
935
936//ll
Note: See TracBrowser for help on using the repository browser.