Home | History | Annotate | Download | only in server
      1 /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 #ifndef _CRAS_ALSA_MIXER_H
      7 #define _CRAS_ALSA_MIXER_H
      8 
      9 #include <alsa/asoundlib.h>
     10 #include <iniparser.h>
     11 
     12 #include "cras_types.h"
     13 
     14 /* cras_alsa_mixer represents the alsa mixer interface for an alsa card.  It
     15  * houses the volume and mute controls as well as playback switches for
     16  * headphones and mic.
     17  */
     18 
     19 struct mixer_control;
     20 struct cras_alsa_mixer;
     21 struct cras_volume_curve;
     22 struct cras_card_config;
     23 struct mixer_name;
     24 struct ucm_section;
     25 
     26 /* Creates a cras_alsa_mixer instance for the given alsa device.
     27  * Args:
     28  *    card_name - Name of the card to open a mixer for.  This is an alsa name of
     29  *      the form "hw:X" where X ranges from 0 to 31 inclusive.
     30  * Returns:
     31  *    A pointer to the newly created cras_alsa_mixer which must later be freed
     32  *    by calling cras_alsa_mixer_destroy. The control in the mixer is not added
     33  *    yet.
     34  */
     35 struct cras_alsa_mixer *cras_alsa_mixer_create(const char *card_name);
     36 
     37 /* Adds controls to a cras_alsa_mixer from the given UCM section.
     38  * Args:
     39  *    cmix - A pointer to cras_alsa_mixer.
     40  *    section - A UCM section.
     41  * Returns:
     42  *    0 on success. Negative error code otherwise.
     43  */
     44 int cras_alsa_mixer_add_controls_in_section(
     45 		struct cras_alsa_mixer *cmix,
     46 		struct ucm_section *section);
     47 
     48 /* Adds controls to a cras_alsa_mixer instance by name matching.
     49  * Args:
     50  *    cmix - A pointer to cras_alsa_mixer.
     51  *    extra_controls - A list array of extra mixer control names, always added.
     52  *    coupled_controls - A list of coupled mixer control names.
     53  * Returns:
     54  *    0 on success. Other error code if error happens.
     55  */
     56 int cras_alsa_mixer_add_controls_by_name_matching(
     57 		struct cras_alsa_mixer *cmix,
     58 		struct mixer_name *extra_controls,
     59 		struct mixer_name *coupled_controls);
     60 
     61 /* Destroys a cras_alsa_mixer that was returned from cras_alsa_mixer_create.
     62  * Args:
     63  *    cras_mixer - The cras_alsa_mixer pointer returned from
     64  *        cras_alsa_mixer_create.
     65  */
     66 void cras_alsa_mixer_destroy(struct cras_alsa_mixer *cras_mixer);
     67 
     68 /* Returns if the mixer has any main volume control. */
     69 int cras_alsa_mixer_has_main_volume(const struct cras_alsa_mixer *cras_mixer);
     70 
     71 /* Returns if the mixer control supports volume adjust. */
     72 int cras_alsa_mixer_has_volume(const struct mixer_control *mixer_control);
     73 
     74 /* Sets the output volume for the device associated with this mixer.
     75  * Args:
     76  *    cras_mixer - The mixer to set the volume on.
     77  *    dBFS - The volume level as dB * 100.  dB is a normally a negative quantity
     78  *      specifying how much to attenuate.
     79  *    mixer_output - The mixer output to set if not all attenuation can be
     80  *      obtained from the main controls.  Can be null.
     81  */
     82 void cras_alsa_mixer_set_dBFS(struct cras_alsa_mixer *cras_mixer,
     83 			      long dBFS,
     84 			      struct mixer_control *mixer_output);
     85 
     86 /* Gets the volume range of the mixer in dB.
     87  * Args:
     88  *    cras_mixer - The mixer to get the volume range.
     89  */
     90 long cras_alsa_mixer_get_dB_range(struct cras_alsa_mixer *cras_mixer);
     91 
     92 /* Gets the volume range of the mixer output in dB.
     93  * Args:
     94  *    mixer_output - The mixer output to get the volume range.
     95  */
     96 long cras_alsa_mixer_get_output_dB_range(
     97 		struct mixer_control *mixer_output);
     98 
     99 /* Sets the capture gain for the device associated with this mixer.
    100  * Args:
    101  *    cras_mixer - The mixer to set the volume on.
    102  *    dBFS - The capture gain level as dB * 100.  dB can be a positive or a
    103  *    negative quantity specifying how much gain or attenuation to apply.
    104  *    mixer_input - The specific mixer control for input node, can be null.
    105  */
    106 void cras_alsa_mixer_set_capture_dBFS(struct cras_alsa_mixer *cras_mixer,
    107 				      long dBFS,
    108 				      struct mixer_control* mixer_input);
    109 
    110 /* Gets the minimum allowed setting for capture gain.
    111  * Args:
    112  *    cmix - The mixer to set the capture gain on.
    113  *    mixer_input - The additional input mixer control, mainly specified
    114  *      in ucm config. Can be null.
    115  * Returns:
    116  *    The minimum allowed capture gain in dBFS * 100.
    117  */
    118 long cras_alsa_mixer_get_minimum_capture_gain(
    119                 struct cras_alsa_mixer *cmix,
    120 		struct mixer_control *mixer_input);
    121 
    122 /* Gets the maximum allowed setting for capture gain.
    123  * Args:
    124  *    cmix - The mixer to set the capture gain on.
    125  *    mixer_input - The additional input mixer control, mainly specified
    126  *      in ucm config. Can be null.
    127  * Returns:
    128  *    The maximum allowed capture gain in dBFS * 100.
    129  */
    130 long cras_alsa_mixer_get_maximum_capture_gain(
    131 		struct cras_alsa_mixer *cmix,
    132 		struct mixer_control *mixer_input);
    133 
    134 /* Sets the playback switch for the device.
    135  * Args:
    136  *    cras_mixer - Mixer to set the playback switch.
    137  *    muted - 1 if muted, 0 if not.
    138  *    mixer_output - The output specific mixer control to mute/unmute. Pass NULL
    139  *                   to skip it.
    140  */
    141 void cras_alsa_mixer_set_mute(struct cras_alsa_mixer *cras_mixer,
    142 			      int muted,
    143 			      struct mixer_control *mixer_output);
    144 
    145 /* Sets the capture switch for the device.
    146  * Args:
    147  *    cras_mixer - Mixer to set the volume in.
    148  *    muted - 1 if muted, 0 if not.
    149  *    mixer_input - The mixer input to mute if no master mute.
    150  */
    151 void cras_alsa_mixer_set_capture_mute(struct cras_alsa_mixer *cras_mixer,
    152 				      int muted,
    153 				      struct mixer_control *mixer_input);
    154 
    155 /* Invokes the provided callback once for each output (input).
    156  * The callback will be provided with a reference to the control
    157  * that can be queried to see what the control supports.
    158  * Args:
    159  *    cras_mixer - Mixer to set the volume in.
    160  *    cb - Function to call for each output (input).
    161  *    cb_arg - Argument to pass to cb.
    162  */
    163 typedef void (*cras_alsa_mixer_control_callback)(
    164 		struct mixer_control *control, void *arg);
    165 void cras_alsa_mixer_list_outputs(struct cras_alsa_mixer *cras_mixer,
    166 				  cras_alsa_mixer_control_callback cb,
    167 				  void *cb_arg);
    168 
    169 void cras_alsa_mixer_list_inputs(struct cras_alsa_mixer *cras_mixer,
    170 				 cras_alsa_mixer_control_callback cb,
    171 				 void *cb_arg);
    172 
    173 /* Gets the name of a given control. */
    174 const char *cras_alsa_mixer_get_control_name(
    175 		const struct mixer_control *control);
    176 
    177 /* Returns the mixer control matching the given direction and name.
    178  * Args:
    179  *    cras_mixer - Mixer to search for a control.
    180  *    dir - Control's direction (OUTPUT or INPUT).
    181  *    name - Name to search for.
    182  *    create_missing - When non-zero, attempt to create a new control with
    183  *		       the given name.
    184  * Returns:
    185  *    A pointer to the matching mixer control, or NULL if none found.
    186  */
    187 struct mixer_control *cras_alsa_mixer_get_control_matching_name(
    188 		struct cras_alsa_mixer *cras_mixer,
    189 		enum CRAS_STREAM_DIRECTION dir, const char *name,
    190 		int create_missing);
    191 
    192 /* Returns the mixer control associated with the given section.
    193  * The control is the one that matches 'mixer_name', or if that is not defined
    194  * then it will be the control matching 'section->name', based on the
    195  * coupled mixer controls.
    196  * Args:
    197  *    cras_mixer - Mixer to search for a control.
    198  *    section - Associated UCM section.
    199  * Returns:
    200  *    A pointer to the associated mixer control, or NULL if none found.
    201  */
    202 struct mixer_control *cras_alsa_mixer_get_control_for_section(
    203 		struct cras_alsa_mixer *cras_mixer,
    204 		const struct ucm_section *section);
    205 
    206 /* Finds the output that matches the given string.  Used to match Jacks to Mixer
    207  * elements.
    208  * Args:
    209  *    cras_mixer - Mixer to search for a control.
    210  *    name - The name to match against the controls.
    211  * Returns:
    212  *    A pointer to the output with a mixer control that matches "name".
    213  */
    214 struct mixer_control *cras_alsa_mixer_get_output_matching_name(
    215 		struct cras_alsa_mixer *cras_mixer,
    216 		const char *name);
    217 
    218 /* Finds the mixer control for that matches the control name of input control
    219  * name specified in ucm config.
    220  * Args:
    221  *    cras_mixer - Mixer to search for a control.
    222  *    name - Name of the control to search for.
    223  * Returns:
    224  *    A pointer to the input with a mixer control that matches "name".
    225  */
    226 struct mixer_control *cras_alsa_mixer_get_input_matching_name(
    227 		struct cras_alsa_mixer *cras_mixer,
    228 		const char *name);
    229 
    230 /* Sets the given output active or inactive. */
    231 int cras_alsa_mixer_set_output_active_state(
    232 		struct mixer_control *output,
    233 		int active);
    234 
    235 #endif /* _CRAS_ALSA_MIXER_H */
    236