source: roaraudio/libroarpulse/channelmap.c @ 3456:005f7563cf6c

Last change on this file since 3456:005f7563cf6c was 3456:005f7563cf6c, checked in by phi, 10 years ago

as long as invalid, not as long as not invalid

File size: 9.2 KB
Line 
1//channelmap.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2010
5 *  The code (may) include prototypes and comments (and maybe
6 *  other code fragements) from libpulse*. They are mostly copyrighted by:
7 *  Lennart Poettering <poettering@users.sourceforge.net> and
8 *  Pierre Ossman <drzeus@drzeus.cx>
9 *
10 *  This file is part of libroarpulse a part of RoarAudio,
11 *  a cross-platform sound system for both, home and professional use.
12 *  See README for details.
13 *
14 *  This file is free software; you can redistribute it and/or modify
15 *  it under the terms of the GNU General Public License version 3
16 *  as published by the Free Software Foundation.
17 *
18 *  RoarAudio is distributed in the hope that it will be useful,
19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 *  GNU General Public License for more details.
22 *
23 *  You should have received a copy of the GNU General Public License
24 *  along with this software; see the file COPYING.  If not, write to
25 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26 *
27 *  NOTE for everyone want's to change something and send patches:
28 *  read README and HACKING! There a addition information on
29 *  the license of this document you need to read before you send
30 *  any patches.
31 *
32 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
33 *  or libpulse*:
34 *  The libs libroaresd, libroararts and libroarpulse link this libroar
35 *  and are therefore GPL. Because of this it may be illigal to use
36 *  them with any software that uses libesd, libartsc or libpulse*.
37 */
38
39#include <libroarpulse/libroarpulse.h>
40
41/** Initialize the specified channel map and return a pointer to it */
42pa_channel_map* pa_channel_map_init(pa_channel_map *m);
43
44/** Initialize the specified channel map for monoaural audio and return a pointer to it */
45pa_channel_map* pa_channel_map_init_mono(pa_channel_map *m) {
46 m->channels = 1;
47 m->map[0]   = PA_CHANNEL_POSITION_MONO;
48
49 return m;
50}
51
52/** Initialize the specified channel map for stereophonic audio and return a pointer to it */
53pa_channel_map* pa_channel_map_init_stereo(pa_channel_map *m) {
54 m->channels = 2;
55 m->map[0]   = PA_CHANNEL_POSITION_LEFT;
56 m->map[1]   = PA_CHANNEL_POSITION_RIGHT;
57
58 return m;
59}
60
61/** Initialize the specified channel map for the specified number
62 * of channels using default labels and return a pointer to it. */
63pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, pa_channel_map_def_t def) {
64 if ( m == NULL || channels == 0 )
65  return NULL;
66
67 switch (channels) {
68  case 1: return pa_channel_map_init_mono(m);   break;
69  case 2: return pa_channel_map_init_stereo(m); break;
70 }
71
72 switch (def) {
73  default:
74    return NULL;
75 }
76}
77
78static struct {
79 pa_channel_position_t pos;
80 char * name;
81} _roar_po_chanpos[] = {
82 {PA_CHANNEL_POSITION_INVALID,               "invalid"                    },
83 {PA_CHANNEL_POSITION_MONO,                  "mono"                       },
84 {PA_CHANNEL_POSITION_LEFT,                  "left"                       },
85 {PA_CHANNEL_POSITION_RIGHT,                 "right"                      },
86 {PA_CHANNEL_POSITION_CENTER,                "center"                     },
87 {PA_CHANNEL_POSITION_FRONT_LEFT,            "front-left"                 },
88 {PA_CHANNEL_POSITION_FRONT_RIGHT,           "front-right"                },
89 {PA_CHANNEL_POSITION_FRONT_CENTER,          "front-center"               },
90 {PA_CHANNEL_POSITION_REAR_CENTER,           "rear-center"                },
91 {PA_CHANNEL_POSITION_REAR_LEFT,             "rear-left"                  },
92 {PA_CHANNEL_POSITION_REAR_RIGHT,            "rear-right"                 },
93 {PA_CHANNEL_POSITION_LFE,                   "lfe"                        },
94 {PA_CHANNEL_POSITION_SUBWOOFER,             "subwoofer"                  },
95 {PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,  "front-left-of-center"       },
96 {PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, "front-right-of-center"      },
97 {PA_CHANNEL_POSITION_SIDE_LEFT,             "side-left"                  },
98 {PA_CHANNEL_POSITION_SIDE_RIGHT,            "side-right"                 },
99 {PA_CHANNEL_POSITION_AUX0,                  "aux0"                       },
100 {PA_CHANNEL_POSITION_AUX1,                  "aux1"                       },
101 {PA_CHANNEL_POSITION_AUX2,                  "aux2"                       },
102 {PA_CHANNEL_POSITION_AUX3,                  "aux3"                       },
103 {PA_CHANNEL_POSITION_AUX4,                  "aux4"                       },
104 {PA_CHANNEL_POSITION_AUX5,                  "aux5"                       },
105 {PA_CHANNEL_POSITION_AUX6,                  "aux6"                       },
106 {PA_CHANNEL_POSITION_AUX7,                  "aux7"                       },
107 {PA_CHANNEL_POSITION_AUX8,                  "aux8"                       },
108 {PA_CHANNEL_POSITION_AUX9,                  "aux9"                       },
109 {PA_CHANNEL_POSITION_AUX10,                 "aux10"                      },
110 {PA_CHANNEL_POSITION_AUX11,                 "aux11"                      },
111 {PA_CHANNEL_POSITION_AUX12,                 "aux12"                      },
112 {PA_CHANNEL_POSITION_AUX13,                 "aux13"                      },
113 {PA_CHANNEL_POSITION_AUX14,                 "aux14"                      },
114 {PA_CHANNEL_POSITION_AUX15,                 "aux15"                      },
115 {PA_CHANNEL_POSITION_AUX16,                 "aux16"                      },
116 {PA_CHANNEL_POSITION_AUX17,                 "aux17"                      },
117 {PA_CHANNEL_POSITION_AUX18,                 "aux18"                      },
118 {PA_CHANNEL_POSITION_AUX19,                 "aux19"                      },
119 {PA_CHANNEL_POSITION_AUX20,                 "aux20"                      },
120 {PA_CHANNEL_POSITION_AUX21,                 "aux21"                      },
121 {PA_CHANNEL_POSITION_AUX22,                 "aux22"                      },
122 {PA_CHANNEL_POSITION_AUX23,                 "aux23"                      },
123 {PA_CHANNEL_POSITION_AUX24,                 "aux24"                      },
124 {PA_CHANNEL_POSITION_AUX25,                 "aux25"                      },
125 {PA_CHANNEL_POSITION_AUX26,                 "aux26"                      },
126 {PA_CHANNEL_POSITION_AUX27,                 "aux27"                      },
127 {PA_CHANNEL_POSITION_AUX28,                 "aux28"                      },
128 {PA_CHANNEL_POSITION_AUX29,                 "aux29"                      },
129 {PA_CHANNEL_POSITION_AUX30,                 "aux30"                      },
130 {PA_CHANNEL_POSITION_AUX31,                 "aux31"                      },
131 {PA_CHANNEL_POSITION_TOP_CENTER,            "top-center"                 },
132 {PA_CHANNEL_POSITION_TOP_FRONT_LEFT,        "top-front-left"             },
133 {PA_CHANNEL_POSITION_TOP_FRONT_RIGHT,       "top-front-right"            },
134 {PA_CHANNEL_POSITION_TOP_FRONT_CENTER,      "top-front-center"           },
135 {PA_CHANNEL_POSITION_TOP_REAR_LEFT,         "top-rear-left"              },
136 {PA_CHANNEL_POSITION_TOP_REAR_RIGHT,        "top-rear-right"             },
137 {PA_CHANNEL_POSITION_TOP_REAR_CENTER,       "top-rear-center"            },
138 {PA_CHANNEL_POSITION_MAX,                   "max"                        },
139 {PA_CHANNEL_POSITION_INVALID, NULL}
140};
141
142/** Return a text label for the specified channel position */
143const char* pa_channel_position_to_string(pa_channel_position_t pos) {
144 int i;
145
146 for (i = 0; _roar_po_chanpos[i].name != NULL; i++)
147  if ( _roar_po_chanpos[i].pos == pos )
148   return _roar_po_chanpos[i].name;
149
150 return NULL;
151}
152
153/** The maximum length of strings returned by pa_channel_map_snprint() */
154#define PA_CHANNEL_MAP_SNPRINT_MAX 336
155
156/** Make a humand readable string from the specified channel map */
157char* pa_channel_map_snprint(char *s, size_t l, const pa_channel_map *map) {
158 const char * g;
159 char * c = s;
160 int i;
161 size_t len;
162 size_t todo = l;
163
164 if ( map == NULL || s == NULL || l == 0 )
165  return NULL;
166
167 *c = 0;
168
169 for (i = 0; i < map->channels; i++) {
170  g = pa_channel_position_to_string(map->map[i]);
171
172  if ( g == NULL )
173   return NULL;
174
175  len = strlen(g);
176
177  if ( (len + 1) < todo ) {
178   memcpy(c, g, len);
179   c[len] = ',';
180   c    += len + 1;
181   todo -= len + 1;
182  } else {
183   return NULL;
184  }
185 }
186
187 c[-1]  = 0;
188 s[l-1] = 0;
189
190 return s;
191}
192
193/** Parse a channel position list into a channel map structure. \since 0.8.1 */
194pa_channel_map *pa_channel_map_parse(pa_channel_map *map, const char *s) {
195 int i;
196 char * c;
197 size_t len;
198 pa_channel_position_t * v;
199
200 if ( map == NULL )
201  return NULL;
202
203 map->channels = 0;
204
205 if ( s == NULL )
206  return map;
207
208 while (*s != 0) {
209  c = strstr(s, ",");
210
211  if ( c == NULL ) {
212   len = strlen(s);
213  } else {
214   len = c - s;
215  }
216
217  v = &(map->map[map->channels++]);
218
219  *v = PA_CHANNEL_POSITION_INVALID;
220
221  for (i = 0; *v == PA_CHANNEL_POSITION_INVALID && _roar_po_chanpos[i].name != NULL; i++) {
222   if ( !strncasecmp(_roar_po_chanpos[i].name, s, len) && _roar_po_chanpos[i].name[len] == 0 ) {
223    *v = _roar_po_chanpos[i].pos;
224   }
225  }
226
227  if ( c == NULL ) {
228   break;
229  } else {
230   s = c + 1;
231  }
232 }
233
234 return map;
235}
236
237/** Compare two channel maps. Return 1 if both match. */
238int pa_channel_map_equal(const pa_channel_map *a, const pa_channel_map *b);
239
240/** Return non-zero of the specified channel map is considered valid */
241int pa_channel_map_valid(const pa_channel_map *map);
242
243//ll
Note: See TracBrowser for help on using the repository browser.