diff options
Diffstat (limited to 'include/sound/sof/control.h')
| -rw-r--r-- | include/sound/sof/control.h | 158 | 
1 files changed, 158 insertions, 0 deletions
diff --git a/include/sound/sof/control.h b/include/sound/sof/control.h new file mode 100644 index 000000000000..bded69e696d4 --- /dev/null +++ b/include/sound/sof/control.h @@ -0,0 +1,158 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* + * This file is provided under a dual BSD/GPLv2 license.  When using or + * redistributing this file, you may do so under either license. + * + * Copyright(c) 2018 Intel Corporation. All rights reserved. + */ + +#ifndef __INCLUDE_SOUND_SOF_CONTROL_H__ +#define __INCLUDE_SOUND_SOF_CONTROL_H__ + +#include <uapi/sound/sof/header.h> +#include <sound/sof/header.h> + +/* + * Component Mixers and Controls + */ + +/* channel positions - uses same values as ALSA */ +enum sof_ipc_chmap { +	SOF_CHMAP_UNKNOWN = 0, +	SOF_CHMAP_NA,		/**< N/A, silent */ +	SOF_CHMAP_MONO,		/**< mono stream */ +	SOF_CHMAP_FL,		/**< front left */ +	SOF_CHMAP_FR,		/**< front right */ +	SOF_CHMAP_RL,		/**< rear left */ +	SOF_CHMAP_RR,		/**< rear right */ +	SOF_CHMAP_FC,		/**< front centre */ +	SOF_CHMAP_LFE,		/**< LFE */ +	SOF_CHMAP_SL,		/**< side left */ +	SOF_CHMAP_SR,		/**< side right */ +	SOF_CHMAP_RC,		/**< rear centre */ +	SOF_CHMAP_FLC,		/**< front left centre */ +	SOF_CHMAP_FRC,		/**< front right centre */ +	SOF_CHMAP_RLC,		/**< rear left centre */ +	SOF_CHMAP_RRC,		/**< rear right centre */ +	SOF_CHMAP_FLW,		/**< front left wide */ +	SOF_CHMAP_FRW,		/**< front right wide */ +	SOF_CHMAP_FLH,		/**< front left high */ +	SOF_CHMAP_FCH,		/**< front centre high */ +	SOF_CHMAP_FRH,		/**< front right high */ +	SOF_CHMAP_TC,		/**< top centre */ +	SOF_CHMAP_TFL,		/**< top front left */ +	SOF_CHMAP_TFR,		/**< top front right */ +	SOF_CHMAP_TFC,		/**< top front centre */ +	SOF_CHMAP_TRL,		/**< top rear left */ +	SOF_CHMAP_TRR,		/**< top rear right */ +	SOF_CHMAP_TRC,		/**< top rear centre */ +	SOF_CHMAP_TFLC,		/**< top front left centre */ +	SOF_CHMAP_TFRC,		/**< top front right centre */ +	SOF_CHMAP_TSL,		/**< top side left */ +	SOF_CHMAP_TSR,		/**< top side right */ +	SOF_CHMAP_LLFE,		/**< left LFE */ +	SOF_CHMAP_RLFE,		/**< right LFE */ +	SOF_CHMAP_BC,		/**< bottom centre */ +	SOF_CHMAP_BLC,		/**< bottom left centre */ +	SOF_CHMAP_BRC,		/**< bottom right centre */ +	SOF_CHMAP_LAST = SOF_CHMAP_BRC, +}; + +/* control data type and direction */ +enum sof_ipc_ctrl_type { +	/*  per channel data - uses struct sof_ipc_ctrl_value_chan */ +	SOF_CTRL_TYPE_VALUE_CHAN_GET = 0, +	SOF_CTRL_TYPE_VALUE_CHAN_SET, +	/* component data - uses struct sof_ipc_ctrl_value_comp */ +	SOF_CTRL_TYPE_VALUE_COMP_GET, +	SOF_CTRL_TYPE_VALUE_COMP_SET, +	/* bespoke data - uses struct sof_abi_hdr */ +	SOF_CTRL_TYPE_DATA_GET, +	SOF_CTRL_TYPE_DATA_SET, +}; + +/* control command type */ +enum sof_ipc_ctrl_cmd { +	SOF_CTRL_CMD_VOLUME = 0, /**< maps to ALSA volume style controls */ +	SOF_CTRL_CMD_ENUM,	/**< maps to ALSA enum style controls */ +	SOF_CTRL_CMD_SWITCH,	/**< maps to ALSA switch style controls */ +	SOF_CTRL_CMD_BINARY,	/**< maps to ALSA binary style controls */ +}; + +/* generic channel mapped value data */ +struct sof_ipc_ctrl_value_chan { +	uint32_t channel;	/**< channel map - enum sof_ipc_chmap */ +	uint32_t value; +} __packed; + +/* generic component mapped value data */ +struct sof_ipc_ctrl_value_comp { +	uint32_t index;	/**< component source/sink/control index in control */ +	union { +		uint32_t uvalue; +		int32_t svalue; +	}; +} __packed; + +/* generic control data */ +struct sof_ipc_ctrl_data { +	struct sof_ipc_reply rhdr; +	uint32_t comp_id; + +	/* control access and data type */ +	uint32_t type;		/**< enum sof_ipc_ctrl_type */ +	uint32_t cmd;		/**< enum sof_ipc_ctrl_cmd */ +	uint32_t index;		/**< control index for comps > 1 control */ + +	/* control data - can either be appended or DMAed from host */ +	struct sof_ipc_host_buffer buffer; +	uint32_t num_elems;	/**< in array elems or bytes for data type */ +	uint32_t elems_remaining;	/**< elems remaining if sent in parts */ + +	uint32_t msg_index;	/**< for large messages sent in parts */ + +	/* reserved for future use */ +	uint32_t reserved[6]; + +	/* control data - add new types if needed */ +	union { +		/* channel values can be used by volume type controls */ +		struct sof_ipc_ctrl_value_chan chanv[0]; +		/* component values used by routing controls like mux, mixer */ +		struct sof_ipc_ctrl_value_comp compv[0]; +		/* data can be used by binary controls */ +		struct sof_abi_hdr data[0]; +	}; +} __packed; + +/** Event type */ +enum sof_ipc_ctrl_event_type { +	SOF_CTRL_EVENT_GENERIC = 0,	/**< generic event */ +	SOF_CTRL_EVENT_GENERIC_METADATA,	/**< generic event with metadata */ +	SOF_CTRL_EVENT_KD,	/**< keyword detection event */ +	SOF_CTRL_EVENT_VAD,	/**< voice activity detection event */ +}; + +/** + * Generic notification data. + */ +struct sof_ipc_comp_event { +	struct sof_ipc_reply rhdr; +	uint16_t src_comp_type;	/**< COMP_TYPE_ */ +	uint32_t src_comp_id;	/**< source component id */ +	uint32_t event_type;	/**< event type - SOF_CTRL_EVENT_* */ +	uint32_t num_elems;	/**< in array elems or bytes for data type */ + +	/* reserved for future use */ +	uint32_t reserved[8]; + +	/* control data - add new types if needed */ +	union { +		/* data can be used by binary controls */ +		struct sof_abi_hdr data[0]; +		/* event specific values */ +		uint32_t event_value; +	}; +} __packed; + +#endif  |