2006-01-27 16:25:31 +00:00
# ifndef foovolumehfoo
# define foovolumehfoo
/***
2006-06-19 21:53:48 +00:00
This file is part of PulseAudio .
2007-01-04 13:43:45 +00:00
2007-02-13 15:35:19 +00:00
Copyright 2004 - 2006 Lennart Poettering
Copyright 2006 Pierre Ossman < ossman @ cendio . se > for Cendio AB
2006-06-19 21:53:48 +00:00
PulseAudio is free software ; you can redistribute it and / or modify
2006-01-27 16:25:31 +00:00
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation ; either version 2 of the License ,
or ( at your option ) any later version .
2007-01-04 13:43:45 +00:00
2006-06-19 21:53:48 +00:00
PulseAudio is distributed in the hope that it will be useful , but
2006-01-27 16:25:31 +00:00
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
General Public License for more details .
2007-01-04 13:43:45 +00:00
2006-01-27 16:25:31 +00:00
You should have received a copy of the GNU Lesser General Public License
2006-06-19 21:53:48 +00:00
along with PulseAudio ; if not , write to the Free Software
2006-01-27 16:25:31 +00:00
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307
USA .
* * */
# include <inttypes.h>
2008-05-15 23:34:41 +00:00
2006-06-19 21:53:48 +00:00
# include <pulse/cdecl.h>
2008-05-15 23:34:41 +00:00
# include <pulse/gccmacro.h>
2006-06-19 21:53:48 +00:00
# include <pulse/sample.h>
2008-08-04 18:40:53 +02:00
# include <pulse/channelmap.h>
2006-01-27 16:25:31 +00:00
2006-04-13 13:45:38 +00:00
/** \page volume Volume Control
2006-04-09 19:31:09 +00:00
*
* \ section overv_sec Overview
*
* Sinks , sources , sink inputs and samples can all have their own volumes .
2006-06-19 22:11:49 +00:00
* To deal with these , The PulseAudio libray contains a number of functions
2006-04-09 19:31:09 +00:00
* that ease handling .
*
2006-06-19 22:11:49 +00:00
* The basic volume type in PulseAudio is the \ ref pa_volume_t type . Most of
2006-04-09 19:31:09 +00:00
* the time , applications will use the aggregated pa_cvolume structure that
* can store the volume of all channels at once .
*
* Volumes commonly span between muted ( 0 % ) , and normal ( 100 % ) . It is possible
* to set volumes to higher than 100 % , but clipping might occur .
*
* \ section calc_sec Calculations
*
2006-06-19 22:11:49 +00:00
* The volumes in PulseAudio are logarithmic in nature and applications
2006-04-09 19:31:09 +00:00
* shouldn ' t perform calculations with them directly . Instead , they should
* be converted to and from either dB or a linear scale :
*
* \ li dB - pa_sw_volume_from_dB ( ) / pa_sw_volume_to_dB ( )
* \ li Linear - pa_sw_volume_from_linear ( ) / pa_sw_volume_to_linear ( )
*
* For simple multiplication , pa_sw_volume_multiply ( ) and
* pa_sw_cvolume_multiply ( ) can be used .
*
2006-04-13 00:56:10 +00:00
* Calculations can only be reliably performed on software volumes
* as it is commonly unknown what scale hardware volumes relate to .
*
* The functions described above are only valid when used with
* software volumes . Hence it is usually a better idea to treat all
* volume values as opaque with a range from PA_VOLUME_MUTE ( 0 % ) to
* PA_VOLUME_NORM ( 100 % ) and to refrain from any calculations with
* them .
2006-04-09 19:31:09 +00:00
*
2006-04-13 13:45:38 +00:00
* \ section conv_sec Convenience Functions
2006-04-09 19:31:09 +00:00
*
2006-06-19 22:11:49 +00:00
* To handle the pa_cvolume structure , the PulseAudio library provides a
2006-04-09 19:31:09 +00:00
* number of convenienc functions :
*
* \ li pa_cvolume_valid ( ) - Tests if a pa_cvolume structure is valid .
* \ li pa_cvolume_equal ( ) - Tests if two pa_cvolume structures are identical .
* \ li pa_cvolume_channels_equal_to ( ) - Tests if all channels of a pa_cvolume
* structure have a given volume .
* \ li pa_cvolume_is_muted ( ) - Tests if all channels of a pa_cvolume
* structure are muted .
* \ li pa_cvolume_is_norm ( ) - Tests if all channels of a pa_cvolume structure
* are at a normal volume .
* \ li pa_cvolume_set ( ) - Set all channels of a pa_cvolume structure to a
* certain volume .
* \ li pa_cvolume_reset ( ) - Set all channels of a pa_cvolume structure to a
* normal volume .
* \ li pa_cvolume_mute ( ) - Set all channels of a pa_cvolume structure to a
* muted volume .
* \ li pa_cvolume_avg ( ) - Return the average volume of all channels .
* \ li pa_cvolume_snprint ( ) - Pretty print a pa_cvolume structure .
*/
2006-01-27 16:25:31 +00:00
/** \file
* Constants and routines for volume handling */
PA_C_DECL_BEGIN
/** Volume specification:
* PA_VOLUME_MUTED : silence ;
* < PA_VOLUME_NORM : decreased volume ;
* PA_VOLUME_NORM : normal volume ;
* > PA_VOLUME_NORM : increased volume */
typedef uint32_t pa_volume_t ;
/** Normal volume (100%) */
2008-05-17 09:08:13 +00:00
# define PA_VOLUME_NORM ((pa_volume_t) 0x10000U)
2006-01-27 16:25:31 +00:00
/** Muted volume (0%) */
2008-05-17 09:08:13 +00:00
# define PA_VOLUME_MUTED ((pa_volume_t) 0U)
2006-01-27 16:25:31 +00:00
/** A structure encapsulating a per-channel volume */
typedef struct pa_cvolume {
2006-02-20 17:09:39 +00:00
uint8_t channels ; /**< Number of channels */
pa_volume_t values [ PA_CHANNELS_MAX ] ; /**< Per-channel volume */
2006-01-27 16:25:31 +00:00
} pa_cvolume ;
/** Return non-zero when *a == *b */
2007-10-28 19:13:50 +00:00
int pa_cvolume_equal ( const pa_cvolume * a , const pa_cvolume * b ) PA_GCC_PURE ;
2006-01-27 16:25:31 +00:00
/** Set the volume of all channels to PA_VOLUME_NORM */
# define pa_cvolume_reset(a, n) pa_cvolume_set((a), (n), PA_VOLUME_NORM)
/** Set the volume of all channels to PA_VOLUME_MUTED */
# define pa_cvolume_mute(a, n) pa_cvolume_set((a), (n), PA_VOLUME_MUTED)
/** Set the volume of all channels to the specified parameter */
pa_cvolume * pa_cvolume_set ( pa_cvolume * a , unsigned channels , pa_volume_t v ) ;
2006-02-20 17:09:39 +00:00
/** Maximum length of the strings returned by pa_cvolume_snprint() */
2006-01-27 16:25:31 +00:00
# define PA_CVOLUME_SNPRINT_MAX 64
2006-02-20 17:09:39 +00:00
/** Pretty print a volume structure */
2006-01-27 16:25:31 +00:00
char * pa_cvolume_snprint ( char * s , size_t l , const pa_cvolume * c ) ;
/** Return the average volume of all channels */
2007-10-28 19:13:50 +00:00
pa_volume_t pa_cvolume_avg ( const pa_cvolume * a ) PA_GCC_PURE ;
2006-01-27 16:25:31 +00:00
/** Return TRUE when the passed cvolume structure is valid, FALSE otherwise */
2007-10-28 19:13:50 +00:00
int pa_cvolume_valid ( const pa_cvolume * v ) PA_GCC_PURE ;
2006-01-27 16:25:31 +00:00
/** Return non-zero if the volume of all channels is equal to the specified value */
2007-10-28 19:13:50 +00:00
int pa_cvolume_channels_equal_to ( const pa_cvolume * a , pa_volume_t v ) PA_GCC_PURE ;
2006-01-27 16:25:31 +00:00
2006-02-20 17:09:39 +00:00
/** Return 1 if the specified volume has all channels muted */
2006-01-27 16:25:31 +00:00
# define pa_cvolume_is_muted(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_MUTED)
2006-02-20 17:09:39 +00:00
/** Return 1 if the specified volume has all channels on normal level */
2006-01-27 16:25:31 +00:00
# define pa_cvolume_is_norm(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_NORM)
2006-02-20 17:09:39 +00:00
/** Multiply two volumes specifications, return the result. This uses PA_VOLUME_NORM as neutral element of multiplication. This is only valid for software volumes! */
2007-10-28 19:13:50 +00:00
pa_volume_t pa_sw_volume_multiply ( pa_volume_t a , pa_volume_t b ) PA_GCC_CONST ;
2006-01-27 16:25:31 +00:00
2006-02-20 17:09:39 +00:00
/** Multiply to per-channel volumes and return the result in *dest. This is only valid for software volumes! */
2008-05-15 23:34:41 +00:00
pa_cvolume * pa_sw_cvolume_multiply ( pa_cvolume * dest , const pa_cvolume * a , const pa_cvolume * b ) ;
2006-01-27 16:25:31 +00:00
2008-05-15 23:34:41 +00:00
/** Convert a decibel value to a volume. This is only valid for software volumes! */
2007-10-28 19:13:50 +00:00
pa_volume_t pa_sw_volume_from_dB ( double f ) PA_GCC_CONST ;
2006-01-27 16:25:31 +00:00
2008-05-15 23:34:41 +00:00
/** Convert a volume to a decibel value. This is only valid for software volumes! */
2007-10-28 19:13:50 +00:00
double pa_sw_volume_to_dB ( pa_volume_t v ) PA_GCC_CONST ;
2006-01-27 16:25:31 +00:00
2008-05-15 23:34:41 +00:00
/** Convert a linear factor to a volume. This is only valid for software volumes! */
2007-10-28 19:13:50 +00:00
pa_volume_t pa_sw_volume_from_linear ( double v ) PA_GCC_CONST ;
2006-01-27 16:25:31 +00:00
2008-05-15 23:34:41 +00:00
/** Convert a volume to a linear factor. This is only valid for software volumes! */
2007-10-28 19:13:50 +00:00
double pa_sw_volume_to_linear ( pa_volume_t v ) PA_GCC_CONST ;
2006-01-27 16:25:31 +00:00
# ifdef INFINITY
2008-05-15 23:34:41 +00:00
# define PA_DECIBEL_MININFTY ((double) -INFINITY)
2006-01-27 16:25:31 +00:00
# else
2008-05-15 23:34:41 +00:00
/** This value is used as minus infinity when using pa_volume_{to,from}_dB(). */
2008-05-17 09:08:13 +00:00
# define PA_DECIBEL_MININFTY ((double) -200.0)
2006-01-27 16:25:31 +00:00
# endif
2008-08-04 18:40:53 +02:00
/** Remap a volume from one channel mapping to a different channel mapping. \since 0.9.12 */
pa_cvolume * pa_cvolume_remap ( pa_cvolume * v , pa_channel_map * from , pa_channel_map * to ) ;
2006-01-27 16:25:31 +00:00
PA_C_DECL_END
# endif