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
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;
|
|
}
|