|
PulseAudio
9.0
|
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