2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2.1 of the License,
10 or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
31 #include <pulse/timeval.h>
32 #include <pulse/i18n.h>
34 #include <pulsecore/core-util.h>
35 #include <pulsecore/macro.h>
39 size_t pa_sample_size_of_format(pa_sample_format_t f) {
41 static const size_t table[] = {
45 [PA_SAMPLE_S16LE] = 2,
46 [PA_SAMPLE_S16BE] = 2,
47 [PA_SAMPLE_FLOAT32LE] = 4,
48 [PA_SAMPLE_FLOAT32BE] = 4,
49 [PA_SAMPLE_S32LE] = 4,
50 [PA_SAMPLE_S32BE] = 4,
51 [PA_SAMPLE_S24LE] = 3,
52 [PA_SAMPLE_S24BE] = 3,
53 [PA_SAMPLE_S24_32LE] = 4,
54 [PA_SAMPLE_S24_32BE] = 4
58 pa_assert(f < PA_SAMPLE_MAX);
63 size_t pa_sample_size(const pa_sample_spec *spec) {
66 pa_return_val_if_fail(pa_sample_spec_valid(spec), 0);
68 return pa_sample_size_of_format(spec->format);
71 size_t pa_frame_size(const pa_sample_spec *spec) {
73 pa_return_val_if_fail(pa_sample_spec_valid(spec), 0);
75 return pa_sample_size(spec) * spec->channels;
78 size_t pa_bytes_per_second(const pa_sample_spec *spec) {
80 pa_return_val_if_fail(pa_sample_spec_valid(spec), 0);
82 return spec->rate*pa_frame_size(spec);
85 pa_usec_t pa_bytes_to_usec(uint64_t length, const pa_sample_spec *spec) {
87 pa_return_val_if_fail(pa_sample_spec_valid(spec), 0);
89 return (((pa_usec_t) (length / pa_frame_size(spec)) * PA_USEC_PER_SEC) / spec->rate);
92 size_t pa_usec_to_bytes(pa_usec_t t, const pa_sample_spec *spec) {
94 pa_return_val_if_fail(pa_sample_spec_valid(spec), 0);
96 return (size_t) (((t * spec->rate) / PA_USEC_PER_SEC)) * pa_frame_size(spec);
99 pa_sample_spec* pa_sample_spec_init(pa_sample_spec *spec) {
102 spec->format = PA_SAMPLE_INVALID;
109 int pa_sample_spec_valid(const pa_sample_spec *spec) {
112 if (spec->rate <= 0 ||
113 spec->rate > PA_RATE_MAX ||
114 spec->channels <= 0 ||
115 spec->channels > PA_CHANNELS_MAX ||
116 spec->format >= PA_SAMPLE_MAX ||
123 int pa_sample_spec_equal(const pa_sample_spec*a, const pa_sample_spec*b) {
127 pa_return_val_if_fail(pa_sample_spec_valid(a), 0);
128 pa_return_val_if_fail(pa_sample_spec_valid(b), 0);
131 (a->format == b->format) &&
132 (a->rate == b->rate) &&
133 (a->channels == b->channels);
136 const char *pa_sample_format_to_string(pa_sample_format_t f) {
137 static const char* const table[]= {
138 [PA_SAMPLE_U8] = "u8",
139 [PA_SAMPLE_ALAW] = "aLaw",
140 [PA_SAMPLE_ULAW] = "uLaw",
141 [PA_SAMPLE_S16LE] = "s16le",
142 [PA_SAMPLE_S16BE] = "s16be",
143 [PA_SAMPLE_FLOAT32LE] = "float32le",
144 [PA_SAMPLE_FLOAT32BE] = "float32be",
145 [PA_SAMPLE_S32LE] = "s32le",
146 [PA_SAMPLE_S32BE] = "s32be",
147 [PA_SAMPLE_S24LE] = "s24le",
148 [PA_SAMPLE_S24BE] = "s24be",
149 [PA_SAMPLE_S24_32LE] = "s24-32le",
150 [PA_SAMPLE_S24_32BE] = "s24-32be",
153 if (f < 0 || f >= PA_SAMPLE_MAX)
159 char *pa_sample_spec_snprint(char *s, size_t l, const pa_sample_spec *spec) {
166 if (!pa_sample_spec_valid(spec))
167 pa_snprintf(s, l, _("(invalid)"));
169 pa_snprintf(s, l, _("%s %uch %uHz"), pa_sample_format_to_string(spec->format), spec->channels, spec->rate);
174 char* pa_bytes_snprint(char *s, size_t l, unsigned v) {
180 if (v >= ((unsigned) 1024)*1024*1024)
181 pa_snprintf(s, l, _("%0.1f GiB"), ((double) v)/1024/1024/1024);
182 else if (v >= ((unsigned) 1024)*1024)
183 pa_snprintf(s, l, _("%0.1f MiB"), ((double) v)/1024/1024);
184 else if (v >= (unsigned) 1024)
185 pa_snprintf(s, l, _("%0.1f KiB"), ((double) v)/1024);
187 pa_snprintf(s, l, _("%u B"), (unsigned) v);
192 pa_sample_format_t pa_parse_sample_format(const char *format) {
195 if (strcasecmp(format, "s16le") == 0)
196 return PA_SAMPLE_S16LE;
197 else if (strcasecmp(format, "s16be") == 0)
198 return PA_SAMPLE_S16BE;
199 else if (strcasecmp(format, "s16ne") == 0 || strcasecmp(format, "s16") == 0 || strcasecmp(format, "16") == 0)
200 return PA_SAMPLE_S16NE;
201 else if (strcasecmp(format, "s16re") == 0)
202 return PA_SAMPLE_S16RE;
203 else if (strcasecmp(format, "u8") == 0 || strcasecmp(format, "8") == 0)
205 else if (strcasecmp(format, "float32") == 0 || strcasecmp(format, "float32ne") == 0 || strcasecmp(format, "float") == 0)
206 return PA_SAMPLE_FLOAT32NE;
207 else if (strcasecmp(format, "float32re") == 0)
208 return PA_SAMPLE_FLOAT32RE;
209 else if (strcasecmp(format, "float32le") == 0)
210 return PA_SAMPLE_FLOAT32LE;
211 else if (strcasecmp(format, "float32be") == 0)
212 return PA_SAMPLE_FLOAT32BE;
213 else if (strcasecmp(format, "ulaw") == 0 || strcasecmp(format, "mulaw") == 0)
214 return PA_SAMPLE_ULAW;
215 else if (strcasecmp(format, "alaw") == 0)
216 return PA_SAMPLE_ALAW;
217 else if (strcasecmp(format, "s32le") == 0)
218 return PA_SAMPLE_S32LE;
219 else if (strcasecmp(format, "s32be") == 0)
220 return PA_SAMPLE_S32BE;
221 else if (strcasecmp(format, "s32ne") == 0 || strcasecmp(format, "s32") == 0 || strcasecmp(format, "32") == 0)
222 return PA_SAMPLE_S32NE;
223 else if (strcasecmp(format, "s32re") == 0)
224 return PA_SAMPLE_S24RE;
225 else if (strcasecmp(format, "s24le") == 0)
226 return PA_SAMPLE_S24LE;
227 else if (strcasecmp(format, "s24be") == 0)
228 return PA_SAMPLE_S24BE;
229 else if (strcasecmp(format, "s24ne") == 0 || strcasecmp(format, "s24") == 0 || strcasecmp(format, "24") == 0)
230 return PA_SAMPLE_S24NE;
231 else if (strcasecmp(format, "s24re") == 0)
232 return PA_SAMPLE_S24RE;
233 else if (strcasecmp(format, "s24-32le") == 0)
234 return PA_SAMPLE_S24_32LE;
235 else if (strcasecmp(format, "s24-32be") == 0)
236 return PA_SAMPLE_S24_32BE;
237 else if (strcasecmp(format, "s24-32ne") == 0 || strcasecmp(format, "s24-32") == 0)
238 return PA_SAMPLE_S24_32NE;
239 else if (strcasecmp(format, "s24-32re") == 0)
240 return PA_SAMPLE_S24_32RE;
245 int pa_sample_format_is_le(pa_sample_format_t f) {
246 pa_assert(f >= PA_SAMPLE_U8);
247 pa_assert(f < PA_SAMPLE_MAX);
250 case PA_SAMPLE_S16LE:
251 case PA_SAMPLE_S24LE:
252 case PA_SAMPLE_S32LE:
253 case PA_SAMPLE_S24_32LE:
254 case PA_SAMPLE_FLOAT32LE:
257 case PA_SAMPLE_S16BE:
258 case PA_SAMPLE_S24BE:
259 case PA_SAMPLE_S32BE:
260 case PA_SAMPLE_S24_32BE:
261 case PA_SAMPLE_FLOAT32BE:
269 int pa_sample_format_is_be(pa_sample_format_t f) {
272 if ((r = pa_sample_format_is_le(f)) < 0)