xref: /linux/include/sound/tlv.h (revision 932ae880)
142750b04SJaroslav Kysela #ifndef __SOUND_TLV_H
242750b04SJaroslav Kysela #define __SOUND_TLV_H
342750b04SJaroslav Kysela 
442750b04SJaroslav Kysela /*
542750b04SJaroslav Kysela  *  Advanced Linux Sound Architecture - ALSA - Driver
6c1017a4cSJaroslav Kysela  *  Copyright (c) 2006 by Jaroslav Kysela <perex@perex.cz>
742750b04SJaroslav Kysela  *
842750b04SJaroslav Kysela  *
942750b04SJaroslav Kysela  *   This program is free software; you can redistribute it and/or modify
1042750b04SJaroslav Kysela  *   it under the terms of the GNU General Public License as published by
1142750b04SJaroslav Kysela  *   the Free Software Foundation; either version 2 of the License, or
1242750b04SJaroslav Kysela  *   (at your option) any later version.
1342750b04SJaroslav Kysela  *
1442750b04SJaroslav Kysela  *   This program is distributed in the hope that it will be useful,
1542750b04SJaroslav Kysela  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
1642750b04SJaroslav Kysela  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1742750b04SJaroslav Kysela  *   GNU General Public License for more details.
1842750b04SJaroslav Kysela  *
1942750b04SJaroslav Kysela  *   You should have received a copy of the GNU General Public License
2042750b04SJaroslav Kysela  *   along with this program; if not, write to the Free Software
2142750b04SJaroslav Kysela  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
2242750b04SJaroslav Kysela  *
2342750b04SJaroslav Kysela  */
2442750b04SJaroslav Kysela 
2542750b04SJaroslav Kysela /*
2642750b04SJaroslav Kysela  * TLV structure is right behind the struct snd_ctl_tlv:
2742750b04SJaroslav Kysela  *   unsigned int type  	- see SNDRV_CTL_TLVT_*
2842750b04SJaroslav Kysela  *   unsigned int length
2942750b04SJaroslav Kysela  *   .... data aligned to sizeof(unsigned int), use
3042750b04SJaroslav Kysela  *        block_length = (length + (sizeof(unsigned int) - 1)) &
3142750b04SJaroslav Kysela  *                       ~(sizeof(unsigned int) - 1)) ....
3242750b04SJaroslav Kysela  */
3342750b04SJaroslav Kysela 
34*932ae880SLiam Girdwood #include <uapi/sound/tlv.h>
3542750b04SJaroslav Kysela 
36b5b9eb54SClemens Ladisch #define TLV_ITEM(type, ...) \
37b5b9eb54SClemens Ladisch 	(type), TLV_LENGTH(__VA_ARGS__), __VA_ARGS__
38b5b9eb54SClemens Ladisch #define TLV_LENGTH(...) \
39b5b9eb54SClemens Ladisch 	((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ }))
40b5b9eb54SClemens Ladisch 
41570aef5dSClemens Ladisch #define TLV_CONTAINER_ITEM(...) \
42570aef5dSClemens Ladisch 	TLV_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__)
43570aef5dSClemens Ladisch #define DECLARE_TLV_CONTAINER(name, ...) \
44570aef5dSClemens Ladisch 	unsigned int name[] = { TLV_CONTAINER_ITEM(__VA_ARGS__) }
45570aef5dSClemens Ladisch 
46c08d9169STakashi Iwai #define TLV_DB_SCALE_MASK	0xffff
47c08d9169STakashi Iwai #define TLV_DB_SCALE_MUTE	0x10000
4855a29af5STakashi Iwai #define TLV_DB_SCALE_ITEM(min, step, mute)			\
49b5b9eb54SClemens Ladisch 	TLV_ITEM(SNDRV_CTL_TLVT_DB_SCALE,			\
50b5b9eb54SClemens Ladisch 		 (min),					\
51b5b9eb54SClemens Ladisch 		 ((step) & TLV_DB_SCALE_MASK) |		\
52b5b9eb54SClemens Ladisch 			((mute) ? TLV_DB_SCALE_MUTE : 0))
5355a29af5STakashi Iwai #define DECLARE_TLV_DB_SCALE(name, min, step, mute) \
5455a29af5STakashi Iwai 	unsigned int name[] = { TLV_DB_SCALE_ITEM(min, step, mute) }
5542750b04SJaroslav Kysela 
56085f3065STakashi Iwai /* dB scale specified with min/max values instead of step */
57085f3065STakashi Iwai #define TLV_DB_MINMAX_ITEM(min_dB, max_dB)			\
58b5b9eb54SClemens Ladisch 	TLV_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))
59085f3065STakashi Iwai #define TLV_DB_MINMAX_MUTE_ITEM(min_dB, max_dB)			\
60b5b9eb54SClemens Ladisch 	TLV_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))
61085f3065STakashi Iwai #define DECLARE_TLV_DB_MINMAX(name, min_dB, max_dB) \
62085f3065STakashi Iwai 	unsigned int name[] = { TLV_DB_MINMAX_ITEM(min_dB, max_dB) }
63085f3065STakashi Iwai #define DECLARE_TLV_DB_MINMAX_MUTE(name, min_dB, max_dB) \
64085f3065STakashi Iwai 	unsigned int name[] = { TLV_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) }
65085f3065STakashi Iwai 
66063a40d9STakashi Iwai /* linear volume between min_dB and max_dB (.01dB unit) */
6755a29af5STakashi Iwai #define TLV_DB_LINEAR_ITEM(min_dB, max_dB)		    \
68b5b9eb54SClemens Ladisch 	TLV_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))
6955a29af5STakashi Iwai #define DECLARE_TLV_DB_LINEAR(name, min_dB, max_dB)	\
7055a29af5STakashi Iwai 	unsigned int name[] = { TLV_DB_LINEAR_ITEM(min_dB, max_dB) }
7155a29af5STakashi Iwai 
72d24f5a9aSDavid Henningsson /* dB range container:
73d24f5a9aSDavid Henningsson  * Items in dB range container must be ordered by their values and by their
74d24f5a9aSDavid Henningsson  * dB values. This implies that larger values must correspond with larger
75d24f5a9aSDavid Henningsson  * dB values (which is also required for all other mixer controls).
76d24f5a9aSDavid Henningsson  */
7755a29af5STakashi Iwai /* Each item is: <min> <max> <TLV> */
78bf1d1c9bSClemens Ladisch #define TLV_DB_RANGE_ITEM(...) \
79bf1d1c9bSClemens Ladisch 	TLV_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
80bf1d1c9bSClemens Ladisch #define DECLARE_TLV_DB_RANGE(name, ...) \
81bf1d1c9bSClemens Ladisch 	unsigned int name[] = { TLV_DB_RANGE_ITEM(__VA_ARGS__) }
8255a29af5STakashi Iwai /* The below assumes that each item TLV is 4 words like DB_SCALE or LINEAR */
8355a29af5STakashi Iwai #define TLV_DB_RANGE_HEAD(num)			\
8455a29af5STakashi Iwai 	SNDRV_CTL_TLVT_DB_RANGE, 6 * (num) * sizeof(unsigned int)
85063a40d9STakashi Iwai 
86063a40d9STakashi Iwai #define TLV_DB_GAIN_MUTE	-9999999
87063a40d9STakashi Iwai 
8842750b04SJaroslav Kysela #endif /* __SOUND_TLV_H */
89