blob: 48dc6550449da39c73c83ae6bd8e8e193ee8dd55 [file] [log] [blame]
/* 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_UCM_H
#define _CRAS_ALSA_UCM_H
#include <alsa/asoundlib.h>
#include "cras_alsa_mixer_name.h"
#include "cras_alsa_ucm_section.h"
#include "cras_types.h"
struct cras_use_case_mgr;
/* Helpers to access UCM configuration for a card if any is provided.
* This configuration can specify how to enable or disable certain inputs and
* outputs on the card.
*/
/* Creates a cras_use_case_mgr instance for the given card name if there is a
* matching ucm configuration. It there is a matching UCM config, then it will
* be configured to the default state.
*
* Args:
* name - Name of the card to match against the UCM card list.
* Returns:
* A pointer to the use case manager if found, otherwise NULL. The pointer
* must later be freed with ucm_destroy().
*/
struct cras_use_case_mgr *ucm_create(const char *name);
/* Destroys a cras_use_case_mgr that was returned from ucm_create.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
*/
void ucm_destroy(struct cras_use_case_mgr *mgr);
/* Sets the new use case for the given cras_use_case_mgr.
* Args:
* mgr - The cras_use_case_mgr pointer returned from ucm_create.
* use_case - The new use case to be set.
* Returns:
* 0 on success or negative error code on failure.
*/
int ucm_set_use_case(struct cras_use_case_mgr *mgr,
enum CRAS_STREAM_TYPE use_case);
/* Checks if modifier for left right swap mode exists in ucm.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* 1 if it exists, 0 otherwise.
*/
int ucm_swap_mode_exists(struct cras_use_case_mgr *mgr);
/* Enables or disables swap mode for the given node_name. First checks
* if the modifier is already enabled or disabled.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* node_name - The node name.
* enable - Enable device if non-zero.
* Returns:
* 0 on success or negative error code on failure.
*/
int ucm_enable_swap_mode(struct cras_use_case_mgr *mgr, const char *node_name,
int enable);
/* Enables or disables a UCM device. First checks if the device is already
* enabled or disabled.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The ucm device to enable of disable.
* enable - Enable device if non-zero.
* Returns:
* 0 on success or negative error code on failure.
*/
int ucm_set_enabled(struct cras_use_case_mgr *mgr, const char *dev, int enable);
/* Gets the value of given flag name.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* flag_name - The name of the flag.
* Returns:
* A pointer to the allocated string containing the flag value, or
* NULL if the flag is not set.
*/
char *ucm_get_flag(struct cras_use_case_mgr *mgr, const char *flag_name);
/* Gets the capture control name which associated with given ucm device.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* ucm_dev - The ucm device to get capture control for.
* Returns:
* A pointer to the allocated string containing the name of the capture
* control, or NULL if no capture control is found.
*/
char *ucm_get_cap_control(struct cras_use_case_mgr *mgr, const char *ucm_dev);
/* Gets the new node type name which user wants to override the old one for
* given ucm device.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* ucm_dev - The ucm device to override node type.
* Returns:
* A pointer to the allocated string containing the new type name,
* or NULL if no override_type_name is found.
*/
const char *ucm_get_override_type_name(struct cras_use_case_mgr *mgr,
const char *ucm_dev);
/* Gets the name of the ucm device for the given jack name.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* jack - The name of the jack to search for.
* direction - input or output
* Rreturns:
* A pointer to the allocated string containing the name of the device, or
* NULL if no device is found.
*/
char *ucm_get_dev_for_jack(struct cras_use_case_mgr *mgr, const char *jack,
enum CRAS_STREAM_DIRECTION direction);
/* Gets the name of the ucm device for the given mixer name.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* mixer - The name of the mixer control to search for.
* dir - input or output
* Rreturns:
* A pointer to the allocated string containing the name of the device, or
* NULL if no device is found.
*/
char *ucm_get_dev_for_mixer(struct cras_use_case_mgr *mgr, const char *mixer,
enum CRAS_STREAM_DIRECTION dir);
/* If there is an EDID file variable specified for dev, return it. The EDID
* file will be used for HDMI devices so supported audio formats can be checked.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for an EDID file.
* Returns:
* A string containing the name of the edid file on Success (Must be freed
* later). NULL if none found.
*/
const char *ucm_get_edid_file_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the dsp name which is associated with the given ucm device.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to get dsp name for.
* Returns:
* A pointer to the allocated string containing the dsp name, or NULL if no
* dsp name is found.
*/
const char *ucm_get_dsp_name_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the minimum buffer level for an output. This level will add latency to
* all streams playing on the output, but can be used to work around an
* unreliable dma residue.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* level - The pointer to the returned value.
*
*/
int ucm_get_min_buffer_level(struct cras_use_case_mgr *mgr,
unsigned int *level);
/* Gets the flag for disabling software volume.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* 0 on success, -ENOENT on failure.
*/
unsigned int ucm_get_disable_software_volume(struct cras_use_case_mgr *mgr);
/* Gets the value for default node gain.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for default node gain.
* gain - The pointer to the returned value.
* Returns:
* 0 on success, other error codes on failure.
*/
int ucm_get_default_node_gain(struct cras_use_case_mgr *mgr, const char *dev,
long *gain);
/* Gets the value for intrinsic sensitivity.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to query for intrinsic volume.
* sensitivity - The pointer to the returned value.
* Returns:
* 0 on success, other error codes on failure.
*/
int ucm_get_intrinsic_sensitivity(struct cras_use_case_mgr *mgr,
const char *dev, long *sensitivity);
/* Gets the flag if an input device can preempt hotword recording.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for preempt hotword flag.
* Returns:
* Non-zero value means input can preempt hotword recording, otherwise
* return zero.
*/
int ucm_get_preempt_hotword(struct cras_use_case_mgr *mgr, const char *dev);
/* Gets the ALSA device index on the card for given UCM dev.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The UCM device to check for ALSA device index.
* direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
* Returns:
* Non-negative integer for the ALSA device index on the card, -1 if not
* found. The ALSA device index is parsed from the PCM name which is
* formatted as "hw:<some-name>,<idx>".
*/
int ucm_get_alsa_dev_idx_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
enum CRAS_STREAM_DIRECTION direction);
/* Gets the node name of the echo reference device on the card.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check echo reference for.
* Returns:
* String containing the node name of the echo reference to this
* dev, caller is responsible to free it later. NULL if echo reference
* doesn't exist.
*/
const char *
ucm_get_echo_reference_dev_name_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the sample rate at which to run this device.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for sample rate.
* direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
* Returns:
* The sample rate if specified, or negative error if not.
*/
int ucm_get_sample_rate_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
enum CRAS_STREAM_DIRECTION direction);
/* Gets the channel count at which to run this device.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for channel count.
* direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
* channels - The pointer to the returned channel count.
* Returns:
* 0 on success, other error codes on failure.
*/
int ucm_get_channels_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
enum CRAS_STREAM_DIRECTION direction,
size_t *channels);
/* Gets the capture channel map for this device.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for capture channel map.
* channel_layout - The channel layout to fill.
*/
int ucm_get_capture_chmap_for_dev(struct cras_use_case_mgr *mgr,
const char *dev, int8_t *channel_layout);
/* Gets the mixer names for the coupled mixer controls of this device
* on the card.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for coupled mixer controls.
* Returns:
* A list of cras_alsa_control.
*/
struct mixer_name *ucm_get_coupled_mixer_names(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets a list of UCM sections
*
* The data includes the represented devices and their controls.
*
* Args:
* mgr - The cras_use_case_mgr pointer return from alsa_ucm_create.
*
* Returns:
* A list of ucm_section or NULL. Free it with ucm_section_free_list().
*/
struct ucm_section *ucm_get_sections(struct cras_use_case_mgr *mgr);
/* Gets the list of supported hotword model names.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* String containing comma separated model names, e.g 'en,fr,zh'. Needs
* to be freed by caller.
*/
char *ucm_get_hotword_models(struct cras_use_case_mgr *mgr);
/* Sets the desired hotword model.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* 0 on success or negative error code on failure.
*/
int ucm_set_hotword_model(struct cras_use_case_mgr *mgr, const char *model);
/* Checks if this card has fully specified UCM config.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* 1 if this UCM uses fully specified UCM config. 0 otherwise.
*/
int ucm_has_fully_specified_ucm_flag(struct cras_use_case_mgr *mgr);
/* Gets the playback mixer name of this device on the card.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for device name
* Returns:
* A pointer to the allocated string containing the mixer name, or NULL
* if no device name is found.
*/
const char *ucm_get_playback_mixer_elem_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the capture mixer name of this device on the card.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for device name
* Returns:
* A pointer to the allocated string containing the mixer name, or NULL
* if no device name is found.
*/
const char *ucm_get_capture_mixer_elem_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the mixer names for the main volume controls on the card.
*
* The main volume controls in the list are considered in series.
* If 3 controls are specified, MainVolumeNames "A,B,C", with dB ranges
* A=-10dB~0dB, B=-20dB~0dB, C=-30dB~0dB, then applying -35dB overall volume
* sets A=-10dB, B=-20dB, C=-5dB.
* The volume control affects all output on this card, e.g.
* speaker and headphone.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* names - A list of mixer_name.
*/
struct mixer_name *ucm_get_main_volume_names(struct cras_use_case_mgr *mgr);
/* The callback to be provided with a reference to the section name.
*
* Args:
* section_name: The name of a SectionDevice in UCM.
* arg - Argument to pass to this callback.
*/
typedef void (*ucm_list_section_devices_callback)(const char *section_name,
void *arg);
/* Invokes the provided callback once for each section with matched device name.
*
* Iterate through each SectionDevice in UCM of this card. Invoke callback if
* "PlaybackPCM" for output or "CapturePCM" for input of the section matches
* the specified device_name.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* device_name - A string for device name of format "card_name:device_index".
* cb - Function to call for each section.
* cb_arg - Argument to pass to cb.
* Returns:
* Number of sections listed.
*/
int ucm_list_section_devices_by_device_name(
struct cras_use_case_mgr *mgr, enum CRAS_STREAM_DIRECTION direction,
const char *device_name, ucm_list_section_devices_callback cb,
void *cb_arg);
/* Gets the jack name of this device on the card.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for jack name.
* Returns:
* A pointer to the allocated string containing the jack name, or NULL
* if no jack name is found.
*/
const char *ucm_get_jack_name_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the jack type of this device on the card.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for jack type.
* Returns:
* A pointer to the allocated string containing the jack type, or NULL
* if no jack type is found or the found jack type is invalid. The valid
* jack types are "hctl" or "gpio".
*/
const char *ucm_get_jack_type_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the jack dev of this device on the card.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for jack name.
* Returns:
* A pointer to the allocated string containing the input jack name, or NULL
* if no jack name is found.
*/
const char *ucm_get_jack_dev_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the jack control of this device on the card.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check for jack type.
* Returns:
* A pointer to the allocated string containing the alsa jack name, or NULL
* if no jack type is found or the found jack type is invalid.
*/
const char *ucm_get_jack_control_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the jack switch number for this device.
* Some sound cards can detect multiple types of connections into the
* audio jack - for example distinguish between line-out and headphones
* by measuring the impedance on the other end. In that case we want each
* jack to have it's own I/O node so that each can have it's own volume
* settings. This allows us to specify the jack used more exactly.
* Valid values are defined in /usr/include/linux/input.h.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check.
* Returns:
* A value >= 0 when the switch is defined, or -1 otherwise.
*/
int ucm_get_jack_switch_for_dev(struct cras_use_case_mgr *mgr, const char *dev);
/* Gets the DMA period time in microseconds for the given device.
*
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* dev - The device to check.
* Returns:
* A value > 0, or 0 if no period is defined.
*/
unsigned int ucm_get_dma_period_for_dev(struct cras_use_case_mgr *mgr,
const char *dev);
/* Gets the flag of optimization for no stream state.
* This flag enables no_stream ops in alsa_io.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* 1 if the flag is enabled. 0 otherwise.
*/
unsigned int ucm_get_optimize_no_stream_flag(struct cras_use_case_mgr *mgr);
/* Retrieve the flag that enables use of htimestamp.
* Args:
* mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
* Returns:
* 1 if the flag is enabled. 0 otherwise.
*/
unsigned int ucm_get_enable_htimestamp_flag(struct cras_use_case_mgr *mgr);
#endif /* _CRAS_ALSA_UCM_H */