alsa-lib/src/topology/channel.c
Liam Girdwood ec40aafa43 topology: Fix incorrect license in source comments.
The topology source files had the wrong licence specified in the
comments when initially upstreamed. The topology source files are all
licensed under the LGPL-2.1 and not the GPLv2.

All earlier versions of the alsa-lib topology source files must be
considered LGPL-2.1 like the other source files in alsa-lib and also
as specified in the alsa-lib COPYING file.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2017-01-24 18:19:03 +01:00

125 lines
3.8 KiB
C

/*
Copyright(c) 2014-2015 Intel Corporation
All rights reserved.
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
Authors: Mengdong Lin <mengdong.lin@intel.com>
Yao Jin <yao.jin@intel.com>
Liam Girdwood <liam.r.girdwood@linux.intel.com>
*/
#include "list.h"
#include "tplg_local.h"
/* mapping of channel text names to types */
static const struct map_elem channel_map[] = {
{"mono", SNDRV_CHMAP_MONO}, /* mono stream */
{"fl", SNDRV_CHMAP_FL}, /* front left */
{"fr", SNDRV_CHMAP_FR}, /* front right */
{"rl", SNDRV_CHMAP_RL}, /* rear left */
{"rr", SNDRV_CHMAP_RR}, /* rear right */
{"fc", SNDRV_CHMAP_FC}, /* front center */
{"lfe", SNDRV_CHMAP_LFE}, /* LFE */
{"sl", SNDRV_CHMAP_SL}, /* side left */
{"sr", SNDRV_CHMAP_SR}, /* side right */
{"rc", SNDRV_CHMAP_RC}, /* rear center */
{"flc", SNDRV_CHMAP_FLC}, /* front left center */
{"frc", SNDRV_CHMAP_FRC}, /* front right center */
{"rlc", SNDRV_CHMAP_RLC}, /* rear left center */
{"rrc", SNDRV_CHMAP_RRC}, /* rear right center */
{"flw", SNDRV_CHMAP_FLW}, /* front left wide */
{"frw", SNDRV_CHMAP_FRW}, /* front right wide */
{"flh", SNDRV_CHMAP_FLH}, /* front left high */
{"fch", SNDRV_CHMAP_FCH}, /* front center high */
{"frh", SNDRV_CHMAP_FRH}, /* front right high */
{"tc", SNDRV_CHMAP_TC}, /* top center */
{"tfl", SNDRV_CHMAP_TFL}, /* top front left */
{"tfr", SNDRV_CHMAP_TFR}, /* top front right */
{"tfc", SNDRV_CHMAP_TFC}, /* top front center */
{"trl", SNDRV_CHMAP_TRL}, /* top rear left */
{"trr", SNDRV_CHMAP_TRR}, /* top rear right */
{"trc", SNDRV_CHMAP_TRC}, /* top rear center */
{"tflc", SNDRV_CHMAP_TFLC}, /* top front left center */
{"tfrc", SNDRV_CHMAP_TFRC}, /* top front right center */
{"tsl", SNDRV_CHMAP_TSL}, /* top side left */
{"tsr", SNDRV_CHMAP_TSR}, /* top side right */
{"llfe", SNDRV_CHMAP_LLFE}, /* left LFE */
{"rlfe", SNDRV_CHMAP_RLFE}, /* right LFE */
{"bc", SNDRV_CHMAP_BC}, /* bottom center */
{"blc", SNDRV_CHMAP_BLC}, /* bottom left center */
{"brc", SNDRV_CHMAP_BRC}, /* bottom right center */
};
static int lookup_channel(const char *c)
{
unsigned int i;
for (i = 0; i < ARRAY_SIZE(channel_map); i++) {
if (strcasecmp(channel_map[i].name, c) == 0) {
return channel_map[i].id;
}
}
return -EINVAL;
}
/* Parse a channel mapping. */
int tplg_parse_channel(snd_tplg_t *tplg,
snd_config_t *cfg, void *private)
{
snd_config_iterator_t i, next;
snd_config_t *n;
struct snd_soc_tplg_channel *channel = private;
const char *id, *value;
int channel_id;
if (tplg->channel_idx >= SND_SOC_TPLG_MAX_CHAN)
return -EINVAL;
channel += tplg->channel_idx;
snd_config_get_id(cfg, &id);
tplg_dbg("\tChannel %s at index %d\n", id, tplg->channel_idx);
channel_id = lookup_channel(id);
if (channel_id < 0) {
SNDERR("error: invalid channel %s\n", id);
return -EINVAL;
}
channel->id = channel_id;
channel->size = sizeof(*channel);
tplg_dbg("\tChan %s = %d\n", id, channel->id);
snd_config_for_each(i, next, cfg) {
n = snd_config_iterator_entry(i);
/* get id */
if (snd_config_get_id(n, &id) < 0)
continue;
/* get value */
if (snd_config_get_string(n, &value) < 0)
continue;
if (strcmp(id, "reg") == 0)
channel->reg = atoi(value);
else if (strcmp(id, "shift") == 0)
channel->shift = atoi(value);
tplg_dbg("\t\t%s = %s\n", id, value);
}
tplg->channel_idx++;
return 0;
}