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