You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
4.0 KiB

/* 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 <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#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;
}