/* snd_card_parser.c ** ** Copyright 2023, The Android Open Source Project ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of The Android Open Source Project nor the names of ** its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ** DAMAGE. */ //#define LOG_NDEBUG 0 #include #include #include #include #include "snd_utils.h" #define ROCKCHIP_PLUGIN_LIB "libvirtualcard.so" #define ROCKCHIP_PLUGIN_CARD_ID 100 struct dev_node { char *name; int device; char *so_name; }; struct card_node { // Official definition ? struct card *next; char *indexstr; char *name; char *device_name; unsigned int card; struct dev_node *dev; }; void* snd_card_def_get_card (unsigned int card) { struct card_node *cnode; if (card < ROCKCHIP_PLUGIN_CARD_ID) return NULL; cnode = calloc(1, sizeof(struct card_node)); if (!cnode) return NULL; cnode->dev = calloc(1, sizeof(struct dev_node)); if (!cnode) { free(cnode); return cnode; } cnode->card = card; return cnode; } void snd_card_def_put_card (void *card) { struct card_node *cnode = (struct card_node *)card; if (cnode == NULL) return ; if (cnode->dev) { free(cnode->dev->so_name); free(cnode->dev->name); free(cnode->dev); } if (cnode != NULL) free(cnode); return ; } void* snd_card_def_get_node (void *card, unsigned int id, int type) { struct dev_node *dnode = NULL; struct card_node *cnode = (struct card_node *)card; switch (type) { case NODE_PCM: { dnode = cnode->dev; dnode->device = id; dnode->name = calloc(1, strlen("dev:00") + 1); sprintf(dnode->name, "dev:%d", id); dnode->so_name = calloc(1, strlen(ROCKCHIP_PLUGIN_LIB) + 1); strncpy(dnode->so_name, ROCKCHIP_PLUGIN_LIB, strlen(ROCKCHIP_PLUGIN_LIB)); }break; case NODE_MIXER: // mixer don't need open virtual node break; default: // Unknown type break; } return dnode; } int snd_card_def_get_int (void *node, const char *prop, int *val) { if (strcmp("type", prop) == 0) *val = SND_NODE_TYPE_PLUGIN; else *val = SND_NODE_TYPE_INVALID; return 0; } int snd_card_def_get_str (void *node, const char *prop, char **val) { struct dev_node *dnode = (struct dev_node *)node; if (strcmp("so-name", prop) == 0) *val = dnode->so_name; else if (strcmp("name", prop) == 0) *val = dnode->name; else *val = NULL; return 0; }