1#ifndef foovolumehfoo 2#define foovolumehfoo 3 4/*** 5 This file is part of PulseAudio. 6 7 Copyright 2004-2006 Lennart Poettering 8 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB 9 10 PulseAudio is free software; you can redistribute it and/or modify 11 it under the terms of the GNU Lesser General Public License as published 12 by the Free Software Foundation; either version 2.1 of the License, 13 or (at your option) any later version. 14 15 PulseAudio is distributed in the hope that it will be useful, but 16 WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 General Public License for more details. 19 20 You should have received a copy of the GNU Lesser General Public License 21 along with PulseAudio; if not, write to the Free Software 22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 23 USA. 24***/ 25 26#include <inttypes.h> 27#include <limits.h> 28 29#include <pulse/cdecl.h> 30#include <pulse/gccmacro.h> 31#include <pulse/sample.h> 32#include <pulse/channelmap.h> 33#include <pulse/version.h> 34 35/** \page volume Volume Control 36 * 37 * \section overv_sec Overview 38 * 39 * Sinks, sources, sink inputs and samples can all have their own volumes. 40 * To deal with these, The PulseAudio library contains a number of functions 41 * that ease handling. 42 * 43 * The basic volume type in PulseAudio is the \ref pa_volume_t type. Most of 44 * the time, applications will use the aggregated pa_cvolume structure that 45 * can store the volume of all channels at once. 46 * 47 * Volumes commonly span between muted (0%), and normal (100%). It is possible 48 * to set volumes to higher than 100%, but clipping might occur. 49 * 50 * \section calc_sec Calculations 51 * 52 * The volumes in PulseAudio are logarithmic in nature and applications 53 * shouldn't perform calculations with them directly. Instead, they should 54 * be converted to and from either dB or a linear scale: 55 * 56 * \li dB - pa_sw_volume_from_dB() / pa_sw_volume_to_dB() 57 * \li Linear - pa_sw_volume_from_linear() / pa_sw_volume_to_linear() 58 * 59 * For simple multiplication, pa_sw_volume_multiply() and 60 * pa_sw_cvolume_multiply() can be used. 61 * 62 * Calculations can only be reliably performed on software volumes 63 * as it is commonly unknown what scale hardware volumes relate to. 64 * 65 * The functions described above are only valid when used with 66 * software volumes. Hence it is usually a better idea to treat all 67 * volume values as opaque with a range from PA_VOLUME_MUTED (0%) to 68 * PA_VOLUME_NORM (100%) and to refrain from any calculations with 69 * them. 70 * 71 * \section conv_sec Convenience Functions 72 * 73 * To handle the pa_cvolume structure, the PulseAudio library provides a 74 * number of convenience functions: 75 * 76 * \li pa_cvolume_valid() - Tests if a pa_cvolume structure is valid. 77 * \li pa_cvolume_equal() - Tests if two pa_cvolume structures are identical. 78 * \li pa_cvolume_channels_equal_to() - Tests if all channels of a pa_cvolume 79 * structure have a given volume. 80 * \li pa_cvolume_is_muted() - Tests if all channels of a pa_cvolume 81 * structure are muted. 82 * \li pa_cvolume_is_norm() - Tests if all channels of a pa_cvolume structure 83 * are at a normal volume. 84 * \li pa_cvolume_set() - Set the first n channels of a pa_cvolume structure to 85 * a certain volume. 86 * \li pa_cvolume_reset() - Set the first n channels of a pa_cvolume structure 87 * to a normal volume. 88 * \li pa_cvolume_mute() - Set the first n channels of a pa_cvolume structure 89 * to a muted volume. 90 * \li pa_cvolume_avg() - Return the average volume of all channels. 91 * \li pa_cvolume_snprint() - Pretty print a pa_cvolume structure. 92 */ 93 94/** \file 95 * Constants and routines for volume handling 96 * 97 * See also \subpage volume 98 */ 99 100PA_C_DECL_BEGIN 101 102/** Volume specification: 103 * PA_VOLUME_MUTED: silence; 104 * < PA_VOLUME_NORM: decreased volume; 105 * PA_VOLUME_NORM: normal volume; 106 * > PA_VOLUME_NORM: increased volume */ 107typedef uint32_t pa_volume_t; 108 109/** Normal volume (100%, 0 dB) */ 110#define PA_VOLUME_NORM ((pa_volume_t) 0x10000U) 111 112/** Muted (minimal valid) volume (0%, -inf dB) */ 113#define PA_VOLUME_MUTED ((pa_volume_t) 0U) 114 115/** Maximum valid volume we can store. \since 0.9.15 */ 116#define PA_VOLUME_MAX ((pa_volume_t) UINT32_MAX/2) 117 118/** Recommended maximum volume to show in user facing UIs. 119 * Note: UIs should deal gracefully with volumes greater than this value 120 * and not cause feedback loops etc. - i.e. if the volume is more than 121 * this, the UI should not limit it and push the limited value back to 122 * the server. \since 0.9.23 */ 123#define PA_VOLUME_UI_MAX (pa_sw_volume_from_dB(+11.0)) 124 125/** Special 'invalid' volume. \since 0.9.16 */ 126#define PA_VOLUME_INVALID ((pa_volume_t) UINT32_MAX) 127 128/** Check if volume is valid. \since 1.0 */ 129#define PA_VOLUME_IS_VALID(v) ((v) <= PA_VOLUME_MAX) 130 131/** Clamp volume to the permitted range. \since 1.0 */ 132#define PA_CLAMP_VOLUME(v) (PA_CLAMP_UNLIKELY((v), PA_VOLUME_MUTED, PA_VOLUME_MAX)) 133 134/** A structure encapsulating a per-channel volume */ 135typedef struct pa_cvolume { 136 uint8_t channels; /**< Number of channels */ 137 pa_volume_t values[PA_CHANNELS_MAX]; /**< Per-channel volume */ 138} pa_cvolume; 139 140/** Return non-zero when *a == *b */ 141int pa_cvolume_equal(const pa_cvolume *a, const pa_cvolume *b) PA_GCC_PURE; 142 143/** Initialize the specified volume and return a pointer to 144 * it. The sample spec will have a defined state but 145 * pa_cvolume_valid() will fail for it. \since 0.9.13 */ 146pa_cvolume* pa_cvolume_init(pa_cvolume *a); 147 148/** Set the volume of the first n channels to PA_VOLUME_NORM */ 149#define pa_cvolume_reset(a, n) pa_cvolume_set((a), (n), PA_VOLUME_NORM) 150 151/** Set the volume of the first n channels to PA_VOLUME_MUTED */ 152#define pa_cvolume_mute(a, n) pa_cvolume_set((a), (n), PA_VOLUME_MUTED) 153 154/** Set the volume of the specified number of channels to the volume v */ 155pa_cvolume* pa_cvolume_set(pa_cvolume *a, unsigned channels, pa_volume_t v); 156 157/** Maximum length of the strings returned by 158 * pa_cvolume_snprint(). Please note that this value can change with 159 * any release without warning and without being considered API or ABI 160 * breakage. You should not use this definition anywhere where it 161 * might become part of an ABI.*/ 162#define PA_CVOLUME_SNPRINT_MAX 320 163 164/** Pretty print a volume structure */ 165char *pa_cvolume_snprint(char *s, size_t l, const pa_cvolume *c); 166 167/** Maximum length of the strings returned by 168 * pa_sw_cvolume_snprint_dB(). Please note that this value can change with 169 * any release without warning and without being considered API or ABI 170 * breakage. You should not use this definition anywhere where it 171 * might become part of an ABI. \since 0.9.13 */ 172#define PA_SW_CVOLUME_SNPRINT_DB_MAX 448 173 174/** Pretty print a volume structure but show dB values. \since 0.9.13 */ 175char *pa_sw_cvolume_snprint_dB(char *s, size_t l, const pa_cvolume *c); 176 177/** Maximum length of the strings returned by 178 * pa_volume_snprint(). Please note that this value can change with 179 * any release without warning and without being considered API or ABI 180 * breakage. You should not use this definition anywhere where it 181 * might become part of an ABI. \since 0.9.15 */ 182#define PA_VOLUME_SNPRINT_MAX 10 183 184/** Pretty print a volume \since 0.9.15 */ 185char *pa_volume_snprint(char *s, size_t l, pa_volume_t v); 186 187/** Maximum length of the strings returned by 188 * pa_sw_volume_snprint_dB(). Please note that this value can change with 189 * any release without warning and without being considered API or ABI 190 * breakage. You should not use this definition anywhere where it 191 * might become part of an ABI. \since 0.9.15 */ 192#define PA_SW_VOLUME_SNPRINT_DB_MAX 10 193 194/** Pretty print a volume but show dB values. \since 0.9.15 */ 195char *pa_sw_volume_snprint_dB(char *s, size_t l, pa_volume_t v); 196 197/** Return the average volume of all channels */ 198pa_volume_t pa_cvolume_avg(const pa_cvolume *a) PA_GCC_PURE; 199 200/** Return the average volume of all channels that are included in the 201 * specified channel map with the specified channel position mask. If 202 * cm is NULL this call is identical to pa_cvolume_avg(). If no 203 * channel is selected the returned value will be 204 * PA_VOLUME_MUTED. \since 0.9.16 */ 205pa_volume_t pa_cvolume_avg_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE; 206 207/** Return the maximum volume of all channels. \since 0.9.12 */ 208pa_volume_t pa_cvolume_max(const pa_cvolume *a) PA_GCC_PURE; 209 210/** Return the maximum volume of all channels that are included in the 211 * specified channel map with the specified channel position mask. If 212 * cm is NULL this call is identical to pa_cvolume_max(). If no 213 * channel is selected the returned value will be PA_VOLUME_MUTED. 214 * \since 0.9.16 */ 215pa_volume_t pa_cvolume_max_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE; 216 217/** Return the minimum volume of all channels. \since 0.9.16 */ 218pa_volume_t pa_cvolume_min(const pa_cvolume *a) PA_GCC_PURE; 219 220/** Return the minimum volume of all channels that are included in the 221 * specified channel map with the specified channel position mask. If 222 * cm is NULL this call is identical to pa_cvolume_min(). If no 223 * channel is selected the returned value will be PA_VOLUME_MUTED. 224 * \since 0.9.16 */ 225pa_volume_t pa_cvolume_min_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE; 226 227/** Return TRUE when the passed cvolume structure is valid, FALSE otherwise */ 228int pa_cvolume_valid(const pa_cvolume *v) PA_GCC_PURE; 229 230/** Return non-zero if the volume of all channels is equal to the specified value */ 231int pa_cvolume_channels_equal_to(const pa_cvolume *a, pa_volume_t v) PA_GCC_PURE; 232 233/** Return 1 if the specified volume has all channels muted */ 234#define pa_cvolume_is_muted(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_MUTED) 235 236/** Return 1 if the specified volume has all channels on normal level */ 237#define pa_cvolume_is_norm(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_NORM) 238 239/** Multiply two volume specifications, return the result. This uses 240 * PA_VOLUME_NORM as neutral element of multiplication. This is only 241 * valid for software volumes! */ 242pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) PA_GCC_CONST; 243 244/** Multiply two per-channel volumes and return the result in 245 * *dest. This is only valid for software volumes! a, b and dest may 246 * point to the same structure. */ 247pa_cvolume *pa_sw_cvolume_multiply(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b); 248 249/** Multiply a per-channel volume with a scalar volume and return the 250 * result in *dest. This is only valid for software volumes! a 251 * and dest may point to the same structure. \since 252 * 0.9.16 */ 253pa_cvolume *pa_sw_cvolume_multiply_scalar(pa_cvolume *dest, const pa_cvolume *a, pa_volume_t b); 254 255/** Divide two volume specifications, return the result. This uses 256 * PA_VOLUME_NORM as neutral element of division. This is only valid 257 * for software volumes! If a division by zero is tried the result 258 * will be 0. \since 0.9.13 */ 259pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) PA_GCC_CONST; 260 261/** Divide two per-channel volumes and return the result in 262 * *dest. This is only valid for software volumes! a, b 263 * and dest may point to the same structure. \since 0.9.13 */ 264pa_cvolume *pa_sw_cvolume_divide(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b); 265 266/** Divide a per-channel volume by a scalar volume and return the 267 * result in *dest. This is only valid for software volumes! a 268 * and dest may point to the same structure. \since 269 * 0.9.16 */ 270pa_cvolume *pa_sw_cvolume_divide_scalar(pa_cvolume *dest, const pa_cvolume *a, pa_volume_t b); 271 272/** Convert a decibel value to a volume (amplitude, not power). This is only valid for software volumes! */ 273pa_volume_t pa_sw_volume_from_dB(double f) PA_GCC_CONST; 274 275/** Convert a volume to a decibel value (amplitude, not power). This is only valid for software volumes! */ 276double pa_sw_volume_to_dB(pa_volume_t v) PA_GCC_CONST; 277 278/** Convert a linear factor to a volume. 0.0 and less is muted while 279 * 1.0 is PA_VOLUME_NORM. This is only valid for software volumes! */ 280pa_volume_t pa_sw_volume_from_linear(double v) PA_GCC_CONST; 281 282/** Convert a volume to a linear factor. This is only valid for software volumes! */ 283double pa_sw_volume_to_linear(pa_volume_t v) PA_GCC_CONST; 284 285#ifdef INFINITY 286#define PA_DECIBEL_MININFTY ((double) -INFINITY) 287#else 288/** This floor value is used as minus infinity when using pa_sw_volume_to_dB() / pa_sw_volume_from_dB(). */ 289#define PA_DECIBEL_MININFTY ((double) -200.0) 290#endif 291 292/** Remap a volume from one channel mapping to a different channel mapping. \since 0.9.12 */ 293pa_cvolume *pa_cvolume_remap(pa_cvolume *v, const pa_channel_map *from, const pa_channel_map *to); 294 295/** Return non-zero if the specified volume is compatible with the 296 * specified sample spec. \since 0.9.13 */ 297int pa_cvolume_compatible(const pa_cvolume *v, const pa_sample_spec *ss) PA_GCC_PURE; 298 299/** Return non-zero if the specified volume is compatible with the 300 * specified sample spec. \since 0.9.15 */ 301int pa_cvolume_compatible_with_channel_map(const pa_cvolume *v, const pa_channel_map *cm) PA_GCC_PURE; 302 303/** Calculate a 'balance' value for the specified volume with the 304 * specified channel map. The return value will range from -1.0f 305 * (left) to +1.0f (right). If no balance value is applicable to this 306 * channel map the return value will always be 0.0f. See 307 * pa_channel_map_can_balance(). \since 0.9.15 */ 308float pa_cvolume_get_balance(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE; 309 310/** Adjust the 'balance' value for the specified volume with the 311 * specified channel map. v will be modified in place and 312 * returned. The balance is a value between -1.0f and +1.0f. This 313 * operation might not be reversible! Also, after this call 314 * pa_cvolume_get_balance() is not guaranteed to actually return the 315 * requested balance value (e.g. when the input volume was zero anyway for 316 * all channels). If no balance value is applicable to 317 * this channel map the volume will not be modified. See 318 * pa_channel_map_can_balance(). \since 0.9.15 */ 319pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance); 320 321/** Calculate a 'fade' value (i.e. 'balance' between front and rear) 322 * for the specified volume with the specified channel map. The return 323 * value will range from -1.0f (rear) to +1.0f (left). If no fade 324 * value is applicable to this channel map the return value will 325 * always be 0.0f. See pa_channel_map_can_fade(). \since 0.9.15 */ 326float pa_cvolume_get_fade(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE; 327 328/** Adjust the 'fade' value (i.e. 'balance' between front and rear) 329 * for the specified volume with the specified channel map. v will be 330 * modified in place and returned. The balance is a value between 331 * -1.0f and +1.0f. This operation might not be reversible! Also, 332 * after this call pa_cvolume_get_fade() is not guaranteed to actually 333 * return the requested fade value (e.g. when the input volume was 334 * zero anyway for all channels). If no fade value is applicable to 335 * this channel map the volume will not be modified. See 336 * pa_channel_map_can_fade(). \since 0.9.15 */ 337pa_cvolume* pa_cvolume_set_fade(pa_cvolume *v, const pa_channel_map *map, float new_fade); 338 339/** Scale the passed pa_cvolume structure so that the maximum volume 340 * of all channels equals max. The proportions between the channel 341 * volumes are kept. \since 0.9.15 */ 342pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max); 343 344/** Scale the passed pa_cvolume structure so that the maximum volume 345 * of all channels selected via cm/mask equals max. This also modifies 346 * the volume of those channels that are unmasked. The proportions 347 * between the channel volumes are kept. \since 0.9.16 */ 348pa_cvolume* pa_cvolume_scale_mask(pa_cvolume *v, pa_volume_t max, pa_channel_map *cm, pa_channel_position_mask_t mask); 349 350/** Set the passed volume to all channels at the specified channel 351 * position. Will return the updated volume struct, or NULL if there 352 * is no channel at the position specified. You can check if a channel 353 * map includes a specific position by calling 354 * pa_channel_map_has_position(). \since 0.9.16 */ 355pa_cvolume* pa_cvolume_set_position(pa_cvolume *cv, const pa_channel_map *map, pa_channel_position_t t, pa_volume_t v); 356 357/** Get the maximum volume of all channels at the specified channel 358 * position. Will return 0 if there is no channel at the position 359 * specified. You can check if a channel map includes a specific 360 * position by calling pa_channel_map_has_position(). \since 0.9.16 */ 361pa_volume_t pa_cvolume_get_position(pa_cvolume *cv, const pa_channel_map *map, pa_channel_position_t t) PA_GCC_PURE; 362 363/** This goes through all channels in a and b and sets the 364 * corresponding channel in dest to the greater volume of both. a, b 365 * and dest may point to the same structure. \since 0.9.16 */ 366pa_cvolume* pa_cvolume_merge(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b); 367 368/** Increase the volume passed in by 'inc', but not exceeding 'limit'. 369 * The proportions between the channels are kept. \since 0.9.19 */ 370pa_cvolume* pa_cvolume_inc_clamp(pa_cvolume *v, pa_volume_t inc, pa_volume_t limit); 371 372/** Increase the volume passed in by 'inc'. The proportions between 373 * the channels are kept. \since 0.9.16 */ 374pa_cvolume* pa_cvolume_inc(pa_cvolume *v, pa_volume_t inc); 375 376/** Increase the volume passed in by 'inc'. The proportions between 377 * the channels are kept. \since 0.9.16 */ 378pa_cvolume* pa_cvolume_dec(pa_cvolume *v, pa_volume_t dec); 379 380PA_C_DECL_END 381 382#endif 383