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