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