]>
code.delx.au - pulseaudio/blob - polyp/sample.c
4 This file is part of polypaudio.
6 polypaudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2 of the License,
9 or (at your option) any later version.
11 polypaudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with polypaudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
33 size_t pa_frame_size(const struct pa_sample_spec
*spec
) {
37 switch (spec
->format
) {
47 case PA_SAMPLE_FLOAT32LE
:
48 case PA_SAMPLE_FLOAT32BE
:
55 return b
* spec
->channels
;
58 size_t pa_bytes_per_second(const struct pa_sample_spec
*spec
) {
60 return spec
->rate
*pa_frame_size(spec
);
63 pa_usec_t
pa_bytes_to_usec(uint64_t length
, const struct pa_sample_spec
*spec
) {
66 return (pa_usec_t
) (((double) length
/pa_frame_size(spec
)*1000000)/spec
->rate
);
69 int pa_sample_spec_valid(const struct pa_sample_spec
*spec
) {
72 if (spec
->rate
<= 0 || spec
->channels
<= 0)
75 if (spec
->format
>= PA_SAMPLE_MAX
|| spec
->format
< 0)
81 int pa_sample_spec_equal(const struct pa_sample_spec
*a
, const struct pa_sample_spec
*b
) {
84 return (a
->format
== b
->format
) && (a
->rate
== b
->rate
) && (a
->channels
== b
->channels
);
87 void pa_sample_spec_snprint(char *s
, size_t l
, const struct pa_sample_spec
*spec
) {
88 static const char* const table
[]= {
89 [PA_SAMPLE_U8
] = "U8",
90 [PA_SAMPLE_ALAW
] = "ALAW",
91 [PA_SAMPLE_ULAW
] = "ULAW",
92 [PA_SAMPLE_S16LE
] = "S16LE",
93 [PA_SAMPLE_S16BE
] = "S16BE",
94 [PA_SAMPLE_FLOAT32LE
] = "FLOAT32LE",
95 [PA_SAMPLE_FLOAT32BE
] = "FLOAT32BE",
98 if (!pa_sample_spec_valid(spec
)) {
99 snprintf(s
, l
, "Invalid");
103 snprintf(s
, l
, "%s %uch %uHz", table
[spec
->format
], spec
->channels
, spec
->rate
);
106 pa_volume_t
pa_volume_multiply(pa_volume_t a
, pa_volume_t b
) {
111 return (pa_volume_t
) p
;
114 pa_volume_t
pa_volume_from_dB(double f
) {
115 if (f
<= PA_DECIBEL_MININFTY
)
116 return PA_VOLUME_MUTED
;
118 return (pa_volume_t
) (pow(10, f
/20)*PA_VOLUME_NORM
);
121 double pa_volume_to_dB(pa_volume_t v
) {
122 if (v
== PA_VOLUME_MUTED
)
123 return PA_DECIBEL_MININFTY
;
125 return 20*log10((double) v
/PA_VOLUME_NORM
);
128 #define USER_DECIBEL_RANGE 30
130 double pa_volume_to_user(pa_volume_t v
) {
131 double dB
= pa_volume_to_dB(v
);
133 return dB
< -USER_DECIBEL_RANGE
? 0 : dB
/USER_DECIBEL_RANGE
+1;
136 pa_volume_t
pa_volume_from_user(double v
) {
139 return PA_VOLUME_MUTED
;
141 return pa_volume_from_dB((v
-1)*USER_DECIBEL_RANGE
);
144 void pa_bytes_snprint(char *s
, size_t l
, unsigned v
) {
145 if (v
>= ((unsigned) 1024)*1024*1024)
146 snprintf(s
, l
, "%0.1f GB", ((double) v
)/1024/1024/1024);
147 else if (v
>= ((unsigned) 1024)*1024)
148 snprintf(s
, l
, "%0.1f MB", ((double) v
)/1024/1024);
149 else if (v
>= (unsigned) 1024)
150 snprintf(s
, l
, "%0.1f KB", ((double) v
)/1024);
152 snprintf(s
, l
, "%u B", (unsigned) v
);
155 enum pa_sample_format
pa_parse_sample_format(const char *format
) {
157 if (strcmp(format
, "s16le") == 0)
158 return PA_SAMPLE_S16LE
;
159 else if (strcmp(format
, "s16be") == 0)
160 return PA_SAMPLE_S16BE
;
161 else if (strcmp(format
, "s16ne") == 0 || strcmp(format
, "s16") == 0 || strcmp(format
, "16") == 0)
162 return PA_SAMPLE_S16NE
;
163 else if (strcmp(format
, "u8") == 0 || strcmp(format
, "8") == 0)
165 else if (strcmp(format
, "float32") == 0 || strcmp(format
, "float32ne") == 0)
166 return PA_SAMPLE_FLOAT32
;
167 else if (strcmp(format
, "float32le") == 0)
168 return PA_SAMPLE_FLOAT32LE
;
169 else if (strcmp(format
, "float32be") == 0)
170 return PA_SAMPLE_FLOAT32BE
;
171 else if (strcmp(format
, "ulaw") == 0)
172 return PA_SAMPLE_ULAW
;
173 else if (strcmp(format
, "alaw") == 0)
174 return PA_SAMPLE_ALAW
;