[alsa-devel] [PATCH] add channel order setting interface in asoc core
Hi Mark, As discussed, I am adding a patch to add an interface to set the relationship between audio channel No. and slot No. The interface should be really useful because nobody can ensure audio channel n always uses slot n in all platforms. And for some devices, the relationship even can change with sound mode switch in 2.1,3.1,4.1,5.1,6.1,7.1. After the patch is applied, I can change bfin stuff based on it. Thanks, Barry
Signed-off-by: Barry Song 21cnbao@gmail.com --- include/sound/soc-dai.h | 5 +++++ sound/soc/soc-core.c | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index 97ca9af..7439425 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h @@ -114,6 +114,9 @@ int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt); int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
+int snd_soc_dai_set_channel_order(struct snd_soc_dai *dai, + unsigned int num, unsigned int *slot); + int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
/* Digital Audio Interface mute */ @@ -148,6 +151,8 @@ struct snd_soc_dai_ops { int (*set_tdm_slot)(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width); + int (*set_channel_order)(struct snd_soc_dai *dai, + unsigned int num, unsigned int *slot); int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
/* diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 7ff04ad..30d0143 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2251,6 +2251,24 @@ int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot);
/** + * snd_soc_dai_set_channel_order - configure DAI audio channel order + * @dai: DAI + * @num: how many channels + * @slot: pointer to an array which imply the slot number channel 0~num-1 uses + * + * configure the relationship between channel number and TDM slot number. + */ +int snd_soc_dai_set_channel_order(struct snd_soc_dai *dai, + unsigned int num, unsigned int *slot) +{ + if (dai->ops && dai->ops->set_tdm_slot) + return dai->ops->set_channel_order(dai, num, slot); + else + return -EINVAL; +} +EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_order); + +/** * snd_soc_dai_set_tristate - configure DAI system or master clock. * @dai: DAI * @tristate: tristate enable
On Fri, Sep 11, 2009 at 05:03:42PM +0800, Barry Song wrote:
As discussed, I am adding a patch to add an interface to set the relationship between audio channel No. and slot No. The interface should be really useful because nobody can ensure audio channel n always uses slot n in all platforms. And for some devices, the relationship even can change with sound mode switch in 2.1,3.1,4.1,5.1,6.1,7.1. After the patch is applied, I can change bfin stuff based on it.
This is the right idea but some updates would be nice:
/**
- snd_soc_dai_set_channel_order - configure DAI audio channel order
Please rename to snd_soc_dai_set_channel_map.
- @dai: DAI
- @num: how many channels
- @slot: pointer to an array which imply the slot number channel 0~num-1 uses
- configure the relationship between channel number and TDM slot number.
I'd say something line
'Pointer to an array of data sources. Each element specifies the data slot in the source data which will be used for that slot index in the output data.'
It'd also be better if the API separate transmit and receive mappings - having separate tx_num, tx_slot and rx_num, rx_slot should do the trick.
participants (2)
-
Barry Song
-
Mark Brown