]>
code.delx.au - pulseaudio/blob - src/pulse/volume.c
4 This file is part of PulseAudio.
6 PulseAudio 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 PulseAudio 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 PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
32 int pa_cvolume_equal(const pa_cvolume
*a
, const pa_cvolume
*b
) {
37 if (a
->channels
!= b
->channels
)
40 for (i
= 0; i
< a
->channels
; i
++)
41 if (a
->values
[i
] != b
->values
[i
])
47 pa_cvolume
* pa_cvolume_set(pa_cvolume
*a
, unsigned channels
, pa_volume_t v
) {
52 assert(channels
<= PA_CHANNELS_MAX
);
54 a
->channels
= channels
;
56 for (i
= 0; i
< a
->channels
; i
++)
62 pa_volume_t
pa_cvolume_avg(const pa_cvolume
*a
) {
67 for (i
= 0; i
< a
->channels
; i
++)
72 return (pa_volume_t
) sum
;
75 pa_volume_t
pa_sw_volume_multiply(pa_volume_t a
, pa_volume_t b
) {
76 return pa_sw_volume_from_linear(pa_sw_volume_to_linear(a
)* pa_sw_volume_to_linear(b
));
79 #define USER_DECIBEL_RANGE 30
81 pa_volume_t
pa_sw_volume_from_dB(double dB
) {
82 if (dB
<= -USER_DECIBEL_RANGE
)
83 return PA_VOLUME_MUTED
;
85 return (pa_volume_t
) ((dB
/USER_DECIBEL_RANGE
+1)*PA_VOLUME_NORM
);
88 double pa_sw_volume_to_dB(pa_volume_t v
) {
89 if (v
== PA_VOLUME_MUTED
)
90 return PA_DECIBEL_MININFTY
;
92 return ((double) v
/PA_VOLUME_NORM
-1)*USER_DECIBEL_RANGE
;
95 pa_volume_t
pa_sw_volume_from_linear(double v
) {
98 return PA_VOLUME_MUTED
;
100 if (v
> .999 && v
< 1.001)
101 return PA_VOLUME_NORM
;
103 return pa_sw_volume_from_dB(20*log10(v
));
106 double pa_sw_volume_to_linear(pa_volume_t v
) {
108 if (v
== PA_VOLUME_MUTED
)
111 return pow(10, pa_sw_volume_to_dB(v
)/20);
114 char *pa_cvolume_snprint(char *s
, size_t l
, const pa_cvolume
*c
) {
125 for (channel
= 0; channel
< c
->channels
&& l
> 1; channel
++) {
126 l
-= snprintf(e
, l
, "%s%u: %3u%%",
129 (c
->values
[channel
]*100)/PA_VOLUME_NORM
);
138 /** Return non-zero if the volume of all channels is equal to the specified value */
139 int pa_cvolume_channels_equal_to(const pa_cvolume
*a
, pa_volume_t v
) {
143 for (c
= 0; c
< a
->channels
; c
++)
144 if (a
->values
[c
] != v
)
150 pa_cvolume
*pa_sw_cvolume_multiply(pa_cvolume
*dest
, const pa_cvolume
*a
, const pa_cvolume
*b
) {
157 for (i
= 0; i
< a
->channels
&& i
< b
->channels
&& i
< PA_CHANNELS_MAX
; i
++) {
159 dest
->values
[i
] = pa_sw_volume_multiply(
160 i
< a
->channels
? a
->values
[i
] : PA_VOLUME_NORM
,
161 i
< b
->channels
? b
->values
[i
] : PA_VOLUME_NORM
);
169 int pa_cvolume_valid(const pa_cvolume
*v
) {
172 if (v
->channels
<= 0 || v
->channels
> PA_CHANNELS_MAX
)