summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu-Hsuan Hsu <yuhsuan@chromium.org>2021-01-22 14:36:38 +0800
committerCommit Bot <commit-bot@chromium.org>2021-02-22 13:21:55 +0000
commitc24efcecac71ae7daac1729c7a1091766574aba3 (patch)
tree1feb4abc6078474ac150b347dd28ca402eb20f5c
parent5dd5fa742684fe5fec89766417bab9e485a34ec8 (diff)
downloadadhd-c24efcecac71ae7daac1729c7a1091766574aba3.tar.gz
CRAS: Library ABI for node infos
Make nodes query support version skew. BUG=b:176570789 TEST=Verified the audio work fine Change-Id: Ie1d7595e80c0dfd15e8cbaaca4bdc2a723c25f9a Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/2644402 Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org> Commit-Queue: Yu-Hsuan Hsu <yuhsuan@chromium.org> Tested-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
-rw-r--r--cras/src/libcras/cras_client.c166
-rw-r--r--cras/src/libcras/cras_client.h87
2 files changed, 253 insertions, 0 deletions
diff --git a/cras/src/libcras/cras_client.c b/cras/src/libcras/cras_client.c
index c351a80a..7817ba72 100644
--- a/cras/src/libcras/cras_client.c
+++ b/cras/src/libcras/cras_client.c
@@ -3930,6 +3930,54 @@ int cras_client_disable_hotword_callback(struct cras_client *client,
return 0;
}
+int get_nodes(struct cras_client *client, enum CRAS_STREAM_DIRECTION direction,
+ struct libcras_node_info ***nodes, size_t *num)
+{
+ struct cras_iodev_info iodevs[CRAS_MAX_IODEVS];
+ struct cras_ionode_info ionodes[CRAS_MAX_IONODES];
+ size_t num_devs = CRAS_MAX_IODEVS, num_nodes = CRAS_MAX_IONODES;
+ int rc, i, j;
+
+ *num = 0;
+ if (direction == CRAS_STREAM_INPUT) {
+ rc = cras_client_get_input_devices(client, iodevs, ionodes,
+ &num_devs, &num_nodes);
+ } else {
+ rc = cras_client_get_output_devices(client, iodevs, ionodes,
+ &num_devs, &num_nodes);
+ }
+
+ if (rc < 0) {
+ syslog(LOG_ERR, "Failed to get devices: %d", rc);
+ return rc;
+ }
+
+ *nodes = (struct libcras_node_info **)calloc(
+ num_nodes, sizeof(struct libcras_node_info *));
+
+ for (i = 0; i < num_devs; i++) {
+ for (j = 0; j < num_nodes; j++) {
+ if (iodevs[i].idx != ionodes[j].iodev_idx)
+ continue;
+ (*nodes)[*num] = libcras_node_info_create(&iodevs[i],
+ &ionodes[j]);
+ if ((*nodes)[*num] == NULL) {
+ rc = -errno;
+ goto clean;
+ }
+ (*num)++;
+ }
+ }
+ return 0;
+clean:
+ for (i = 0; i < *num; i++)
+ libcras_node_info_destroy((*nodes)[i]);
+ free(*nodes);
+ *nodes = NULL;
+ *num = 0;
+ return rc;
+}
+
struct libcras_client *libcras_client_create()
{
struct libcras_client *client = (struct libcras_client *)calloc(
@@ -3951,6 +3999,7 @@ struct libcras_client *libcras_client_create()
client->add_pinned_stream = cras_client_add_pinned_stream;
client->rm_stream = cras_client_rm_stream;
client->set_stream_volume = cras_client_set_stream_volume;
+ client->get_nodes = get_nodes;
return client;
}
@@ -4020,3 +4069,120 @@ void libcras_stream_params_destroy(struct libcras_stream_params *params)
free(params->params_);
free(params);
}
+
+struct cras_node_info {
+ uint64_t id;
+ uint32_t dev_idx;
+ uint32_t node_idx;
+ uint32_t max_supported_channels;
+ bool plugged;
+ bool active;
+ char type[CRAS_NODE_TYPE_BUFFER_SIZE];
+ char node_name[CRAS_NODE_NAME_BUFFER_SIZE];
+ char dev_name[CRAS_IODEV_NAME_BUFFER_SIZE];
+};
+
+int cras_node_info_get_id(struct cras_node_info *node, uint64_t *id)
+{
+ (*id) = node->id;
+ return 0;
+}
+
+int cras_node_info_get_dev_idx(struct cras_node_info *node, uint32_t *dev_idx)
+{
+ (*dev_idx) = node->dev_idx;
+ return 0;
+}
+
+int cras_node_info_get_node_idx(struct cras_node_info *node, uint32_t *node_idx)
+{
+ (*node_idx) = node->node_idx;
+ return 0;
+}
+
+int cras_node_info_get_max_supported_channels(struct cras_node_info *node,
+ uint32_t *max_supported_channels)
+{
+ (*max_supported_channels) = node->max_supported_channels;
+ return 0;
+}
+
+int cras_node_info_is_plugged(struct cras_node_info *node, bool *is_plugged)
+{
+ (*is_plugged) = node->plugged;
+ return 0;
+}
+
+int cras_node_info_is_active(struct cras_node_info *node, bool *is_active)
+{
+ (*is_active) = node->active;
+ return 0;
+}
+
+int cras_node_info_get_type(struct cras_node_info *node, char **type)
+{
+ (*type) = node->type;
+ return 0;
+}
+
+int cras_node_info_get_node_name(struct cras_node_info *node, char **node_name)
+{
+ (*node_name) = node->node_name;
+ return 0;
+}
+
+int cras_node_info_get_dev_name(struct cras_node_info *node, char **dev_name)
+{
+ (*dev_name) = node->dev_name;
+ return 0;
+}
+
+struct libcras_node_info *
+libcras_node_info_create(struct cras_iodev_info *iodev,
+ struct cras_ionode_info *ionode)
+{
+ struct libcras_node_info *node = (struct libcras_node_info *)calloc(
+ 1, sizeof(struct libcras_node_info));
+ if (!node) {
+ syslog(LOG_ERR, "cras_client: calloc failed");
+ return NULL;
+ }
+ node->node_ = (struct cras_node_info *)calloc(
+ 1, sizeof(struct cras_node_info));
+ if (node->node_ == NULL) {
+ syslog(LOG_ERR, "cras_client: calloc failed");
+ free(node);
+ return NULL;
+ }
+ node->api_version = CRAS_API_VERSION;
+ node->node_->id =
+ cras_make_node_id(ionode->iodev_idx, ionode->ionode_idx);
+ node->node_->dev_idx = ionode->iodev_idx;
+ node->node_->node_idx = ionode->ionode_idx;
+ node->node_->max_supported_channels = iodev->max_supported_channels;
+ node->node_->plugged = ionode->plugged;
+ node->node_->active = ionode->active;
+ strncpy(node->node_->type, ionode->type,
+ CRAS_NODE_TYPE_BUFFER_SIZE - 1);
+ strncpy(node->node_->node_name, ionode->name,
+ CRAS_NODE_NAME_BUFFER_SIZE - 1);
+ strncpy(node->node_->dev_name, iodev->name,
+ CRAS_IODEV_NAME_BUFFER_SIZE - 1);
+ node->get_id = cras_node_info_get_id;
+ node->get_dev_idx = cras_node_info_get_dev_idx;
+ node->get_node_idx = cras_node_info_get_node_idx;
+ node->get_max_supported_channels =
+ cras_node_info_get_max_supported_channels;
+ node->is_plugged = cras_node_info_is_plugged;
+ node->is_active = cras_node_info_is_active;
+ node->get_type = cras_node_info_get_type;
+ node->get_node_name = cras_node_info_get_node_name;
+ node->get_dev_name = cras_node_info_get_dev_name;
+ return node;
+}
+
+void libcras_node_info_destroy(struct libcras_node_info *node)
+{
+ free(node->node_);
+ free(node);
+}
diff --git a/cras/src/libcras/cras_client.h b/cras/src/libcras/cras_client.h
index b60d2697..069929be 100644
--- a/cras/src/libcras/cras_client.h
+++ b/cras/src/libcras/cras_client.h
@@ -1330,6 +1330,21 @@ int cras_client_set_num_active_streams_changed_callback(
return -ENOSYS; \
}
+struct libcras_node_info {
+ int api_version;
+ struct cras_node_info *node_;
+ int (*get_id)(struct cras_node_info *node, uint64_t *id);
+ int (*get_dev_idx)(struct cras_node_info *node, uint32_t *dev_idx);
+ int (*get_node_idx)(struct cras_node_info *node, uint32_t *node_idx);
+ int (*get_max_supported_channels)(struct cras_node_info *node,
+ uint32_t *max_supported_channels);
+ int (*is_plugged)(struct cras_node_info *node, bool *plugged);
+ int (*is_active)(struct cras_node_info *node, bool *active);
+ int (*get_type)(struct cras_node_info *node, char **name);
+ int (*get_node_name)(struct cras_node_info *node, char **name);
+ int (*get_dev_name)(struct cras_node_info *node, char **name);
+};
+
struct libcras_client {
int api_version;
struct cras_client *client_;
@@ -1347,6 +1362,9 @@ struct libcras_client {
int (*set_stream_volume)(struct cras_client *client,
cras_stream_id_t stream_id,
float volume_scaler);
+ int (*get_nodes)(struct cras_client *client,
+ enum CRAS_STREAM_DIRECTION direction,
+ struct libcras_node_info ***nodes, size_t *num);
};
struct cras_stream_cb_data;
@@ -1532,6 +1550,14 @@ inline int libcras_client_set_stream_volume(struct libcras_client *client,
volume_scaler);
}
+inline int libcras_client_get_nodes(struct libcras_client *client,
+ enum CRAS_STREAM_DIRECTION direction,
+ struct libcras_node_info ***nodes,
+ size_t *num)
+{
+ return client->get_nodes(client->client_, direction, nodes, num);
+}
+
/*
* Creates a new struct to save stream params.
* Returns:
@@ -1688,6 +1714,67 @@ libcras_stream_cb_data_get_usr_arg(struct libcras_stream_cb_data *data,
return data->get_user_arg(data->data_, user_arg);
}
+struct libcras_node_info *
+libcras_node_info_create(struct cras_iodev_info *iodev,
+ struct cras_ionode_info *ionode);
+void libcras_node_info_destroy(struct libcras_node_info *node);
+
+inline int libcras_node_info_get_id(struct libcras_node_info *node,
+ uint64_t *id)
+{
+ return node->get_id(node->node_, id);
+}
+
+inline int libcras_node_info_get_dev_idx(struct libcras_node_info *node,
+ uint32_t *dev_idx)
+{
+ return node->get_dev_idx(node->node_, dev_idx);
+}
+
+inline int libcras_node_info_get_node_idx(struct libcras_node_info *node,
+ uint32_t *node_idx)
+{
+ return node->get_node_idx(node->node_, node_idx);
+}
+
+inline int
+libcras_node_info_get_max_supported_channels(struct libcras_node_info *node,
+ uint32_t *max_supported_channels)
+{
+ return node->get_max_supported_channels(node->node_,
+ max_supported_channels);
+}
+
+inline int libcras_node_info_is_plugged(struct libcras_node_info *node,
+ bool *plugged)
+{
+ return node->is_plugged(node->node_, plugged);
+}
+
+inline int libcras_node_info_is_active(struct libcras_node_info *node,
+ bool *active)
+{
+ return node->is_active(node->node_, active);
+}
+
+inline int libcras_node_info_get_type(struct libcras_node_info *node,
+ char **type)
+{
+ return node->get_type(node->node_, type);
+}
+
+inline int libcras_node_info_get_node_name(struct libcras_node_info *node,
+ char **name)
+{
+ return node->get_node_name(node->node_, name);
+}
+
+inline int libcras_node_info_get_dev_name(struct libcras_node_info *node,
+ char **name)
+{
+ return node->get_dev_name(node->node_, name);
+}
+
#ifdef __cplusplus
}
#endif