C++程序  |  236行  |  8.22 KB

/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef _CRAS_ALSA_MIXER_H
#define _CRAS_ALSA_MIXER_H

#include <alsa/asoundlib.h>
#include <iniparser.h>

#include "cras_types.h"

/* cras_alsa_mixer represents the alsa mixer interface for an alsa card.  It
 * houses the volume and mute controls as well as playback switches for
 * headphones and mic.
 */

struct mixer_control;
struct cras_alsa_mixer;
struct cras_volume_curve;
struct cras_card_config;
struct mixer_name;
struct ucm_section;

/* Creates a cras_alsa_mixer instance for the given alsa device.
 * Args:
 *    card_name - Name of the card to open a mixer for.  This is an alsa name of
 *      the form "hw:X" where X ranges from 0 to 31 inclusive.
 * Returns:
 *    A pointer to the newly created cras_alsa_mixer which must later be freed
 *    by calling cras_alsa_mixer_destroy. The control in the mixer is not added
 *    yet.
 */
struct cras_alsa_mixer *cras_alsa_mixer_create(const char *card_name);

/* Adds controls to a cras_alsa_mixer from the given UCM section.
 * Args:
 *    cmix - A pointer to cras_alsa_mixer.
 *    section - A UCM section.
 * Returns:
 *    0 on success. Negative error code otherwise.
 */
int cras_alsa_mixer_add_controls_in_section(
		struct cras_alsa_mixer *cmix,
		struct ucm_section *section);

/* Adds controls to a cras_alsa_mixer instance by name matching.
 * Args:
 *    cmix - A pointer to cras_alsa_mixer.
 *    extra_controls - A list array of extra mixer control names, always added.
 *    coupled_controls - A list of coupled mixer control names.
 * Returns:
 *    0 on success. Other error code if error happens.
 */
int cras_alsa_mixer_add_controls_by_name_matching(
		struct cras_alsa_mixer *cmix,
		struct mixer_name *extra_controls,
		struct mixer_name *coupled_controls);

/* Destroys a cras_alsa_mixer that was returned from cras_alsa_mixer_create.
 * Args:
 *    cras_mixer - The cras_alsa_mixer pointer returned from
 *        cras_alsa_mixer_create.
 */
void cras_alsa_mixer_destroy(struct cras_alsa_mixer *cras_mixer);

/* Returns if the mixer has any main volume control. */
int cras_alsa_mixer_has_main_volume(const struct cras_alsa_mixer *cras_mixer);

/* Returns if the mixer control supports volume adjust. */
int cras_alsa_mixer_has_volume(const struct mixer_control *mixer_control);

/* Sets the output volume for the device associated with this mixer.
 * Args:
 *    cras_mixer - The mixer to set the volume on.
 *    dBFS - The volume level as dB * 100.  dB is a normally a negative quantity
 *      specifying how much to attenuate.
 *    mixer_output - The mixer output to set if not all attenuation can be
 *      obtained from the main controls.  Can be null.
 */
void cras_alsa_mixer_set_dBFS(struct cras_alsa_mixer *cras_mixer,
			      long dBFS,
			      struct mixer_control *mixer_output);

/* Gets the volume range of the mixer in dB.
 * Args:
 *    cras_mixer - The mixer to get the volume range.
 */
long cras_alsa_mixer_get_dB_range(struct cras_alsa_mixer *cras_mixer);

/* Gets the volume range of the mixer output in dB.
 * Args:
 *    mixer_output - The mixer output to get the volume range.
 */
long cras_alsa_mixer_get_output_dB_range(
		struct mixer_control *mixer_output);

/* Sets the capture gain for the device associated with this mixer.
 * Args:
 *    cras_mixer - The mixer to set the volume on.
 *    dBFS - The capture gain level as dB * 100.  dB can be a positive or a
 *    negative quantity specifying how much gain or attenuation to apply.
 *    mixer_input - The specific mixer control for input node, can be null.
 */
void cras_alsa_mixer_set_capture_dBFS(struct cras_alsa_mixer *cras_mixer,
				      long dBFS,
				      struct mixer_control* mixer_input);

/* Gets the minimum allowed setting for capture gain.
 * Args:
 *    cmix - The mixer to set the capture gain on.
 *    mixer_input - The additional input mixer control, mainly specified
 *      in ucm config. Can be null.
 * Returns:
 *    The minimum allowed capture gain in dBFS * 100.
 */
