]>
code.delx.au - pulseaudio/blob - src/pulse/volume.c
2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
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
29 #include <pulsecore/core-util.h>
30 #include <pulsecore/macro.h>
34 int pa_cvolume_equal(const pa_cvolume
*a
, const pa_cvolume
*b
) {
39 if (a
->channels
!= b
->channels
)
42 for (i
= 0; i
< a
->channels
; i
++)
43 if (a
->values
[i
] != b
->values
[i
])
49 pa_cvolume
* pa_cvolume_set(pa_cvolume
*a
, unsigned channels
, pa_volume_t v
) {
53 pa_assert(channels
> 0);
54 pa_assert(channels
<= PA_CHANNELS_MAX
);
56 a
->channels
= channels
;
58 for (i
= 0; i
< a
->channels
; i
++)
64 pa_volume_t
pa_cvolume_avg(const pa_cvolume
*a
) {
69 for (i
= 0; i
< a
->channels
; i
++)
74 return (pa_volume_t
) sum
;
77 pa_volume_t
pa_sw_volume_multiply(pa_volume_t a
, pa_volume_t b
) {
78 return pa_sw_volume_from_linear(pa_sw_volume_to_linear(a
)* pa_sw_volume_to_linear(b
));
81 #define USER_DECIBEL_RANGE 60
83 pa_volume_t
pa_sw_volume_from_dB(double dB
) {
84 if (isinf(dB
) < 0 || dB
<= -USER_DECIBEL_RANGE
)
85 return PA_VOLUME_MUTED
;
87 return (pa_volume_t
) ((dB
/USER_DECIBEL_RANGE
+1)*PA_VOLUME_NORM
);
90 double pa_sw_volume_to_dB(pa_volume_t v
) {
91 if (v
== PA_VOLUME_MUTED
)
92 return PA_DECIBEL_MININFTY
;
94 return ((double) v
/PA_VOLUME_NORM
-1)*USER_DECIBEL_RANGE
;
97 pa_volume_t
pa_sw_volume_from_linear(double v
) {
100 return PA_VOLUME_MUTED
;
102 if (v
> .999 && v
< 1.001)
103 return PA_VOLUME_NORM
;
105 return pa_sw_volume_from_dB(20*log10(v
));
108 double pa_sw_volume_to_linear(pa_volume_t v
) {
110 if (v
== PA_VOLUME_MUTED
)
113 return pow(10, pa_sw_volume_to_dB(v
)/20);
116 char *pa_cvolume_snprint(char *s
, size_t l
, const pa_cvolume
*c
) {
127 for (channel
= 0; channel
< c
->channels
&& l
> 1; channel
++) {
128 l
-= pa_snprintf(e
, l
, "%s%u: %3u%%",
131 (c
->values
[channel
]*100)/PA_VOLUME_NORM
);
140 /** Return non-zero if the volume of all channels is equal to the specified value */
141 int pa_cvolume_channels_equal_to(const pa_cvolume
*a
, pa_volume_t v
) {
145 for (c
= 0; c
< a
->channels
; c
++)
146 if (a
->values
[c
] != v
)
152 pa_cvolume
*pa_sw_cvolume_multiply(pa_cvolume
*dest
, const pa_cvolume
*a
, const pa_cvolume
*b
) {
159 for (i
= 0; i
< a
->channels
&& i
< b
->channels
&& i
< PA_CHANNELS_MAX
; i
++) {
161 dest
->values
[i
] = pa_sw_volume_multiply(
162 i
< a
->channels
? a
->values
[i
] : PA_VOLUME_NORM
,
163 i
< b
->channels
? b
->values
[i
] : PA_VOLUME_NORM
);
171 int pa_cvolume_valid(const pa_cvolume
*v
) {
174 if (v
->channels
<= 0 || v
->channels
> PA_CHANNELS_MAX
)