^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifndef __UAPI_SOUND_TLV_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define __UAPI_SOUND_TLV_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define SNDRV_CTL_TLVT_CONTAINER 0 /* one level down - group of TLVs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define SNDRV_CTL_TLVT_DB_SCALE 1 /* dB scale */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define SNDRV_CTL_TLVT_DB_LINEAR 2 /* linear volume */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define SNDRV_CTL_TLVT_DB_RANGE 3 /* dB range container */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define SNDRV_CTL_TLVT_DB_MINMAX 4 /* dB scale with min/max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5 /* dB scale with min/max with mute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * channel-mapping TLV items
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * TLV length must match with num_channels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define SNDRV_CTL_TLVT_CHMAP_FIXED 0x101 /* fixed channel position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define SNDRV_CTL_TLVT_CHMAP_VAR 0x102 /* channels freely swappable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define SNDRV_CTL_TLVT_CHMAP_PAIRED 0x103 /* pair-wise swappable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * TLV structure is right behind the struct snd_ctl_tlv:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * unsigned int type - see SNDRV_CTL_TLVT_*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * unsigned int length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * .... data aligned to sizeof(unsigned int), use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * block_length = (length + (sizeof(unsigned int) - 1)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * ~(sizeof(unsigned int) - 1)) ....
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define SNDRV_CTL_TLVD_ITEM(type, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) (type), SNDRV_CTL_TLVD_LENGTH(__VA_ARGS__), __VA_ARGS__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define SNDRV_CTL_TLVD_LENGTH(...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ }))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* Accessor offsets for TLV data items */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define SNDRV_CTL_TLVO_TYPE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define SNDRV_CTL_TLVO_LEN 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define SNDRV_CTL_TLVD_CONTAINER_ITEM(...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define SNDRV_CTL_TLVD_DECLARE_CONTAINER(name, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) unsigned int name[] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) SNDRV_CTL_TLVD_CONTAINER_ITEM(__VA_ARGS__) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define SNDRV_CTL_TLVD_DB_SCALE_MASK 0xffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define SNDRV_CTL_TLVD_DB_SCALE_MUTE 0x10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_SCALE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) (min), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ((step) & SNDRV_CTL_TLVD_DB_SCALE_MASK) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ((mute) ? SNDRV_CTL_TLVD_DB_SCALE_MUTE : 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define SNDRV_CTL_TLVD_DECLARE_DB_SCALE(name, min, step, mute) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) unsigned int name[] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /* Accessor offsets for min, mute and step items in dB scale type TLV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define SNDRV_CTL_TLVO_DB_SCALE_MIN 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* dB scale specified with min/max values instead of step */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(name, min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) unsigned int name[] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX_MUTE(name, min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned int name[] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /* Accessor offsets for min, max items in db-minmax types of TLV. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define SNDRV_CTL_TLVO_DB_MINMAX_MIN 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define SNDRV_CTL_TLVO_DB_MINMAX_MAX 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* linear volume between min_dB and max_dB (.01dB unit) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define SNDRV_CTL_TLVD_DECLARE_DB_LINEAR(name, min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) unsigned int name[] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* Accessor offsets for min, max items in db-linear type of TLV. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define SNDRV_CTL_TLVO_DB_LINEAR_MIN 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define SNDRV_CTL_TLVO_DB_LINEAR_MAX 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* dB range container:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * Items in dB range container must be ordered by their values and by their
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * dB values. This implies that larger values must correspond with larger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * dB values (which is also required for all other mixer controls).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* Each item is: <min> <max> <TLV> */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define SNDRV_CTL_TLVD_DB_RANGE_ITEM(...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define SNDRV_CTL_TLVD_DECLARE_DB_RANGE(name, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) unsigned int name[] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) SNDRV_CTL_TLVD_DB_RANGE_ITEM(__VA_ARGS__) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define SNDRV_CTL_TLVD_DB_GAIN_MUTE -9999999
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #endif