1*278f064eSEduardo Habkost /* SPDX-License-Identifier: BSD-3-Clause */
2*278f064eSEduardo Habkost /*
3*278f064eSEduardo Habkost  * Copyright (C) 2021 OpenSynergy GmbH
4*278f064eSEduardo Habkost  */
5*278f064eSEduardo Habkost #ifndef VIRTIO_SND_IF_H
6*278f064eSEduardo Habkost #define VIRTIO_SND_IF_H
7*278f064eSEduardo Habkost 
8*278f064eSEduardo Habkost #include "standard-headers/linux/virtio_types.h"
9*278f064eSEduardo Habkost 
10*278f064eSEduardo Habkost /*******************************************************************************
11*278f064eSEduardo Habkost  * CONFIGURATION SPACE
12*278f064eSEduardo Habkost  */
13*278f064eSEduardo Habkost struct virtio_snd_config {
14*278f064eSEduardo Habkost 	/* # of available physical jacks */
15*278f064eSEduardo Habkost 	uint32_t jacks;
16*278f064eSEduardo Habkost 	/* # of available PCM streams */
17*278f064eSEduardo Habkost 	uint32_t streams;
18*278f064eSEduardo Habkost 	/* # of available channel maps */
19*278f064eSEduardo Habkost 	uint32_t chmaps;
20*278f064eSEduardo Habkost };
21*278f064eSEduardo Habkost 
22*278f064eSEduardo Habkost enum {
23*278f064eSEduardo Habkost 	/* device virtqueue indexes */
24*278f064eSEduardo Habkost 	VIRTIO_SND_VQ_CONTROL = 0,
25*278f064eSEduardo Habkost 	VIRTIO_SND_VQ_EVENT,
26*278f064eSEduardo Habkost 	VIRTIO_SND_VQ_TX,
27*278f064eSEduardo Habkost 	VIRTIO_SND_VQ_RX,
28*278f064eSEduardo Habkost 	/* # of device virtqueues */
29*278f064eSEduardo Habkost 	VIRTIO_SND_VQ_MAX
30*278f064eSEduardo Habkost };
31*278f064eSEduardo Habkost 
32*278f064eSEduardo Habkost /*******************************************************************************
33*278f064eSEduardo Habkost  * COMMON DEFINITIONS
34*278f064eSEduardo Habkost  */
35*278f064eSEduardo Habkost 
36*278f064eSEduardo Habkost /* supported dataflow directions */
37*278f064eSEduardo Habkost enum {
38*278f064eSEduardo Habkost 	VIRTIO_SND_D_OUTPUT = 0,
39*278f064eSEduardo Habkost 	VIRTIO_SND_D_INPUT
40*278f064eSEduardo Habkost };
41*278f064eSEduardo Habkost 
42*278f064eSEduardo Habkost enum {
43*278f064eSEduardo Habkost 	/* jack control request types */
44*278f064eSEduardo Habkost 	VIRTIO_SND_R_JACK_INFO = 1,
45*278f064eSEduardo Habkost 	VIRTIO_SND_R_JACK_REMAP,
46*278f064eSEduardo Habkost 
47*278f064eSEduardo Habkost 	/* PCM control request types */
48*278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_INFO = 0x0100,
49*278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_SET_PARAMS,
50*278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_PREPARE,
51*278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_RELEASE,
52*278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_START,
53*278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_STOP,
54*278f064eSEduardo Habkost 
55*278f064eSEduardo Habkost 	/* channel map control request types */
56*278f064eSEduardo Habkost 	VIRTIO_SND_R_CHMAP_INFO = 0x0200,
57*278f064eSEduardo Habkost 
58*278f064eSEduardo Habkost 	/* jack event types */
59*278f064eSEduardo Habkost 	VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000,
60*278f064eSEduardo Habkost 	VIRTIO_SND_EVT_JACK_DISCONNECTED,
61*278f064eSEduardo Habkost 
62*278f064eSEduardo Habkost 	/* PCM event types */
63*278f064eSEduardo Habkost 	VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100,
64*278f064eSEduardo Habkost 	VIRTIO_SND_EVT_PCM_XRUN,
65*278f064eSEduardo Habkost 
66*278f064eSEduardo Habkost 	/* common status codes */
67*278f064eSEduardo Habkost 	VIRTIO_SND_S_OK = 0x8000,
68*278f064eSEduardo Habkost 	VIRTIO_SND_S_BAD_MSG,
69*278f064eSEduardo Habkost 	VIRTIO_SND_S_NOT_SUPP,
70*278f064eSEduardo Habkost 	VIRTIO_SND_S_IO_ERR
71*278f064eSEduardo Habkost };
72*278f064eSEduardo Habkost 
73*278f064eSEduardo Habkost /* common header */
74*278f064eSEduardo Habkost struct virtio_snd_hdr {
75*278f064eSEduardo Habkost 	uint32_t code;
76*278f064eSEduardo Habkost };
77*278f064eSEduardo Habkost 
78*278f064eSEduardo Habkost /* event notification */
79*278f064eSEduardo Habkost struct virtio_snd_event {
80*278f064eSEduardo Habkost 	/* VIRTIO_SND_EVT_XXX */
81*278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
82*278f064eSEduardo Habkost 	/* optional event data */
83*278f064eSEduardo Habkost 	uint32_t data;
84*278f064eSEduardo Habkost };
85*278f064eSEduardo Habkost 
86*278f064eSEduardo Habkost /* common control request to query an item information */
87*278f064eSEduardo Habkost struct virtio_snd_query_info {
88*278f064eSEduardo Habkost 	/* VIRTIO_SND_R_XXX_INFO */
89*278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
90*278f064eSEduardo Habkost 	/* item start identifier */
91*278f064eSEduardo Habkost 	uint32_t start_id;
92*278f064eSEduardo Habkost 	/* item count to query */
93*278f064eSEduardo Habkost 	uint32_t count;
94*278f064eSEduardo Habkost 	/* item information size in bytes */
95*278f064eSEduardo Habkost 	uint32_t size;
96*278f064eSEduardo Habkost };
97*278f064eSEduardo Habkost 
98*278f064eSEduardo Habkost /* common item information header */
99*278f064eSEduardo Habkost struct virtio_snd_info {
100*278f064eSEduardo Habkost 	/* function group node id (High Definition Audio Specification 7.1.2) */
101*278f064eSEduardo Habkost 	uint32_t hda_fn_nid;
102*278f064eSEduardo Habkost };
103*278f064eSEduardo Habkost 
104*278f064eSEduardo Habkost /*******************************************************************************
105*278f064eSEduardo Habkost  * JACK CONTROL MESSAGES
106*278f064eSEduardo Habkost  */
107*278f064eSEduardo Habkost struct virtio_snd_jack_hdr {
108*278f064eSEduardo Habkost 	/* VIRTIO_SND_R_JACK_XXX */
109*278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
110*278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::jacks - 1 */
111*278f064eSEduardo Habkost 	uint32_t jack_id;
112*278f064eSEduardo Habkost };
113*278f064eSEduardo Habkost 
114*278f064eSEduardo Habkost /* supported jack features */
115*278f064eSEduardo Habkost enum {
116*278f064eSEduardo Habkost 	VIRTIO_SND_JACK_F_REMAP = 0
117*278f064eSEduardo Habkost };
118*278f064eSEduardo Habkost 
119*278f064eSEduardo Habkost struct virtio_snd_jack_info {
120*278f064eSEduardo Habkost 	/* common header */
121*278f064eSEduardo Habkost 	struct virtio_snd_info hdr;
122*278f064eSEduardo Habkost 	/* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */
123*278f064eSEduardo Habkost 	uint32_t features;
124*278f064eSEduardo Habkost 	/* pin configuration (High Definition Audio Specification 7.3.3.31) */
125*278f064eSEduardo Habkost 	uint32_t hda_reg_defconf;
126*278f064eSEduardo Habkost 	/* pin capabilities (High Definition Audio Specification 7.3.4.9) */
127*278f064eSEduardo Habkost 	uint32_t hda_reg_caps;
128*278f064eSEduardo Habkost 	/* current jack connection status (0: disconnected, 1: connected) */
129*278f064eSEduardo Habkost 	uint8_t connected;
130*278f064eSEduardo Habkost 
131*278f064eSEduardo Habkost 	uint8_t padding[7];
132*278f064eSEduardo Habkost };
133*278f064eSEduardo Habkost 
134*278f064eSEduardo Habkost /* jack remapping control request */
135*278f064eSEduardo Habkost struct virtio_snd_jack_remap {
136*278f064eSEduardo Habkost 	/* .code = VIRTIO_SND_R_JACK_REMAP */
137*278f064eSEduardo Habkost 	struct virtio_snd_jack_hdr hdr;
138*278f064eSEduardo Habkost 	/* selected association number */
139*278f064eSEduardo Habkost 	uint32_t association;
140*278f064eSEduardo Habkost 	/* selected sequence number */
141*278f064eSEduardo Habkost 	uint32_t sequence;
142*278f064eSEduardo Habkost };
143*278f064eSEduardo Habkost 
144*278f064eSEduardo Habkost /*******************************************************************************
145*278f064eSEduardo Habkost  * PCM CONTROL MESSAGES
146*278f064eSEduardo Habkost  */
147*278f064eSEduardo Habkost struct virtio_snd_pcm_hdr {
148*278f064eSEduardo Habkost 	/* VIRTIO_SND_R_PCM_XXX */
149*278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
150*278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::streams - 1 */
151*278f064eSEduardo Habkost 	uint32_t stream_id;
152*278f064eSEduardo Habkost };
153*278f064eSEduardo Habkost 
154*278f064eSEduardo Habkost /* supported PCM stream features */
155*278f064eSEduardo Habkost enum {
156*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_SHMEM_HOST = 0,
157*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_SHMEM_GUEST,
158*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_MSG_POLLING,
159*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS,
160*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_EVT_XRUNS
161*278f064eSEduardo Habkost };
162*278f064eSEduardo Habkost 
163*278f064eSEduardo Habkost /* supported PCM sample formats */
164*278f064eSEduardo Habkost enum {
165*278f064eSEduardo Habkost 	/* analog formats (width / physical width) */
166*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0,	/*  4 /  4 bits */
167*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_MU_LAW,		/*  8 /  8 bits */
168*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_A_LAW,		/*  8 /  8 bits */
169*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S8,			/*  8 /  8 bits */
170*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U8,			/*  8 /  8 bits */
171*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S16,			/* 16 / 16 bits */
172*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U16,			/* 16 / 16 bits */
173*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S18_3,		/* 18 / 24 bits */
174*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U18_3,		/* 18 / 24 bits */
175*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S20_3,		/* 20 / 24 bits */
176*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U20_3,		/* 20 / 24 bits */
177*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S24_3,		/* 24 / 24 bits */
178*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U24_3,		/* 24 / 24 bits */
179*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S20,			/* 20 / 32 bits */
180*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U20,			/* 20 / 32 bits */
181*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S24,			/* 24 / 32 bits */
182*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U24,			/* 24 / 32 bits */
183*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S32,			/* 32 / 32 bits */
184*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U32,			/* 32 / 32 bits */
185*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_FLOAT,		/* 32 / 32 bits */
186*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_FLOAT64,		/* 64 / 64 bits */
187*278f064eSEduardo Habkost 	/* digital formats (width / physical width) */
188*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_DSD_U8,		/*  8 /  8 bits */
189*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_DSD_U16,		/* 16 / 16 bits */
190*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_DSD_U32,		/* 32 / 32 bits */
191*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME	/* 32 / 32 bits */
192*278f064eSEduardo Habkost };
193*278f064eSEduardo Habkost 
194*278f064eSEduardo Habkost /* supported PCM frame rates */
195*278f064eSEduardo Habkost enum {
196*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_5512 = 0,
197*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_8000,
198*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_11025,
199*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_16000,
200*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_22050,
201*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_32000,
202*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_44100,
203*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_48000,
204*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_64000,
205*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_88200,
206*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_96000,
207*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_176400,
208*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_192000,
209*278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_384000
210*278f064eSEduardo Habkost };
211*278f064eSEduardo Habkost 
212*278f064eSEduardo Habkost struct virtio_snd_pcm_info {
213*278f064eSEduardo Habkost 	/* common header */
214*278f064eSEduardo Habkost 	struct virtio_snd_info hdr;
215*278f064eSEduardo Habkost 	/* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
216*278f064eSEduardo Habkost 	uint32_t features;
217*278f064eSEduardo Habkost 	/* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */
218*278f064eSEduardo Habkost 	uint64_t formats;
219*278f064eSEduardo Habkost 	/* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */
220*278f064eSEduardo Habkost 	uint64_t rates;
221*278f064eSEduardo Habkost 	/* dataflow direction (VIRTIO_SND_D_XXX) */
222*278f064eSEduardo Habkost 	uint8_t direction;
223*278f064eSEduardo Habkost 	/* minimum # of supported channels */
224*278f064eSEduardo Habkost 	uint8_t channels_min;
225*278f064eSEduardo Habkost 	/* maximum # of supported channels */
226*278f064eSEduardo Habkost 	uint8_t channels_max;
227*278f064eSEduardo Habkost 
228*278f064eSEduardo Habkost 	uint8_t padding[5];
229*278f064eSEduardo Habkost };
230*278f064eSEduardo Habkost 
231*278f064eSEduardo Habkost /* set PCM stream format */
232*278f064eSEduardo Habkost struct virtio_snd_pcm_set_params {
233*278f064eSEduardo Habkost 	/* .code = VIRTIO_SND_R_PCM_SET_PARAMS */
234*278f064eSEduardo Habkost 	struct virtio_snd_pcm_hdr hdr;
235*278f064eSEduardo Habkost 	/* size of the hardware buffer */
236*278f064eSEduardo Habkost 	uint32_t buffer_bytes;
237*278f064eSEduardo Habkost 	/* size of the hardware period */
238*278f064eSEduardo Habkost 	uint32_t period_bytes;
239*278f064eSEduardo Habkost 	/* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
240*278f064eSEduardo Habkost 	uint32_t features;
241*278f064eSEduardo Habkost 	/* selected # of channels */
242*278f064eSEduardo Habkost 	uint8_t channels;
243*278f064eSEduardo Habkost 	/* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */
244*278f064eSEduardo Habkost 	uint8_t format;
245*278f064eSEduardo Habkost 	/* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */
246*278f064eSEduardo Habkost 	uint8_t rate;
247*278f064eSEduardo Habkost 
248*278f064eSEduardo Habkost 	uint8_t padding;
249*278f064eSEduardo Habkost };
250*278f064eSEduardo Habkost 
251*278f064eSEduardo Habkost /*******************************************************************************
252*278f064eSEduardo Habkost  * PCM I/O MESSAGES
253*278f064eSEduardo Habkost  */
254*278f064eSEduardo Habkost 
255*278f064eSEduardo Habkost /* I/O request header */
256*278f064eSEduardo Habkost struct virtio_snd_pcm_xfer {
257*278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::streams - 1 */
258*278f064eSEduardo Habkost 	uint32_t stream_id;
259*278f064eSEduardo Habkost };
260*278f064eSEduardo Habkost 
261*278f064eSEduardo Habkost /* I/O request status */
262*278f064eSEduardo Habkost struct virtio_snd_pcm_status {
263*278f064eSEduardo Habkost 	/* VIRTIO_SND_S_XXX */
264*278f064eSEduardo Habkost 	uint32_t status;
265*278f064eSEduardo Habkost 	/* current device latency */
266*278f064eSEduardo Habkost 	uint32_t latency_bytes;
267*278f064eSEduardo Habkost };
268*278f064eSEduardo Habkost 
269*278f064eSEduardo Habkost /*******************************************************************************
270*278f064eSEduardo Habkost  * CHANNEL MAP CONTROL MESSAGES
271*278f064eSEduardo Habkost  */
272*278f064eSEduardo Habkost struct virtio_snd_chmap_hdr {
273*278f064eSEduardo Habkost 	/* VIRTIO_SND_R_CHMAP_XXX */
274*278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
275*278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::chmaps - 1 */
276*278f064eSEduardo Habkost 	uint32_t chmap_id;
277*278f064eSEduardo Habkost };
278*278f064eSEduardo Habkost 
279*278f064eSEduardo Habkost /* standard channel position definition */
280*278f064eSEduardo Habkost enum {
281*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_NONE = 0,	/* undefined */
282*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_NA,		/* silent */
283*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_MONO,		/* mono stream */
284*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FL,		/* front left */
285*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FR,		/* front right */
286*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RL,		/* rear left */
287*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RR,		/* rear right */
288*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FC,		/* front center */
289*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_LFE,		/* low frequency (LFE) */
290*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_SL,		/* side left */
291*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_SR,		/* side right */
292*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RC,		/* rear center */
293*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FLC,		/* front left center */
294*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FRC,		/* front right center */
295*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RLC,		/* rear left center */
296*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RRC,		/* rear right center */
297*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FLW,		/* front left wide */
298*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FRW,		/* front right wide */
299*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FLH,		/* front left high */
300*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FCH,		/* front center high */
301*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FRH,		/* front right high */
302*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TC,		/* top center */
303*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFL,		/* top front left */
304*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFR,		/* top front right */
305*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFC,		/* top front center */
306*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TRL,		/* top rear left */
307*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TRR,		/* top rear right */
308*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TRC,		/* top rear center */
309*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFLC,		/* top front left center */
310*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFRC,		/* top front right center */
311*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TSL,		/* top side left */
312*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TSR,		/* top side right */
313*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_LLFE,		/* left LFE */
314*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RLFE,		/* right LFE */
315*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_BC,		/* bottom center */
316*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_BLC,		/* bottom left center */
317*278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_BRC		/* bottom right center */
318*278f064eSEduardo Habkost };
319*278f064eSEduardo Habkost 
320*278f064eSEduardo Habkost /* maximum possible number of channels */
321*278f064eSEduardo Habkost #define VIRTIO_SND_CHMAP_MAX_SIZE	18
322*278f064eSEduardo Habkost 
323*278f064eSEduardo Habkost struct virtio_snd_chmap_info {
324*278f064eSEduardo Habkost 	/* common header */
325*278f064eSEduardo Habkost 	struct virtio_snd_info hdr;
326*278f064eSEduardo Habkost 	/* dataflow direction (VIRTIO_SND_D_XXX) */
327*278f064eSEduardo Habkost 	uint8_t direction;
328*278f064eSEduardo Habkost 	/* # of valid channel position values */
329*278f064eSEduardo Habkost 	uint8_t channels;
330*278f064eSEduardo Habkost 	/* channel position values (VIRTIO_SND_CHMAP_XXX) */
331*278f064eSEduardo Habkost 	uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE];
332*278f064eSEduardo Habkost };
333*278f064eSEduardo Habkost 
334*278f064eSEduardo Habkost #endif /* VIRTIO_SND_IF_H */
335