/* 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. */ /* * IO list manages the list of inputs and outputs available. */ #ifndef CRAS_IODEV_LIST_H_ #define CRAS_IODEV_LIST_H_ #include <stdint.h> #include "cras_types.h" struct cras_iodev; struct cras_iodev_info; struct cras_ionode; struct cras_rclient; struct cras_rstream; struct cras_audio_format; struct stream_list; /* Device enabled/disabled callback. * enabled=1 when a device is enabled, enabled=0 when a device is disabled. */ typedef void (*device_enabled_callback_t)(struct cras_iodev *dev, int enabled, void *cb_data); /* Initialize the list of iodevs. */ void cras_iodev_list_init(); /* Clean up any resources used by iodev. */ void cras_iodev_list_deinit(); /* Adds an output to the output list. * Args: * output - the output to add. * Returns: * 0 on success, negative error on failure. */ int cras_iodev_list_add_output(struct cras_iodev *output); /* Adds an input to the input list. * Args: * input - the input to add. * Returns: * 0 on success, negative error on failure. */ int cras_iodev_list_add_input(struct cras_iodev *input); /* Removes an output from the output list. * Args: * output - the output to remove. * Returns: * 0 on success, negative error on failure. */ int cras_iodev_list_rm_output(struct cras_iodev *output); /* Removes an input from the input list. * Args: * output - the input to remove. * Returns: * 0 on success, negative error on failure. */ int cras_iodev_list_rm_input(struct cras_iodev *input); /* Gets a list of outputs. Callee must free the list when finished. If list_out * is NULL, this function can be used to return the number of outputs. * Args: * list_out - This will be set to the malloc'd area containing the list of * devices. Ignored if NULL. * Returns: * The number of devices on the list. */ int cras_iodev_list_get_outputs(struct cras_iodev_info **list_out); /* Gets a list of inputs. Callee must free the list when finished. If list_out * is NULL, this function can be used to return the number of inputs. * Args: * list_out - This will be set to the malloc'd area containing the list of * devices. Ignored if NULL. * Returns: * The number of devices on the list. */ int cras_iodev_list_get_inputs(struct cras_iodev_info **list_out); /* Returns the first enabled device. * Args: * direction - Playback or capture. * Returns: * Pointer to the first enabled device of direction. */ struct cras_iodev *cras_iodev_list_get_first_enabled_iodev( enum CRAS_STREAM_DIRECTION direction); /* Returns the active node id. * Args: * direction - Playback or capture. * Returns: * The id of the active node. */ cras_node_id_t cras_iodev_list_get_active_node_id( enum CRAS_STREAM_DIRECTION direction); /* Stores the following data to the shared memory server state region: * (1) device list * (2) node list * (3) selected nodes */ void cras_iodev_list_update_device_list(); /* Stores the node list in the shared memory server state region. */ void cras_iodev_list_update_node_list(); /* Gets the supported hotword models of an ionode. Caller should free * the returned string after use. */ char *cras_iodev_list_get_hotword_models(cras_node_id_t node_id); /* Sets the desired hotword model to an ionode. */ int cras_iodev_list_set_hotword_model(cras_node_id_t id, const char *model_name); /* Notify that nodes are added/removed. */ void cras_iodev_list_notify_nodes_changed(); /* Notify that active node is changed for the given direction. * Args: * direction - Direction of the node. */ void cras_iodev_list_notify_active_node_changed( enum CRAS_STREAM_DIRECTION direction); /* Sets an attribute of an ionode on a device. * Args: * id - the id of the ionode. * node_index - Index of the ionode on the device. * attr - the attribute we want to change. * value - the value we want to set. */ int cras_iodev_list_set_node_attr(cras_node_id_t id, enum ionode_attr attr, int value); /* Select a node as the preferred node. * Args: * direction - Playback or capture. * node_id - the id of the ionode to be selected. As a special case, if * node_id is 0, don't select any node in this direction. */ void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction, cras_node_id_t node_id); /* Checks if an iodev is enabled. */ int cras_iodev_list_dev_is_enabled(const struct cras_iodev *dev); /* Enables an iodev. If the fallback device was already enabled, this * call will disable it. */ void cras_iodev_list_enable_dev(struct cras_iodev *dev); /* Disables an iodev. If this is the last device to disable, the * fallback devices will be enabled accordingly. */ void cras_iodev_list_disable_dev(struct cras_iodev *dev); /* Adds a node to the active devices list. * Args: * direction - Playback or capture. * node_id - The id of the ionode to be added. */ void cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION direction, cras_node_id_t node_id); /* Removes a node from the active devices list. * Args: * direction - Playback or capture. * node_id - The id of the ionode to be removed. */ void cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION direction, cras_node_id_t node_id); /* Returns 1 if the node is selected, 0 otherwise. */ int cras_iodev_list_node_selected(struct cras_ionode *node); /* Notify the current volume of the given node. */ void cras_iodev_list_notify_node_volume(struct cras_ionode *node); /* Notify the current capture gain of the given node. */ void cras_iodev_list_notify_node_capture_gain(struct cras_ionode *node); /* Notify the current left right channel swapping state of the given node. */ void cras_iodev_list_notify_node_left_right_swapped(struct cras_ionode *node); /* Handles the adding and removing of test iodevs. */ void cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type); /* Handles sending a command to a test iodev. */ void cras_iodev_list_test_dev_command(unsigned int iodev_idx, enum CRAS_TEST_IODEV_CMD command, unsigned int data_len, const uint8_t *data); /* Gets the audio thread used by the devices. */ struct audio_thread *cras_iodev_list_get_audio_thread(); /* Gets the list of all active audio streams attached to devices. */ struct stream_list *cras_iodev_list_get_stream_list(); /* Sets the function to call when a device is enabled or disabled. */ int cras_iodev_list_set_device_enabled_callback( device_enabled_callback_t device_enabled_cb, void *cb_data); /* For unit test only. */ void cras_iodev_list_reset(); #endif /* CRAS_IODEV_LIST_H_ */