1278f064eSEduardo Habkost /* SPDX-License-Identifier: BSD-3-Clause */ 2278f064eSEduardo Habkost /* 3278f064eSEduardo Habkost * Copyright (C) 2021 OpenSynergy GmbH 4278f064eSEduardo Habkost */ 5278f064eSEduardo Habkost #ifndef VIRTIO_SND_IF_H 6278f064eSEduardo Habkost #define VIRTIO_SND_IF_H 7278f064eSEduardo Habkost 8278f064eSEduardo Habkost #include "standard-headers/linux/virtio_types.h" 9278f064eSEduardo Habkost 10278f064eSEduardo Habkost /******************************************************************************* 11*ab0c7fb2SPaolo Bonzini * FEATURE BITS 12*ab0c7fb2SPaolo Bonzini */ 13*ab0c7fb2SPaolo Bonzini enum { 14*ab0c7fb2SPaolo Bonzini /* device supports control elements */ 15*ab0c7fb2SPaolo Bonzini VIRTIO_SND_F_CTLS = 0 16*ab0c7fb2SPaolo Bonzini }; 17*ab0c7fb2SPaolo Bonzini 18*ab0c7fb2SPaolo Bonzini /******************************************************************************* 19278f064eSEduardo Habkost * CONFIGURATION SPACE 20278f064eSEduardo Habkost */ 21278f064eSEduardo Habkost struct virtio_snd_config { 22278f064eSEduardo Habkost /* # of available physical jacks */ 23278f064eSEduardo Habkost uint32_t jacks; 24278f064eSEduardo Habkost /* # of available PCM streams */ 25278f064eSEduardo Habkost uint32_t streams; 26278f064eSEduardo Habkost /* # of available channel maps */ 27278f064eSEduardo Habkost uint32_t chmaps; 28*ab0c7fb2SPaolo Bonzini /* # of available control elements */ 29*ab0c7fb2SPaolo Bonzini uint32_t controls; 30278f064eSEduardo Habkost }; 31278f064eSEduardo Habkost 32278f064eSEduardo Habkost enum { 33278f064eSEduardo Habkost /* device virtqueue indexes */ 34278f064eSEduardo Habkost VIRTIO_SND_VQ_CONTROL = 0, 35278f064eSEduardo Habkost VIRTIO_SND_VQ_EVENT, 36278f064eSEduardo Habkost VIRTIO_SND_VQ_TX, 37278f064eSEduardo Habkost VIRTIO_SND_VQ_RX, 38278f064eSEduardo Habkost /* # of device virtqueues */ 39278f064eSEduardo Habkost VIRTIO_SND_VQ_MAX 40278f064eSEduardo Habkost }; 41278f064eSEduardo Habkost 42278f064eSEduardo Habkost /******************************************************************************* 43278f064eSEduardo Habkost * COMMON DEFINITIONS 44278f064eSEduardo Habkost */ 45278f064eSEduardo Habkost 46278f064eSEduardo Habkost /* supported dataflow directions */ 47278f064eSEduardo Habkost enum { 48278f064eSEduardo Habkost VIRTIO_SND_D_OUTPUT = 0, 49278f064eSEduardo Habkost VIRTIO_SND_D_INPUT 50278f064eSEduardo Habkost }; 51278f064eSEduardo Habkost 52278f064eSEduardo Habkost enum { 53278f064eSEduardo Habkost /* jack control request types */ 54278f064eSEduardo Habkost VIRTIO_SND_R_JACK_INFO = 1, 55278f064eSEduardo Habkost VIRTIO_SND_R_JACK_REMAP, 56278f064eSEduardo Habkost 57278f064eSEduardo Habkost /* PCM control request types */ 58278f064eSEduardo Habkost VIRTIO_SND_R_PCM_INFO = 0x0100, 59278f064eSEduardo Habkost VIRTIO_SND_R_PCM_SET_PARAMS, 60278f064eSEduardo Habkost VIRTIO_SND_R_PCM_PREPARE, 61278f064eSEduardo Habkost VIRTIO_SND_R_PCM_RELEASE, 62278f064eSEduardo Habkost VIRTIO_SND_R_PCM_START, 63278f064eSEduardo Habkost VIRTIO_SND_R_PCM_STOP, 64278f064eSEduardo Habkost 65278f064eSEduardo Habkost /* channel map control request types */ 66278f064eSEduardo Habkost VIRTIO_SND_R_CHMAP_INFO = 0x0200, 67278f064eSEduardo Habkost 68*ab0c7fb2SPaolo Bonzini /* control element request types */ 69*ab0c7fb2SPaolo Bonzini VIRTIO_SND_R_CTL_INFO = 0x0300, 70*ab0c7fb2SPaolo Bonzini VIRTIO_SND_R_CTL_ENUM_ITEMS, 71*ab0c7fb2SPaolo Bonzini VIRTIO_SND_R_CTL_READ, 72*ab0c7fb2SPaolo Bonzini VIRTIO_SND_R_CTL_WRITE, 73*ab0c7fb2SPaolo Bonzini VIRTIO_SND_R_CTL_TLV_READ, 74*ab0c7fb2SPaolo Bonzini VIRTIO_SND_R_CTL_TLV_WRITE, 75*ab0c7fb2SPaolo Bonzini VIRTIO_SND_R_CTL_TLV_COMMAND, 76*ab0c7fb2SPaolo Bonzini 77278f064eSEduardo Habkost /* jack event types */ 78278f064eSEduardo Habkost VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000, 79278f064eSEduardo Habkost VIRTIO_SND_EVT_JACK_DISCONNECTED, 80278f064eSEduardo Habkost 81278f064eSEduardo Habkost /* PCM event types */ 82278f064eSEduardo Habkost VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100, 83278f064eSEduardo Habkost VIRTIO_SND_EVT_PCM_XRUN, 84278f064eSEduardo Habkost 85*ab0c7fb2SPaolo Bonzini /* control element event types */ 86*ab0c7fb2SPaolo Bonzini VIRTIO_SND_EVT_CTL_NOTIFY = 0x1200, 87*ab0c7fb2SPaolo Bonzini 88278f064eSEduardo Habkost /* common status codes */ 89278f064eSEduardo Habkost VIRTIO_SND_S_OK = 0x8000, 90278f064eSEduardo Habkost VIRTIO_SND_S_BAD_MSG, 91278f064eSEduardo Habkost VIRTIO_SND_S_NOT_SUPP, 92278f064eSEduardo Habkost VIRTIO_SND_S_IO_ERR 93278f064eSEduardo Habkost }; 94278f064eSEduardo Habkost 95278f064eSEduardo Habkost /* common header */ 96278f064eSEduardo Habkost struct virtio_snd_hdr { 97278f064eSEduardo Habkost uint32_t code; 98278f064eSEduardo Habkost }; 99278f064eSEduardo Habkost 100278f064eSEduardo Habkost /* event notification */ 101278f064eSEduardo Habkost struct virtio_snd_event { 102278f064eSEduardo Habkost /* VIRTIO_SND_EVT_XXX */ 103278f064eSEduardo Habkost struct virtio_snd_hdr hdr; 104278f064eSEduardo Habkost /* optional event data */ 105278f064eSEduardo Habkost uint32_t data; 106278f064eSEduardo Habkost }; 107278f064eSEduardo Habkost 108278f064eSEduardo Habkost /* common control request to query an item information */ 109278f064eSEduardo Habkost struct virtio_snd_query_info { 110278f064eSEduardo Habkost /* VIRTIO_SND_R_XXX_INFO */ 111278f064eSEduardo Habkost struct virtio_snd_hdr hdr; 112278f064eSEduardo Habkost /* item start identifier */ 113278f064eSEduardo Habkost uint32_t start_id; 114278f064eSEduardo Habkost /* item count to query */ 115278f064eSEduardo Habkost uint32_t count; 116278f064eSEduardo Habkost /* item information size in bytes */ 117278f064eSEduardo Habkost uint32_t size; 118278f064eSEduardo Habkost }; 119278f064eSEduardo Habkost 120278f064eSEduardo Habkost /* common item information header */ 121278f064eSEduardo Habkost struct virtio_snd_info { 122278f064eSEduardo Habkost /* function group node id (High Definition Audio Specification 7.1.2) */ 123278f064eSEduardo Habkost uint32_t hda_fn_nid; 124278f064eSEduardo Habkost }; 125278f064eSEduardo Habkost 126278f064eSEduardo Habkost /******************************************************************************* 127278f064eSEduardo Habkost * JACK CONTROL MESSAGES 128278f064eSEduardo Habkost */ 129278f064eSEduardo Habkost struct virtio_snd_jack_hdr { 130278f064eSEduardo Habkost /* VIRTIO_SND_R_JACK_XXX */ 131278f064eSEduardo Habkost struct virtio_snd_hdr hdr; 132278f064eSEduardo Habkost /* 0 ... virtio_snd_config::jacks - 1 */ 133278f064eSEduardo Habkost uint32_t jack_id; 134278f064eSEduardo Habkost }; 135278f064eSEduardo Habkost 136278f064eSEduardo Habkost /* supported jack features */ 137278f064eSEduardo Habkost enum { 138278f064eSEduardo Habkost VIRTIO_SND_JACK_F_REMAP = 0 139278f064eSEduardo Habkost }; 140278f064eSEduardo Habkost 141278f064eSEduardo Habkost struct virtio_snd_jack_info { 142278f064eSEduardo Habkost /* common header */ 143278f064eSEduardo Habkost struct virtio_snd_info hdr; 144278f064eSEduardo Habkost /* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */ 145278f064eSEduardo Habkost uint32_t features; 146278f064eSEduardo Habkost /* pin configuration (High Definition Audio Specification 7.3.3.31) */ 147278f064eSEduardo Habkost uint32_t hda_reg_defconf; 148278f064eSEduardo Habkost /* pin capabilities (High Definition Audio Specification 7.3.4.9) */ 149278f064eSEduardo Habkost uint32_t hda_reg_caps; 150278f064eSEduardo Habkost /* current jack connection status (0: disconnected, 1: connected) */ 151278f064eSEduardo Habkost uint8_t connected; 152278f064eSEduardo Habkost 153278f064eSEduardo Habkost uint8_t padding[7]; 154278f064eSEduardo Habkost }; 155278f064eSEduardo Habkost 156278f064eSEduardo Habkost /* jack remapping control request */ 157278f064eSEduardo Habkost struct virtio_snd_jack_remap { 158278f064eSEduardo Habkost /* .code = VIRTIO_SND_R_JACK_REMAP */ 159278f064eSEduardo Habkost struct virtio_snd_jack_hdr hdr; 160278f064eSEduardo Habkost /* selected association number */ 161278f064eSEduardo Habkost uint32_t association; 162278f064eSEduardo Habkost /* selected sequence number */ 163278f064eSEduardo Habkost uint32_t sequence; 164278f064eSEduardo Habkost }; 165278f064eSEduardo Habkost 166278f064eSEduardo Habkost /******************************************************************************* 167278f064eSEduardo Habkost * PCM CONTROL MESSAGES 168278f064eSEduardo Habkost */ 169278f064eSEduardo Habkost struct virtio_snd_pcm_hdr { 170278f064eSEduardo Habkost /* VIRTIO_SND_R_PCM_XXX */ 171278f064eSEduardo Habkost struct virtio_snd_hdr hdr; 172278f064eSEduardo Habkost /* 0 ... virtio_snd_config::streams - 1 */ 173278f064eSEduardo Habkost uint32_t stream_id; 174278f064eSEduardo Habkost }; 175278f064eSEduardo Habkost 176278f064eSEduardo Habkost /* supported PCM stream features */ 177278f064eSEduardo Habkost enum { 178278f064eSEduardo Habkost VIRTIO_SND_PCM_F_SHMEM_HOST = 0, 179278f064eSEduardo Habkost VIRTIO_SND_PCM_F_SHMEM_GUEST, 180278f064eSEduardo Habkost VIRTIO_SND_PCM_F_MSG_POLLING, 181278f064eSEduardo Habkost VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS, 182278f064eSEduardo Habkost VIRTIO_SND_PCM_F_EVT_XRUNS 183278f064eSEduardo Habkost }; 184278f064eSEduardo Habkost 185278f064eSEduardo Habkost /* supported PCM sample formats */ 186278f064eSEduardo Habkost enum { 187278f064eSEduardo Habkost /* analog formats (width / physical width) */ 188278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0, /* 4 / 4 bits */ 189278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_MU_LAW, /* 8 / 8 bits */ 190278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_A_LAW, /* 8 / 8 bits */ 191278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S8, /* 8 / 8 bits */ 192278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U8, /* 8 / 8 bits */ 193278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S16, /* 16 / 16 bits */ 194278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U16, /* 16 / 16 bits */ 195278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S18_3, /* 18 / 24 bits */ 196278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U18_3, /* 18 / 24 bits */ 197278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S20_3, /* 20 / 24 bits */ 198278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U20_3, /* 20 / 24 bits */ 199278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S24_3, /* 24 / 24 bits */ 200278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U24_3, /* 24 / 24 bits */ 201278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S20, /* 20 / 32 bits */ 202278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U20, /* 20 / 32 bits */ 203278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S24, /* 24 / 32 bits */ 204278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U24, /* 24 / 32 bits */ 205278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_S32, /* 32 / 32 bits */ 206278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_U32, /* 32 / 32 bits */ 207278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_FLOAT, /* 32 / 32 bits */ 208278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_FLOAT64, /* 64 / 64 bits */ 209278f064eSEduardo Habkost /* digital formats (width / physical width) */ 210278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_DSD_U8, /* 8 / 8 bits */ 211278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_DSD_U16, /* 16 / 16 bits */ 212278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_DSD_U32, /* 32 / 32 bits */ 213278f064eSEduardo Habkost VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME /* 32 / 32 bits */ 214278f064eSEduardo Habkost }; 215278f064eSEduardo Habkost 216278f064eSEduardo Habkost /* supported PCM frame rates */ 217278f064eSEduardo Habkost enum { 218278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_5512 = 0, 219278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_8000, 220278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_11025, 221278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_16000, 222278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_22050, 223278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_32000, 224278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_44100, 225278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_48000, 226278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_64000, 227278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_88200, 228278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_96000, 229278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_176400, 230278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_192000, 231278f064eSEduardo Habkost VIRTIO_SND_PCM_RATE_384000 232278f064eSEduardo Habkost }; 233278f064eSEduardo Habkost 234278f064eSEduardo Habkost struct virtio_snd_pcm_info { 235278f064eSEduardo Habkost /* common header */ 236278f064eSEduardo Habkost struct virtio_snd_info hdr; 237278f064eSEduardo Habkost /* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */ 238278f064eSEduardo Habkost uint32_t features; 239278f064eSEduardo Habkost /* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */ 240278f064eSEduardo Habkost uint64_t formats; 241278f064eSEduardo Habkost /* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */ 242278f064eSEduardo Habkost uint64_t rates; 243278f064eSEduardo Habkost /* dataflow direction (VIRTIO_SND_D_XXX) */ 244278f064eSEduardo Habkost uint8_t direction; 245278f064eSEduardo Habkost /* minimum # of supported channels */ 246278f064eSEduardo Habkost uint8_t channels_min; 247278f064eSEduardo Habkost /* maximum # of supported channels */ 248278f064eSEduardo Habkost uint8_t channels_max; 249278f064eSEduardo Habkost 250278f064eSEduardo Habkost uint8_t padding[5]; 251278f064eSEduardo Habkost }; 252278f064eSEduardo Habkost 253278f064eSEduardo Habkost /* set PCM stream format */ 254278f064eSEduardo Habkost struct virtio_snd_pcm_set_params { 255278f064eSEduardo Habkost /* .code = VIRTIO_SND_R_PCM_SET_PARAMS */ 256278f064eSEduardo Habkost struct virtio_snd_pcm_hdr hdr; 257278f064eSEduardo Habkost /* size of the hardware buffer */ 258278f064eSEduardo Habkost uint32_t buffer_bytes; 259278f064eSEduardo Habkost /* size of the hardware period */ 260278f064eSEduardo Habkost uint32_t period_bytes; 261278f064eSEduardo Habkost /* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */ 262278f064eSEduardo Habkost uint32_t features; 263278f064eSEduardo Habkost /* selected # of channels */ 264278f064eSEduardo Habkost uint8_t channels; 265278f064eSEduardo Habkost /* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */ 266278f064eSEduardo Habkost uint8_t format; 267278f064eSEduardo Habkost /* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */ 268278f064eSEduardo Habkost uint8_t rate; 269278f064eSEduardo Habkost 270278f064eSEduardo Habkost uint8_t padding; 271278f064eSEduardo Habkost }; 272278f064eSEduardo Habkost 273278f064eSEduardo Habkost /******************************************************************************* 274278f064eSEduardo Habkost * PCM I/O MESSAGES 275278f064eSEduardo Habkost */ 276278f064eSEduardo Habkost 277278f064eSEduardo Habkost /* I/O request header */ 278278f064eSEduardo Habkost struct virtio_snd_pcm_xfer { 279278f064eSEduardo Habkost /* 0 ... virtio_snd_config::streams - 1 */ 280278f064eSEduardo Habkost uint32_t stream_id; 281278f064eSEduardo Habkost }; 282278f064eSEduardo Habkost 283278f064eSEduardo Habkost /* I/O request status */ 284278f064eSEduardo Habkost struct virtio_snd_pcm_status { 285278f064eSEduardo Habkost /* VIRTIO_SND_S_XXX */ 286278f064eSEduardo Habkost uint32_t status; 287278f064eSEduardo Habkost /* current device latency */ 288278f064eSEduardo Habkost uint32_t latency_bytes; 289278f064eSEduardo Habkost }; 290278f064eSEduardo Habkost 291278f064eSEduardo Habkost /******************************************************************************* 292278f064eSEduardo Habkost * CHANNEL MAP CONTROL MESSAGES 293278f064eSEduardo Habkost */ 294278f064eSEduardo Habkost struct virtio_snd_chmap_hdr { 295278f064eSEduardo Habkost /* VIRTIO_SND_R_CHMAP_XXX */ 296278f064eSEduardo Habkost struct virtio_snd_hdr hdr; 297278f064eSEduardo Habkost /* 0 ... virtio_snd_config::chmaps - 1 */ 298278f064eSEduardo Habkost uint32_t chmap_id; 299278f064eSEduardo Habkost }; 300278f064eSEduardo Habkost 301278f064eSEduardo Habkost /* standard channel position definition */ 302278f064eSEduardo Habkost enum { 303278f064eSEduardo Habkost VIRTIO_SND_CHMAP_NONE = 0, /* undefined */ 304278f064eSEduardo Habkost VIRTIO_SND_CHMAP_NA, /* silent */ 305278f064eSEduardo Habkost VIRTIO_SND_CHMAP_MONO, /* mono stream */ 306278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FL, /* front left */ 307278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FR, /* front right */ 308278f064eSEduardo Habkost VIRTIO_SND_CHMAP_RL, /* rear left */ 309278f064eSEduardo Habkost VIRTIO_SND_CHMAP_RR, /* rear right */ 310278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FC, /* front center */ 311278f064eSEduardo Habkost VIRTIO_SND_CHMAP_LFE, /* low frequency (LFE) */ 312278f064eSEduardo Habkost VIRTIO_SND_CHMAP_SL, /* side left */ 313278f064eSEduardo Habkost VIRTIO_SND_CHMAP_SR, /* side right */ 314278f064eSEduardo Habkost VIRTIO_SND_CHMAP_RC, /* rear center */ 315278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FLC, /* front left center */ 316278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FRC, /* front right center */ 317278f064eSEduardo Habkost VIRTIO_SND_CHMAP_RLC, /* rear left center */ 318278f064eSEduardo Habkost VIRTIO_SND_CHMAP_RRC, /* rear right center */ 319278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FLW, /* front left wide */ 320278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FRW, /* front right wide */ 321278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FLH, /* front left high */ 322278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FCH, /* front center high */ 323278f064eSEduardo Habkost VIRTIO_SND_CHMAP_FRH, /* front right high */ 324278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TC, /* top center */ 325278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TFL, /* top front left */ 326278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TFR, /* top front right */ 327278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TFC, /* top front center */ 328278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TRL, /* top rear left */ 329278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TRR, /* top rear right */ 330278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TRC, /* top rear center */ 331278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TFLC, /* top front left center */ 332278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TFRC, /* top front right center */ 333278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TSL, /* top side left */ 334278f064eSEduardo Habkost VIRTIO_SND_CHMAP_TSR, /* top side right */ 335278f064eSEduardo Habkost VIRTIO_SND_CHMAP_LLFE, /* left LFE */ 336278f064eSEduardo Habkost VIRTIO_SND_CHMAP_RLFE, /* right LFE */ 337278f064eSEduardo Habkost VIRTIO_SND_CHMAP_BC, /* bottom center */ 338278f064eSEduardo Habkost VIRTIO_SND_CHMAP_BLC, /* bottom left center */ 339278f064eSEduardo Habkost VIRTIO_SND_CHMAP_BRC /* bottom right center */ 340278f064eSEduardo Habkost }; 341278f064eSEduardo Habkost 342278f064eSEduardo Habkost /* maximum possible number of channels */ 343278f064eSEduardo Habkost #define VIRTIO_SND_CHMAP_MAX_SIZE 18 344278f064eSEduardo Habkost 345278f064eSEduardo Habkost struct virtio_snd_chmap_info { 346278f064eSEduardo Habkost /* common header */ 347278f064eSEduardo Habkost struct virtio_snd_info hdr; 348278f064eSEduardo Habkost /* dataflow direction (VIRTIO_SND_D_XXX) */ 349278f064eSEduardo Habkost uint8_t direction; 350278f064eSEduardo Habkost /* # of valid channel position values */ 351278f064eSEduardo Habkost uint8_t channels; 352278f064eSEduardo Habkost /* channel position values (VIRTIO_SND_CHMAP_XXX) */ 353278f064eSEduardo Habkost uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; 354278f064eSEduardo Habkost }; 355278f064eSEduardo Habkost 356*ab0c7fb2SPaolo Bonzini /******************************************************************************* 357*ab0c7fb2SPaolo Bonzini * CONTROL ELEMENTS MESSAGES 358*ab0c7fb2SPaolo Bonzini */ 359*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_hdr { 360*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_R_CTL_XXX */ 361*ab0c7fb2SPaolo Bonzini struct virtio_snd_hdr hdr; 362*ab0c7fb2SPaolo Bonzini /* 0 ... virtio_snd_config::controls - 1 */ 363*ab0c7fb2SPaolo Bonzini uint32_t control_id; 364*ab0c7fb2SPaolo Bonzini }; 365*ab0c7fb2SPaolo Bonzini 366*ab0c7fb2SPaolo Bonzini /* supported roles for control elements */ 367*ab0c7fb2SPaolo Bonzini enum { 368*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ROLE_UNDEFINED = 0, 369*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ROLE_VOLUME, 370*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ROLE_MUTE, 371*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ROLE_GAIN 372*ab0c7fb2SPaolo Bonzini }; 373*ab0c7fb2SPaolo Bonzini 374*ab0c7fb2SPaolo Bonzini /* supported value types for control elements */ 375*ab0c7fb2SPaolo Bonzini enum { 376*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_TYPE_BOOLEAN = 0, 377*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_TYPE_INTEGER, 378*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_TYPE_INTEGER64, 379*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_TYPE_ENUMERATED, 380*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_TYPE_BYTES, 381*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_TYPE_IEC958 382*ab0c7fb2SPaolo Bonzini }; 383*ab0c7fb2SPaolo Bonzini 384*ab0c7fb2SPaolo Bonzini /* supported access rights for control elements */ 385*ab0c7fb2SPaolo Bonzini enum { 386*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ACCESS_READ = 0, 387*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ACCESS_WRITE, 388*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ACCESS_VOLATILE, 389*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ACCESS_INACTIVE, 390*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ACCESS_TLV_READ, 391*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ACCESS_TLV_WRITE, 392*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_ACCESS_TLV_COMMAND 393*ab0c7fb2SPaolo Bonzini }; 394*ab0c7fb2SPaolo Bonzini 395*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_info { 396*ab0c7fb2SPaolo Bonzini /* common header */ 397*ab0c7fb2SPaolo Bonzini struct virtio_snd_info hdr; 398*ab0c7fb2SPaolo Bonzini /* element role (VIRTIO_SND_CTL_ROLE_XXX) */ 399*ab0c7fb2SPaolo Bonzini uint32_t role; 400*ab0c7fb2SPaolo Bonzini /* element value type (VIRTIO_SND_CTL_TYPE_XXX) */ 401*ab0c7fb2SPaolo Bonzini uint32_t type; 402*ab0c7fb2SPaolo Bonzini /* element access right bit map (1 << VIRTIO_SND_CTL_ACCESS_XXX) */ 403*ab0c7fb2SPaolo Bonzini uint32_t access; 404*ab0c7fb2SPaolo Bonzini /* # of members in the element value */ 405*ab0c7fb2SPaolo Bonzini uint32_t count; 406*ab0c7fb2SPaolo Bonzini /* index for an element with a non-unique name */ 407*ab0c7fb2SPaolo Bonzini uint32_t index; 408*ab0c7fb2SPaolo Bonzini /* name identifier string for the element */ 409*ab0c7fb2SPaolo Bonzini uint8_t name[44]; 410*ab0c7fb2SPaolo Bonzini /* additional information about the element's value */ 411*ab0c7fb2SPaolo Bonzini union { 412*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_INTEGER */ 413*ab0c7fb2SPaolo Bonzini struct { 414*ab0c7fb2SPaolo Bonzini /* minimum supported value */ 415*ab0c7fb2SPaolo Bonzini uint32_t min; 416*ab0c7fb2SPaolo Bonzini /* maximum supported value */ 417*ab0c7fb2SPaolo Bonzini uint32_t max; 418*ab0c7fb2SPaolo Bonzini /* fixed step size for value (0 = variable size) */ 419*ab0c7fb2SPaolo Bonzini uint32_t step; 420*ab0c7fb2SPaolo Bonzini } integer; 421*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_INTEGER64 */ 422*ab0c7fb2SPaolo Bonzini struct { 423*ab0c7fb2SPaolo Bonzini /* minimum supported value */ 424*ab0c7fb2SPaolo Bonzini uint64_t min; 425*ab0c7fb2SPaolo Bonzini /* maximum supported value */ 426*ab0c7fb2SPaolo Bonzini uint64_t max; 427*ab0c7fb2SPaolo Bonzini /* fixed step size for value (0 = variable size) */ 428*ab0c7fb2SPaolo Bonzini uint64_t step; 429*ab0c7fb2SPaolo Bonzini } integer64; 430*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_ENUMERATED */ 431*ab0c7fb2SPaolo Bonzini struct { 432*ab0c7fb2SPaolo Bonzini /* # of options supported for value */ 433*ab0c7fb2SPaolo Bonzini uint32_t items; 434*ab0c7fb2SPaolo Bonzini } enumerated; 435*ab0c7fb2SPaolo Bonzini } value; 436*ab0c7fb2SPaolo Bonzini }; 437*ab0c7fb2SPaolo Bonzini 438*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_enum_item { 439*ab0c7fb2SPaolo Bonzini /* option name */ 440*ab0c7fb2SPaolo Bonzini uint8_t item[64]; 441*ab0c7fb2SPaolo Bonzini }; 442*ab0c7fb2SPaolo Bonzini 443*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_iec958 { 444*ab0c7fb2SPaolo Bonzini /* AES/IEC958 channel status bits */ 445*ab0c7fb2SPaolo Bonzini uint8_t status[24]; 446*ab0c7fb2SPaolo Bonzini /* AES/IEC958 subcode bits */ 447*ab0c7fb2SPaolo Bonzini uint8_t subcode[147]; 448*ab0c7fb2SPaolo Bonzini /* nothing */ 449*ab0c7fb2SPaolo Bonzini uint8_t pad; 450*ab0c7fb2SPaolo Bonzini /* AES/IEC958 subframe bits */ 451*ab0c7fb2SPaolo Bonzini uint8_t dig_subframe[4]; 452*ab0c7fb2SPaolo Bonzini }; 453*ab0c7fb2SPaolo Bonzini 454*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_value { 455*ab0c7fb2SPaolo Bonzini union { 456*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_BOOLEAN|INTEGER value */ 457*ab0c7fb2SPaolo Bonzini uint32_t integer[128]; 458*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_INTEGER64 value */ 459*ab0c7fb2SPaolo Bonzini uint64_t integer64[64]; 460*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_ENUMERATED value (option indexes) */ 461*ab0c7fb2SPaolo Bonzini uint32_t enumerated[128]; 462*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_BYTES value */ 463*ab0c7fb2SPaolo Bonzini uint8_t bytes[512]; 464*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_CTL_TYPE_IEC958 value */ 465*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_iec958 iec958; 466*ab0c7fb2SPaolo Bonzini } value; 467*ab0c7fb2SPaolo Bonzini }; 468*ab0c7fb2SPaolo Bonzini 469*ab0c7fb2SPaolo Bonzini /* supported event reason types */ 470*ab0c7fb2SPaolo Bonzini enum { 471*ab0c7fb2SPaolo Bonzini /* element's value has changed */ 472*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_EVT_MASK_VALUE = 0, 473*ab0c7fb2SPaolo Bonzini /* element's information has changed */ 474*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_EVT_MASK_INFO, 475*ab0c7fb2SPaolo Bonzini /* element's metadata has changed */ 476*ab0c7fb2SPaolo Bonzini VIRTIO_SND_CTL_EVT_MASK_TLV 477*ab0c7fb2SPaolo Bonzini }; 478*ab0c7fb2SPaolo Bonzini 479*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_event { 480*ab0c7fb2SPaolo Bonzini /* VIRTIO_SND_EVT_CTL_NOTIFY */ 481*ab0c7fb2SPaolo Bonzini struct virtio_snd_hdr hdr; 482*ab0c7fb2SPaolo Bonzini /* 0 ... virtio_snd_config::controls - 1 */ 483*ab0c7fb2SPaolo Bonzini uint16_t control_id; 484*ab0c7fb2SPaolo Bonzini /* event reason bit map (1 << VIRTIO_SND_CTL_EVT_MASK_XXX) */ 485*ab0c7fb2SPaolo Bonzini uint16_t mask; 486*ab0c7fb2SPaolo Bonzini }; 487*ab0c7fb2SPaolo Bonzini 488278f064eSEduardo Habkost #endif /* VIRTIO_SND_IF_H */ 489