text: /* 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_ */
  