/* 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); /* Gets the dsp name of a jack. * Args: * jack_list - The jack list to query. */ const char *cras_alsa_jack_get_dsp_name(const struct cras_alsa_jack *jack); /* 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_ */