| /* 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. |
| * |
| * Handles finding and monitoring ALSA Jack controls. These controls represent |
| * external jacks and report back when the plugged state of teh hack changes. |
| */ |
| |
| #ifndef CRAS_ALSA_JACK_H_ |
| #define CRAS_ALSA_JACK_H_ |
| |
| #include "cras_types.h" |
| #include "cras_alsa_ucm.h" |
| |
| struct cras_alsa_jack; |
| struct cras_alsa_jack_list; |
| struct cras_alsa_mixer; |
| |
| /* Callback type for users of jack_list to define, it will be called when the |
| * jack state changes. |
| * Args: |
| * jack - The jack that has changed. |
| * plugged - non-zero if the jack is attached. |
| * data - User defined pointer passed to cras_alsa_jack_create. |
| */ |
| typedef void(jack_state_change_callback)(const struct cras_alsa_jack *jack, |
| int plugged, void *data); |
| |
| /* Creates a jack list. The jacks can be added later by name matching or |
| * fully specified UCM. |
| * Args: |
| * card_index - Index ALSA uses to refer to the card. The X in "hw:X". |
| * card_name - The name of the card (used to find gpio jacks). |
| * device_index - Index ALSA uses to refer to the device. The Y in "hw:X". |
| * is_first_device - whether this device is the first device on the card. |
| * mixer - The mixer associated with this card, used to find controls that |
| * correspond to jacks. For instance "Headphone switch" for "Headphone |
| * Jack". |
| * ucm - CRAS use case manager if available. |
| * hctl - ALSA high-level control interface if available. |
| * direction - Input or output, look for mic or headphone jacks. |
| * cb - Function to call when a jack state changes. |
| * cb_data - Passed to the callback when called. |
| * Returns: |
| * A pointer to a new jack list on success, NULL if there is a failure. |
| */ |
| struct cras_alsa_jack_list * |
| cras_alsa_jack_list_create(unsigned int card_index, const char *card_name, |
| unsigned int device_index, int is_first_device, |
| struct cras_alsa_mixer *mixer, |
| struct cras_use_case_mgr *ucm, snd_hctl_t *hctl, |
| enum CRAS_STREAM_DIRECTION direction, |
| jack_state_change_callback *cb, void *cb_data); |
| |
| /* Finds jacks by name matching. |
| * The list holds all the interesting ALSA jacks for this |
| * device. These jacks will be for headphones, speakers, HDMI, etc. |
| * Args: |
| * jack_list - A pointer to a jack list. |
| * Returns: |
| * 0 on success. Error code if there is a failure. |
| */ |
| int cras_alsa_jack_list_find_jacks_by_name_matching( |
| struct cras_alsa_jack_list *jack_list); |
| |
| /* Add the jack defined by the UCM section information. |
| * Args: |
| * jack_list - A pointer to a jack list. |
| * ucm_section - UCM section data. |
| * result_jack - Resulting jack that was added. |
| * Returns: |
| * 0 on success. Error code if there is a failure. |
| */ |
| int cras_alsa_jack_list_add_jack_for_section( |
| struct cras_alsa_jack_list *jack_list, struct ucm_section *ucm_section, |
| struct cras_alsa_jack **result_jack); |
| |
| /* Destroys a jack list created with cras_alsa_jack_list_create. |
| * Args: |
| * jack_list - The list to destroy. |
| */ |
| void cras_alsa_jack_list_destroy(struct cras_alsa_jack_list *jack_list); |
| |
| /* Returns non-zero if the jack list has hctl jacks. |
| * Args: |
| * jack_list - The list check. |
| */ |
| int cras_alsa_jack_list_has_hctl_jacks(struct cras_alsa_jack_list *jack_list); |
| |
| /* Gets the mixer output associated with the given jack. |
| * Args: |
| * jack - The jack to query for a mixer output. |
| * Returns: |
| * A pointer to the mixer output if it exists, otherwise NULL. |
| */ |
| struct mixer_control * |
| cras_alsa_jack_get_mixer_output(const struct cras_alsa_jack *jack); |
| |
| /* Gets the mixer input associated with given jack. |
| * Args: |
| * jack - The jack to query for a mixer input. |
| * Returns: |
| * A pointer to the mixer input if it exists, otherwise NULL. |
| */ |
| struct mixer_control * |
| cras_alsa_jack_get_mixer_input(const struct cras_alsa_jack *jack); |
| |
| /* Query all jacks in the list and report the state to the callback. |
| * Args: |
| * jack_list - The jack list to query. |
| */ |
| void cras_alsa_jack_list_report(const struct cras_alsa_jack_list *jack_list); |
| |
| /* Gets the name of a jack. |
| * Args: |
| * jack_list - The jack list to query. |
| */ |
| const char *cras_alsa_jack_get_name(const struct cras_alsa_jack *jack); |
| |
| /* Gets the ucm device of a jack. |
| * Args: |
| * jack - The alsa jack. |
| */ |
| const char *cras_alsa_jack_get_ucm_device(const struct cras_alsa_jack *jack); |
| |
| void cras_alsa_jack_update_monitor_name(const struct cras_alsa_jack *jack, |
| char *name_buf, unsigned int buf_size); |
| |
| /* Updates the node type according to override_type_name in jack. |
| * Currently this method only supports updating the node type to |
| * CRAS_NODE_TYPE_INTERNAL_SPEAKER when override_type_name is |
| * "Internal Speaker". This is used in All-In-One device where |
| * output is an HDMI device, but it should be internal speaker from |
| * user point of view. |
| * Args: |
| * jack - The jack to query node type. |
| * type - The node type to be overwritten. |
| */ |
| void cras_alsa_jack_update_node_type(const struct cras_alsa_jack *jack, |
| enum CRAS_NODE_TYPE *type); |
| |
| /* Enables the ucm device for this jack if any. |
| * Args: |
| * jack - The jack to query for a mixer output. |
| */ |
| void cras_alsa_jack_enable_ucm(const struct cras_alsa_jack *jack, int enable); |
| |
| /* Find out whether the specified card has a jack with the given name. |
| * Args: |
| * card_index - Index ALSA uses to refer to the card. The X in "hw:X". |
| * jack_name - The name of the jack (for example, "Speaker Phantom Jack"). |
| */ |
| int cras_alsa_jack_exists(unsigned int card_index, const char *jack_name); |
| |
| #endif /* CRAS_ALSA_JACK_H_ */ |