PulseAudio 2.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, write to the Free Software
00022   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00023   USA.
00024 ***/
00025 
00026 #include <inttypes.h>
00027 #include <limits.h>
00028 
00029 #include <pulse/cdecl.h>
00030 #include <pulse/gccmacro.h>
00031 #include <pulse/sample.h>
00032 #include <pulse/channelmap.h>
00033 #include <pulse/version.h>
00034 
00100 PA_C_DECL_BEGIN
00101 
00107 typedef uint32_t pa_volume_t;
00108 
00110 #define PA_VOLUME_NORM ((pa_volume_t) 0x10000U)
00111 
00113 #define PA_VOLUME_MUTED ((pa_volume_t) 0U)
00114 
00116 #define PA_VOLUME_MAX ((pa_volume_t) UINT32_MAX/2)
00117 
00123 #define PA_VOLUME_UI_MAX (pa_sw_volume_from_dB(+11.0))
00124 
00126 #define PA_VOLUME_INVALID ((pa_volume_t) UINT32_MAX)
00127 
00129 #define PA_VOLUME_IS_VALID(v) ((v) <= PA_VOLUME_MAX)
00130 
00132 #define PA_CLAMP_VOLUME(v) (PA_CLAMP_UNLIKELY((v), PA_VOLUME_MUTED, PA_VOLUME_MAX))
00133 
00135 typedef struct pa_cvolume {
00136     uint8_t channels;                     
00137     pa_volume_t values[PA_CHANNELS_MAX];  
00138 } pa_cvolume;
00139 
00141 int pa_cvolume_equal(const pa_cvolume *a, const pa_cvolume *b) PA_GCC_PURE;
00142 
00146 pa_cvolume* pa_cvolume_init(pa_cvolume *a);
00147 
00149 #define pa_cvolume_reset(a, n) pa_cvolume_set((a), (n), PA_VOLUME_NORM)
00150 
00152 #define pa_cvolume_mute(a, n) pa_cvolume_set((a), (n), PA_VOLUME_MUTED)
00153 
00155 pa_cvolume* pa_cvolume_set(pa_cvolume *a, unsigned channels, pa_volume_t v);
00156 
00162 #define PA_CVOLUME_SNPRINT_MAX 320
00163 
00165 char *pa_cvolume_snprint(char *s, size_t l, const pa_cvolume *c);
00166 
00172 #define PA_SW_CVOLUME_SNPRINT_DB_MAX 448
00173 
00175 char *pa_sw_cvolume_snprint_dB(char *s, size_t l, const pa_cvolume *c);
00176 
00182 #define PA_VOLUME_SNPRINT_MAX 10
00183 
00185 char *pa_volume_snprint(char *s, size_t l, pa_volume_t v);
00186 
00192 #define PA_SW_VOLUME_SNPRINT_DB_MAX 10
00193 
00195 char *pa_sw_volume_snprint_dB(char *s, size_t l, pa_volume_t v);
00196 
00198 pa_volume_t pa_cvolume_avg(const pa_cvolume *a) PA_GCC_PURE;
00199 
00205 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;
00206 
00208 pa_volume_t pa_cvolume_max(const pa_cvolume *a) PA_GCC_PURE;
00209 
00215 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;
00216 
00218 pa_volume_t pa_cvolume_min(const pa_cvolume *a) PA_GCC_PURE;
00219 
00225 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;
00226 
00228 int pa_cvolume_valid(const pa_cvolume *v) PA_GCC_PURE;
00229 
00231 int pa_cvolume_channels_equal_to(const pa_cvolume *a, pa_volume_t v) PA_GCC_PURE;
00232 
00234 #define pa_cvolume_is_muted(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_MUTED)
00235 
00237 #define pa_cvolume_is_norm(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_NORM)
00238 
00242 pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) PA_GCC_CONST;
00243 
00247 pa_cvolume *pa_sw_cvolume_multiply(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
00248 
00253 pa_cvolume *pa_sw_cvolume_multiply_scalar(pa_cvolume *dest, const pa_cvolume *a, pa_volume_t b);
00254 
00259 pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) PA_GCC_CONST;
00260 
00264 pa_cvolume *pa_sw_cvolume_divide(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
00265 
00270 pa_cvolume *pa_sw_cvolume_divide_scalar(pa_cvolume *dest, const pa_cvolume *a, pa_volume_t b);
00271 
00273 pa_volume_t pa_sw_volume_from_dB(double f) PA_GCC_CONST;
00274 
00276 double pa_sw_volume_to_dB(pa_volume_t v) PA_GCC_CONST;
00277 
00280 pa_volume_t pa_sw_volume_from_linear(double v) PA_GCC_CONST;
00281 
00283 double pa_sw_volume_to_linear(pa_volume_t v) PA_GCC_CONST;
00284 
00285 #ifdef INFINITY
00286 #define PA_DECIBEL_MININFTY ((double) -INFINITY)
00287 #else
00288 
00289 #define PA_DECIBEL_MININFTY ((double) -200.0)
00290 #endif
00291 
00293 pa_cvolume *pa_cvolume_remap(pa_cvolume *v, const pa_channel_map *from, const pa_channel_map *to);
00294 
00297 int pa_cvolume_compatible(const pa_cvolume *v, const pa_sample_spec *ss) PA_GCC_PURE;
00298 
00301 int pa_cvolume_compatible_with_channel_map(const pa_cvolume *v, const pa_channel_map *cm) PA_GCC_PURE;
00302 
00308 float pa_cvolume_get_balance(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE;
00309 
00319 pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance);
00320 
00326 float pa_cvolume_get_fade(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE;
00327 
00337 pa_cvolume* pa_cvolume_set_fade(pa_cvolume *v, const pa_channel_map *map, float new_fade);
00338 
00342 pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max);
00343 
00348 pa_cvolume* pa_cvolume_scale_mask(pa_cvolume *v, pa_volume_t max, pa_channel_map *cm, pa_channel_position_mask_t mask);
00349 
00355 pa_cvolume* pa_cvolume_set_position(pa_cvolume *cv, const pa_channel_map *map, pa_channel_position_t t, pa_volume_t v);
00356 
00361 pa_volume_t pa_cvolume_get_position(pa_cvolume *cv, const pa_channel_map *map, pa_channel_position_t t) PA_GCC_PURE;
00362 
00366 pa_cvolume* pa_cvolume_merge(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
00367 
00370 pa_cvolume* pa_cvolume_inc_clamp(pa_cvolume *v, pa_volume_t inc, pa_volume_t limit);
00371 
00374 pa_cvolume* pa_cvolume_inc(pa_cvolume *v, pa_volume_t inc);
00375 
00378 pa_cvolume* pa_cvolume_dec(pa_cvolume *v, pa_volume_t dec);
00379 
00380 PA_C_DECL_END
00381 
00382 #endif