Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
  2/*
  3 * This file is provided under a dual BSD/GPLv2 license.  When using or
  4 * redistributing this file, you may do so under either license.
  5 *
  6 * Copyright(c) 2018 Intel Corporation. All rights reserved.
  7 */
  8
  9#ifndef __INCLUDE_SOUND_SOF_CONTROL_H__
 10#define __INCLUDE_SOUND_SOF_CONTROL_H__
 11
 12#include <uapi/sound/sof/header.h>
 13#include <sound/sof/header.h>
 14
 15/*
 16 * Component Mixers and Controls
 17 */
 18
 19/* channel positions - uses same values as ALSA */
 20enum sof_ipc_chmap {
 21	SOF_CHMAP_UNKNOWN = 0,
 22	SOF_CHMAP_NA,		/**< N/A, silent */
 23	SOF_CHMAP_MONO,		/**< mono stream */
 24	SOF_CHMAP_FL,		/**< front left */
 25	SOF_CHMAP_FR,		/**< front right */
 26	SOF_CHMAP_RL,		/**< rear left */
 27	SOF_CHMAP_RR,		/**< rear right */
 28	SOF_CHMAP_FC,		/**< front centre */
 29	SOF_CHMAP_LFE,		/**< LFE */
 30	SOF_CHMAP_SL,		/**< side left */
 31	SOF_CHMAP_SR,		/**< side right */
 32	SOF_CHMAP_RC,		/**< rear centre */
 33	SOF_CHMAP_FLC,		/**< front left centre */
 34	SOF_CHMAP_FRC,		/**< front right centre */
 35	SOF_CHMAP_RLC,		/**< rear left centre */
 36	SOF_CHMAP_RRC,		/**< rear right centre */
 37	SOF_CHMAP_FLW,		/**< front left wide */
 38	SOF_CHMAP_FRW,		/**< front right wide */
 39	SOF_CHMAP_FLH,		/**< front left high */
 40	SOF_CHMAP_FCH,		/**< front centre high */
 41	SOF_CHMAP_FRH,		/**< front right high */
 42	SOF_CHMAP_TC,		/**< top centre */
 43	SOF_CHMAP_TFL,		/**< top front left */
 44	SOF_CHMAP_TFR,		/**< top front right */
 45	SOF_CHMAP_TFC,		/**< top front centre */
 46	SOF_CHMAP_TRL,		/**< top rear left */
 47	SOF_CHMAP_TRR,		/**< top rear right */
 48	SOF_CHMAP_TRC,		/**< top rear centre */
 49	SOF_CHMAP_TFLC,		/**< top front left centre */
 50	SOF_CHMAP_TFRC,		/**< top front right centre */
 51	SOF_CHMAP_TSL,		/**< top side left */
 52	SOF_CHMAP_TSR,		/**< top side right */
 53	SOF_CHMAP_LLFE,		/**< left LFE */
 54	SOF_CHMAP_RLFE,		/**< right LFE */
 55	SOF_CHMAP_BC,		/**< bottom centre */
 56	SOF_CHMAP_BLC,		/**< bottom left centre */
 57	SOF_CHMAP_BRC,		/**< bottom right centre */
 58	SOF_CHMAP_LAST = SOF_CHMAP_BRC,
 59};
 60
 61/* control data type and direction */
 62enum sof_ipc_ctrl_type {
 63	/*  per channel data - uses struct sof_ipc_ctrl_value_chan */
 64	SOF_CTRL_TYPE_VALUE_CHAN_GET = 0,
 65	SOF_CTRL_TYPE_VALUE_CHAN_SET,
 66	/* component data - uses struct sof_ipc_ctrl_value_comp */
 67	SOF_CTRL_TYPE_VALUE_COMP_GET,
 68	SOF_CTRL_TYPE_VALUE_COMP_SET,
 69	/* bespoke data - uses struct sof_abi_hdr */
 70	SOF_CTRL_TYPE_DATA_GET,
 71	SOF_CTRL_TYPE_DATA_SET,
 72};
 73
 74/* control command type */
 75enum sof_ipc_ctrl_cmd {
 76	SOF_CTRL_CMD_VOLUME = 0, /**< maps to ALSA volume style controls */
 77	SOF_CTRL_CMD_ENUM,	/**< maps to ALSA enum style controls */
 78	SOF_CTRL_CMD_SWITCH,	/**< maps to ALSA switch style controls */
 79	SOF_CTRL_CMD_BINARY,	/**< maps to ALSA binary style controls */
 80};
 81
 82/* generic channel mapped value data */
 83struct sof_ipc_ctrl_value_chan {
 84	uint32_t channel;	/**< channel map - enum sof_ipc_chmap */
 85	uint32_t value;
 86} __packed;
 87
 88/* generic component mapped value data */
 89struct sof_ipc_ctrl_value_comp {
 90	uint32_t index;	/**< component source/sink/control index in control */
 91	union {
 92		uint32_t uvalue;
 93		int32_t svalue;
 94	};
 95} __packed;
 96
 97/* generic control data */
 98struct sof_ipc_ctrl_data {
 99	struct sof_ipc_reply rhdr;
100	uint32_t comp_id;
101
102	/* control access and data type */
103	uint32_t type;		/**< enum sof_ipc_ctrl_type */
104	uint32_t cmd;		/**< enum sof_ipc_ctrl_cmd */
105	uint32_t index;		/**< control index for comps > 1 control */
106
107	/* control data - can either be appended or DMAed from host */
108	struct sof_ipc_host_buffer buffer;
109	uint32_t num_elems;	/**< in array elems or bytes for data type */
110	uint32_t elems_remaining;	/**< elems remaining if sent in parts */
111
112	uint32_t msg_index;	/**< for large messages sent in parts */
113
114	/* reserved for future use */
115	uint32_t reserved[6];
116
117	/* control data - add new types if needed */
118	union {
119		/* channel values can be used by volume type controls */
120		DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_chan, chanv);
121		/* component values used by routing controls like mux, mixer */
122		DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_comp, compv);
123		/* data can be used by binary controls */
124		DECLARE_FLEX_ARRAY(struct sof_abi_hdr, data);
125	};
126} __packed;
127
128/** Event type */
129enum sof_ipc_ctrl_event_type {
130	SOF_CTRL_EVENT_GENERIC = 0,	/**< generic event */
131	SOF_CTRL_EVENT_GENERIC_METADATA,	/**< generic event with metadata */
132	SOF_CTRL_EVENT_KD,	/**< keyword detection event */
133	SOF_CTRL_EVENT_VAD,	/**< voice activity detection event */
134};
135
136/**
137 * Generic notification data.
138 */
139struct sof_ipc_comp_event {
140	struct sof_ipc_reply rhdr;
141	uint16_t src_comp_type;	/**< COMP_TYPE_ */
142	uint32_t src_comp_id;	/**< source component id */
143	uint32_t event_type;	/**< event type - SOF_CTRL_EVENT_* */
144	uint32_t num_elems;	/**< in array elems or bytes for data type */
145
146	/* reserved for future use */
147	uint32_t reserved[8];
148
149	/* control data - add new types if needed */
150	union {
151		/* data can be used by binary controls */
152		struct sof_abi_hdr data[0];
153		/* event specific values */
154		uint32_t event_value;
155	};
156} __packed;
157
158#endif