PulseAudio  9.0
volume.h
Go to the documentation of this file.
00001 #ifndef foovolumehfoo
00002 #define foovolumehfoo
00003 
00004 /***
00005   This file is part of PulseAudio.
00006 
00007   Copyright 2004-2006 Lennart Poettering
00008   Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
00009 
00010   PulseAudio is free software; you can redistribute it and/or modify
00011   it under the terms of the GNU Lesser General Public License as published
00012   by the Free Software Foundation; either version 2.1 of the License,
00013   or (at your option) any later version.
00014 
00015   PulseAudio is distributed in the hope that it will be useful, but
00016   WITHOUT ANY WARRANTY; without even the implied warranty of
00017   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00018   General Public License for more details.
00019 
00020   You should have received a copy of the GNU Lesser General Public License
00021   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
00022 ***/
00023 
00024 #include <inttypes.h>
00025 #include <limits.h>
00026 
00027 #include <pulse/cdecl.h>
00028 #include <pulse/gccmacro.h>
00029 #include <pulse/sample.h>
00030 #include <pulse/channelmap.h>
00031 #include <pulse/version.h>
00032 
00113 PA_C_DECL_BEGIN
00114 
00120 typedef uint32_t pa_volume_t;
00121 
00123 #define PA_VOLUME_NORM ((pa_volume_t) 0x10000U)
00124 
00126 #define PA_VOLUME_MUTED ((pa_volume_t) 0U)
00127 
00129 #define PA_VOLUME_MAX ((pa_volume_t) UINT32_MAX/2)
00130 
00136 #define PA_VOLUME_UI_MAX (pa_sw_volume_from_dB(+11.0))
00137 
00139 #define PA_VOLUME_INVALID ((pa_volume_t) UINT32_MAX)
00140 
00142 #define PA_VOLUME_IS_VALID(v) ((v) <= PA_VOLUME_MAX)
00143 
00145 #define PA_CLAMP_VOLUME(v) (PA_CLAMP_UNLIKELY((v), PA_VOLUME_MUTED, PA_VOLUME_MAX))
00146 
00148 typedef struct pa_cvolume {
00149     uint8_t channels;                     
00150     pa_volume_t values[PA_CHANNELS_MAX];  
00151 } pa_cvolume;
00152 
00154 int pa_cvolume_equal(const pa_cvolume *a, const pa_cvolume *b) PA_GCC_PURE;
00155 
00159 pa_cvolume* pa_cvolume_init(pa_cvolume *a);
00160 
00162 #define pa_cvolume_reset(a, n) pa_cvolume_set((a), (n), PA_VOLUME_NORM)
00163 
00165 #define pa_cvolume_mute(a, n) pa_cvolume_set((a), (n), PA_VOLUME_MUTED)
00166 
00168 pa_cvolume* pa_cvolume_set(pa_cvolume *a, unsigned channels, pa_volume_t v);
00169 
00175 #define PA_CVOLUME_SNPRINT_MAX 320
00176 
00178 char *pa_cvolume_snprint(char *s, size_t l, const pa_cvolume *c);
00179 
00185 #define PA_SW_CVOLUME_SNPRINT_DB_MAX 448
00186 
00188 char *pa_sw_cvolume_snprint_dB(char *s, size_t l, const pa_cvolume *c);
00189 
00194 #define PA_CVOLUME_SNPRINT_VERBOSE_MAX 1984
00195 
00200 char *pa_cvolume_snprint_verbose(char *s, size_t l, const pa_cvolume *c, const pa_channel_map *map, int print_dB);
00201 
00207 #define PA_VOLUME_SNPRINT_MAX 10
00208 
00210 char *pa_volume_snprint(char *s, size_t l, pa_volume_t v);
00211 
00217 #define PA_SW_VOLUME_SNPRINT_DB_MAX 11
00218 
00220 char *pa_sw_volume_snprint_dB(char *s, size_t l, pa_volume_t v);
00221 
00226 #define PA_VOLUME_SNPRINT_VERBOSE_MAX 35
00227 
00231 char *pa_volume_snprint_verbose(char *s, size_t l, pa_volume_t v, int print_dB);
00232 
00234 pa_volume_t pa_cvolume_avg(const pa_cvolume *a) PA_GCC_PURE;
00235 
00241 pa_volume_t pa_cvolume_avg_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE;
00242 
00244 pa_volume_t pa_cvolume_max(const pa_cvolume *a) PA_GCC_PURE;
00245 
00251 pa_volume_t pa_cvolume_max_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE;
00252 
00254 pa_volume_t pa_cvolume_min(const pa_cvolume *a) PA_GCC_PURE;
00255 
00261 pa_volume_t pa_cvolume_min_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE;
00262 
00264 int pa_cvolume_valid(const pa_cvolume *v) PA_GCC_PURE;
00265 
00267 int pa_cvolume_channels_equal_to(const pa_cvolume *a, pa_volume_t v) PA_GCC_PURE;
00268 
00270 #define pa_cvolume_is_muted(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_MUTED)
00271 
00273 #define pa_cvolume_is_norm(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_NORM)
00274 
00278 pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) PA_GCC_CONST;
00279 
00283 pa_cvolume *pa_sw_cvolume_multiply(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
00284 
00289 pa_cvolume *pa_sw_cvolume_multiply_scalar(pa_cvolume *dest, const pa_cvolume *a, pa_volume_t b);
00290 
00295 pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) PA_GCC_CONST;
00296 
00300 pa_cvolume *pa_sw_cvolume_divide(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
00301 
00306 pa_cvolume *pa_sw_cvolume_divide_scalar(pa_cvolume *dest, const pa_cvolume *a, pa_volume_t b);
00307 
00309 pa_volume_t pa_sw_volume_from_dB(double f) PA_GCC_CONST;
00310 
00312 double pa_sw_volume_to_dB(pa_volume_t v) PA_GCC_CONST;
00313 
00316 pa_volume_t pa_sw_volume_from_linear(double v) PA_GCC_CONST;
00317 
00319 double pa_sw_volume_to_linear(pa_volume_t v) PA_GCC_CONST;
00320 
00321 #ifdef INFINITY
00322 #define PA_DECIBEL_MININFTY ((double) -INFINITY)
00323 #else
00324 
00325 #define PA_DECIBEL_MININFTY ((double) -200.0)
00326 #endif
00327 
00329 pa_cvolume *pa_cvolume_remap(pa_cvolume *v, const pa_channel_map *from, const pa_channel_map *to);
00330 
00333 int pa_cvolume_compatible(const pa_cvolume *v, const pa_sample_spec *ss) PA_GCC_PURE;
00334 
00337 int pa_cvolume_compatible_with_channel_map(const pa_cvolume *v, const pa_channel_map *cm) PA_GCC_PURE;
00338 
00344 float pa_cvolume_get_balance(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE;
00345 
00355 pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance);
00356 
00362 float pa_cvolume_get_fade(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE;
00363 
00373 pa_cvolume* pa_cvolume_set_fade(pa_cvolume *v, const pa_channel_map *map, float new_fade);
00374 
00380 float pa_cvolume_get_lfe_balance(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE;
00381 
00391 pa_cvolume* pa_cvolume_set_lfe_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance);
00392 
00396 pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max);
00397 
00402 pa_cvolume* pa_cvolume_scale_mask(pa_cvolume *v, pa_volume_t max, pa_channel_map *cm, pa_channel_position_mask_t mask);
00403 
00409 pa_cvolume* pa_cvolume_set_position(pa_cvolume *cv, const pa_channel_map *map, pa_channel_position_t t, pa_volume_t v);
00410 
00415 pa_volume_t pa_cvolume_get_position(pa_cvolume *cv, const pa_channel_map *map, pa_channel_position_t t) PA_GCC_PURE;
00416 
00420 pa_cvolume* pa_cvolume_merge(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
00421 
00424 pa_cvolume* pa_cvolume_inc_clamp(pa_cvolume *v, pa_volume_t inc, pa_volume_t limit);
00425 
00428 pa_cvolume* pa_cvolume_inc(pa_cvolume *v, pa_volume_t inc);
00429 
00432 pa_cvolume* pa_cvolume_dec(pa_cvolume *v, pa_volume_t dec);
00433 
00434 PA_C_DECL_END
00435 
00436 #endif