long cras_alsa_mixer_get_minimum_capture_gain(
                struct cras_alsa_mixer *cmix,
		struct mixer_control *mixer_input);

/* Gets the maximum allowed setting for capture gain.
 * Args:
 *    cmix - The mixer to set the capture gain on.
 *    mixer_input - The additional input mixer control, mainly specified
 *      in ucm config. Can be null.
 * Returns:
 *    The maximum allowed capture gain in dBFS * 100.
 */
long cras_alsa_mixer_get_maximum_capture_gain(
		struct cras_alsa_mixer *cmix,
		struct mixer_control *mixer_input);

/* Sets the playback switch for the device.
 * Args:
 *    cras_mixer - Mixer to set the playback switch.
 *    muted - 1 if muted, 0 if not.
 *    mixer_output - The output specific mixer control to mute/unmute. Pass NULL
 *                   to skip it.
 */
void cras_alsa_mixer_set_mute(struct cras_alsa_mixer *cras_mixer,
			      int muted,
			      struct mixer_control *mixer_output);

/* Sets the capture switch for the device.
 * Args:
 *    cras_mixer - Mixer to set the volume in.
 *    muted - 1 if muted, 0 if not.
 *    mixer_input - The mixer input to mute if no master mute.
 */
void cras_alsa_mixer_set_capture_mute(struct cras_alsa_mixer *cras_mixer,
				      int muted,
				      struct mixer_control *mixer_input);

/* Invokes the provided callback once for each output (input).
 * The callback will be provided with a reference to the control
 * that can be queried to see what the control supports.
 * Args:
 *    cras_mixer - Mixer to set the volume in.
 *    cb - Function to call for each output (input).
 *    cb_arg - Argument to pass to cb.
 */
typedef void (*cras_alsa_mixer_control_callback)(
		struct mixer_control *control, void *arg);
void cras_alsa_mixer_list_outputs(struct cras_alsa_mixer *cras_mixer,
				  cras_alsa_mixer_control_callback cb,
				  void *cb_arg);

void cras_alsa_mixer_list_inputs(struct cras_alsa_mixer *cras_mixer,
				 cras_alsa_mixer_control_callback cb,
				 void *cb_arg);

/* Gets the name of a given control. */
const char *cras_alsa_mixer_get_control_name(
		const struct mixer_control *control);

/* Returns the mixer control matching the given direction and name.
 * Args:
 *    cras_mixer - Mixer to search for a control.
 *    dir - Control's direction (OUTPUT or INPUT).
 *    name - Name to search for.
 *    create_missing - When non-zero, attempt to create a new control with
 *		       the given name.
 * Returns:
 *    A pointer to the matching mixer control, or NULL if none found.
 */
struct mixer_control *cras_alsa_mixer_get_control_matching_name(
		struct cras_alsa_mixer *cras_mixer,
		enum CRAS_STREAM_DIRECTION dir, const char *name,
		int create_missing);

/* Returns the mixer control associated with the given section.
 * The control is the one that matches 'mixer_name', or if that is not defined
 * then it will be the control matching 'section->name', based on the
 * coupled mixer controls.
 * Args:
 *    cras_mixer - Mixer to search for a control.
 *    section - Associated UCM section.
 * Returns:
 *    A pointer to the associated mixer control, or NULL if none found.
 */
struct mixer_control *cras_alsa_mixer_get_control_for_section(
		struct cras_alsa_mixer *cras_mixer,
		const struct ucm_section *section);

/* Finds the output that matches the given string.  Used to match Jacks to Mixer
 * elements.
 * Args:
 *    cras_mixer - Mixer to search for a control.
 *    name - The name to match against the controls.
 * Returns:
 *    A pointer to the output with a mixer control that matches "name".
 */
struct mixer_control *cras_alsa_mixer_get_output_matching_name(
		struct cras_alsa_mixer *cras_mixer,
		const char *name);

/* Finds the mixer control for that matches the control name of input control
 * name specified in ucm config.
 * Args:
 *    cras_mixer - Mixer to search for a control.
 *    name - Name of the control to search for.
 * Returns:
 *    A pointer to the input with a mixer control that matches "name".
 */
struct mixer_control *cras_alsa_mixer_get_input_matching_name(
		struct cras_alsa_mixer *cras_mixer,
		const char *name);

/* Sets the given output active or inactive. */
int cras_alsa_mixer_set_output_active_state(
		struct mixer_control *output,
		int active);

#endif /* _CRAS_ALSA_MIXER_H */