source: roaraudio/libroar/config.c @ 2886:a8c07cbd1368

Last change on this file since 2886:a8c07cbd1368 was 2886:a8c07cbd1368, checked in by phi, 15 years ago

added support to get a codec var, corrected small error in config parsing function

File size: 4.6 KB
Line 
1//config.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009
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, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 *  NOTE for everyone want's to change something and send patches:
24 *  read README and HACKING! There a addition information on
25 *  the license of this document you need to read before you send
26 *  any patches.
27 *
28 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
29 *  or libpulse*:
30 *  The libs libroaresd, libroararts and libroarpulse link this lib
31 *  and are therefore GPL. Because of this it may be illigal to use
32 *  them with any software that uses libesd, libartsc or libpulse*.
33 */
34
35#include "libroar.h"
36
37struct roar_libroar_config * roar_libroar_get_config_ptr(void) {
38 static struct roar_libroar_config config;
39 static int inited = 0;
40
41 if ( !inited ) {
42  memset(&config, 0, sizeof(config));
43
44  config.server = NULL;
45
46  inited++;
47 }
48
49 return &config;
50}
51
52struct roar_libroar_config * roar_libroar_get_config(void) {
53 struct roar_libroar_config * config = roar_libroar_get_config_ptr();
54 static int inited = 0;
55 char * next;
56
57 if ( !inited ) {
58  next = getenv("ROAR_OPTIONS");
59
60  if ( next != NULL ) {
61   roar_libroar_config_parse(next, " ");
62  }
63
64  inited++;
65 }
66
67 return config;
68}
69
70int    roar_libroar_config_parse(char * txt, char * delm) {
71 struct roar_libroar_config * config = roar_libroar_get_config_ptr();
72 char * k, * v, * next = txt;
73
74 while (next != NULL) {
75  k = next;
76
77  if ( delm == NULL ) {
78   // no delm -> we have only one option
79   next = NULL;
80  } else {
81   next = strstr(next, delm);
82  }
83
84  if ( next != NULL ) {
85   *next = 0;
86    next++;
87  }
88
89  if ( (v = strstr(k, ":")) != NULL ) {
90   *v = 0;
91    v++;
92  }
93
94  if ( !strcmp(k, "workaround") ) {
95   if ( !strcmp(v, "use-execed") ) {
96    config->workaround.workarounds |= ROAR_LIBROAR_CONFIG_WAS_USE_EXECED;
97   } else {
98    ROAR_WARN("roar_libroar_get_config(void): Unknown workaround option: %s", v);
99   }
100  } else if ( !strcmp(k, "warning") || !strcmp(k, "warn") ) {
101   if ( !strcmp(v, "sysio") ) {
102    config->warnings.sysio = ROAR_WARNING_ALWAYS;
103   } else {
104    ROAR_WARN("roar_libroar_get_config(void): Unknown warning option: %s", v);
105   }
106  } else {
107   ROAR_WARN("roar_libroar_get_config(void): Unknown option: %s", k);
108  }
109 }
110
111 return 0;
112}
113
114struct roar_libroar_config_codec * roar_libroar_config_codec_get(int codec, int create) {
115 struct roar_libroar_config * config = roar_libroar_get_config_ptr();
116 int i;
117 int need_new = 1;
118
119 if ( codec < 0 || create < 0 )
120  return NULL;
121
122 if ( config->codecs.num == 0 ) {
123  // no match case:
124  if ( !create )
125   return NULL;
126 } else {
127  for (i = 0; i < config->codecs.num; i++) {
128   if ( config->codecs.codec[i].codec == codec )
129    return &(config->codecs.codec[i]);
130   if ( config->codecs.codec[i].codec == -1 )
131    need_new = 0;
132  }
133 }
134
135 if ( !create )
136  return NULL;
137
138 if ( !need_new ) {
139  for (i = 0; i < config->codecs.num; i++) {
140   if ( config->codecs.codec[i].codec == -1 ) {
141    memset(&(config->codecs.codec[i]), 0, sizeof(struct roar_libroar_config_codec));
142    config->codecs.codec[i].codec = codec;
143    return &(config->codecs.codec[i]);
144   }
145  }
146 }
147
148 if ( config->codecs.num == 0 ) {
149  config->codecs.codec = malloc(16*sizeof(struct roar_libroar_config_codec));
150 } else {
151  config->codecs.codec = realloc(config->codecs.codec, (config->codecs.num+16)*sizeof(struct roar_libroar_config_codec));
152 }
153
154 if ( config->codecs.codec == NULL )
155  return NULL;
156
157 memset(&(config->codecs.codec[config->codecs.num]), 0, 16);
158 for (i = config->codecs.num; i < (config->codecs.num+16); i++) {
159  config->codecs.codec[i].codec = -1;
160 }
161
162 i = config->codecs.num;
163 config->codecs.num += 16;
164
165 return &(config->codecs.codec[i]);
166}
167
168int    roar_libroar_set_server(char * server) {
169 roar_libroar_get_config_ptr()->server = server;
170 return 0;
171}
172
173char * roar_libroar_get_server(void) {
174 return roar_libroar_get_config_ptr()->server;
175}
176
177//ll
Note: See TracBrowser for help on using the repository browser.