1de3a9980SAnton Yakovlev /* SPDX-License-Identifier: BSD-3-Clause */ 2de3a9980SAnton Yakovlev /* 3de3a9980SAnton Yakovlev * Copyright (C) 2021 OpenSynergy GmbH 4de3a9980SAnton Yakovlev */ 5de3a9980SAnton Yakovlev #ifndef VIRTIO_SND_IF_H 6de3a9980SAnton Yakovlev #define VIRTIO_SND_IF_H 7de3a9980SAnton Yakovlev 8de3a9980SAnton Yakovlev #include <linux/virtio_types.h> 9de3a9980SAnton Yakovlev 10de3a9980SAnton Yakovlev /******************************************************************************* 11*d6568e3dSAnton Yakovlev * FEATURE BITS 12*d6568e3dSAnton Yakovlev */ 13*d6568e3dSAnton Yakovlev enum { 14*d6568e3dSAnton Yakovlev /* device supports control elements */ 15*d6568e3dSAnton Yakovlev VIRTIO_SND_F_CTLS = 0 16*d6568e3dSAnton Yakovlev }; 17*d6568e3dSAnton Yakovlev 18*d6568e3dSAnton Yakovlev /******************************************************************************* 19de3a9980SAnton Yakovlev * CONFIGURATION SPACE 20de3a9980SAnton Yakovlev */ 21de3a9980SAnton Yakovlev struct virtio_snd_config { 22de3a9980SAnton Yakovlev /* # of available physical jacks */ 23de3a9980SAnton Yakovlev __le32 jacks; 24de3a9980SAnton Yakovlev /* # of available PCM streams */ 25de3a9980SAnton Yakovlev __le32 streams; 26de3a9980SAnton Yakovlev /* # of available channel maps */ 27de3a9980SAnton Yakovlev __le32 chmaps; 28*d6568e3dSAnton Yakovlev /* # of available control elements */ 29*d6568e3dSAnton Yakovlev __le32 controls; 30de3a9980SAnton Yakovlev }; 31de3a9980SAnton Yakovlev 32de3a9980SAnton Yakovlev enum { 33de3a9980SAnton Yakovlev /* device virtqueue indexes */ 34de3a9980SAnton Yakovlev VIRTIO_SND_VQ_CONTROL = 0, 35de3a9980SAnton Yakovlev VIRTIO_SND_VQ_EVENT, 36de3a9980SAnton Yakovlev VIRTIO_SND_VQ_TX, 37de3a9980SAnton Yakovlev VIRTIO_SND_VQ_RX, 38de3a9980SAnton Yakovlev /* # of device virtqueues */ 39de3a9980SAnton Yakovlev VIRTIO_SND_VQ_MAX 40de3a9980SAnton Yakovlev }; 41de3a9980SAnton Yakovlev 42de3a9980SAnton Yakovlev /******************************************************************************* 43de3a9980SAnton Yakovlev * COMMON DEFINITIONS 44de3a9980SAnton Yakovlev */ 45de3a9980SAnton Yakovlev 46de3a9980SAnton Yakovlev /* supported dataflow directions */ 47de3a9980SAnton Yakovlev enum { 48de3a9980SAnton Yakovlev VIRTIO_SND_D_OUTPUT = 0, 49de3a9980SAnton Yakovlev VIRTIO_SND_D_INPUT 50de3a9980SAnton Yakovlev }; 51de3a9980SAnton Yakovlev 52de3a9980SAnton Yakovlev enum { 53de3a9980SAnton Yakovlev /* jack control request types */ 54de3a9980SAnton Yakovlev VIRTIO_SND_R_JACK_INFO = 1, 55de3a9980SAnton Yakovlev VIRTIO_SND_R_JACK_REMAP, 56de3a9980SAnton Yakovlev 57de3a9980SAnton Yakovlev /* PCM control request types */ 58de3a9980SAnton Yakovlev VIRTIO_SND_R_PCM_INFO = 0x0100, 59de3a9980SAnton Yakovlev VIRTIO_SND_R_PCM_SET_PARAMS, 60de3a9980SAnton Yakovlev VIRTIO_SND_R_PCM_PREPARE, 61de3a9980SAnton Yakovlev VIRTIO_SND_R_PCM_RELEASE, 62de3a9980SAnton Yakovlev VIRTIO_SND_R_PCM_START, 63de3a9980SAnton Yakovlev VIRTIO_SND_R_PCM_STOP, 64de3a9980SAnton Yakovlev 65de3a9980SAnton Yakovlev /* channel map control request types */ 66de3a9980SAnton Yakovlev VIRTIO_SND_R_CHMAP_INFO = 0x0200, 67de3a9980SAnton Yakovlev 68*d6568e3dSAnton Yakovlev /* control element request types */ 69*d6568e3dSAnton Yakovlev VIRTIO_SND_R_CTL_INFO = 0x0300, 70*d6568e3dSAnton Yakovlev VIRTIO_SND_R_CTL_ENUM_ITEMS, 71*d6568e3dSAnton Yakovlev VIRTIO_SND_R_CTL_READ, 72*d6568e3dSAnton Yakovlev VIRTIO_SND_R_CTL_WRITE, 73*d6568e3dSAnton Yakovlev VIRTIO_SND_R_CTL_TLV_READ, 74*d6568e3dSAnton Yakovlev VIRTIO_SND_R_CTL_TLV_WRITE, 75*d6568e3dSAnton Yakovlev VIRTIO_SND_R_CTL_TLV_COMMAND, 76*d6568e3dSAnton Yakovlev 77de3a9980SAnton Yakovlev /* jack event types */ 78de3a9980SAnton Yakovlev VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000, 79de3a9980SAnton Yakovlev VIRTIO_SND_EVT_JACK_DISCONNECTED, 80de3a9980SAnton Yakovlev 81de3a9980SAnton Yakovlev /* PCM event types */ 82de3a9980SAnton Yakovlev VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100, 83de3a9980SAnton Yakovlev VIRTIO_SND_EVT_PCM_XRUN, 84de3a9980SAnton Yakovlev 85*d6568e3dSAnton Yakovlev /* control element event types */ 86*d6568e3dSAnton Yakovlev VIRTIO_SND_EVT_CTL_NOTIFY = 0x1200, 87*d6568e3dSAnton Yakovlev 88de3a9980SAnton Yakovlev /* common status codes */ 89de3a9980SAnton Yakovlev VIRTIO_SND_S_OK = 0x8000, 90de3a9980SAnton Yakovlev VIRTIO_SND_S_BAD_MSG, 91de3a9980SAnton Yakovlev VIRTIO_SND_S_NOT_SUPP, 92de3a9980SAnton Yakovlev VIRTIO_SND_S_IO_ERR 93de3a9980SAnton Yakovlev }; 94de3a9980SAnton Yakovlev 95de3a9980SAnton Yakovlev /* common header */ 96de3a9980SAnton Yakovlev struct virtio_snd_hdr { 97de3a9980SAnton Yakovlev __le32 code; 98de3a9980SAnton Yakovlev }; 99de3a9980SAnton Yakovlev 100de3a9980SAnton Yakovlev /* event notification */ 101de3a9980SAnton Yakovlev struct virtio_snd_event { 102de3a9980SAnton Yakovlev /* VIRTIO_SND_EVT_XXX */ 103de3a9980SAnton Yakovlev struct virtio_snd_hdr hdr; 104de3a9980SAnton Yakovlev /* optional event data */ 105de3a9980SAnton Yakovlev __le32 data; 106de3a9980SAnton Yakovlev }; 107de3a9980SAnton Yakovlev 108de3a9980SAnton Yakovlev /* common control request to query an item information */ 109de3a9980SAnton Yakovlev struct virtio_snd_query_info { 110de3a9980SAnton Yakovlev /* VIRTIO_SND_R_XXX_INFO */ 111de3a9980SAnton Yakovlev struct virtio_snd_hdr hdr; 112de3a9980SAnton Yakovlev /* item start identifier */ 113de3a9980SAnton Yakovlev __le32 start_id; 114de3a9980SAnton Yakovlev /* item count to query */ 115de3a9980SAnton Yakovlev __le32 count; 116de3a9980SAnton Yakovlev /* item information size in bytes */ 117de3a9980SAnton Yakovlev __le32 size; 118de3a9980SAnton Yakovlev }; 119de3a9980SAnton Yakovlev 120de3a9980SAnton Yakovlev /* common item information header */ 121de3a9980SAnton Yakovlev struct virtio_snd_info { 122de3a9980SAnton Yakovlev /* function group node id (High Definition Audio Specification 7.1.2) */ 123de3a9980SAnton Yakovlev __le32 hda_fn_nid; 124de3a9980SAnton Yakovlev }; 125de3a9980SAnton Yakovlev 126de3a9980SAnton Yakovlev /******************************************************************************* 127de3a9980SAnton Yakovlev * JACK CONTROL MESSAGES 128de3a9980SAnton Yakovlev */ 129de3a9980SAnton Yakovlev struct virtio_snd_jack_hdr { 130de3a9980SAnton Yakovlev /* VIRTIO_SND_R_JACK_XXX */ 131de3a9980SAnton Yakovlev struct virtio_snd_hdr hdr; 132de3a9980SAnton Yakovlev /* 0 ... virtio_snd_config::jacks - 1 */ 133de3a9980SAnton Yakovlev __le32 jack_id; 134de3a9980SAnton Yakovlev }; 135de3a9980SAnton Yakovlev 136de3a9980SAnton Yakovlev /* supported jack features */ 137de3a9980SAnton Yakovlev enum { 138de3a9980SAnton Yakovlev VIRTIO_SND_JACK_F_REMAP = 0 139de3a9980SAnton Yakovlev }; 140de3a9980SAnton Yakovlev 141de3a9980SAnton Yakovlev struct virtio_snd_jack_info { 142de3a9980SAnton Yakovlev /* common header */ 143de3a9980SAnton Yakovlev struct virtio_snd_info hdr; 144de3a9980SAnton Yakovlev /* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */ 145de3a9980SAnton Yakovlev __le32 features; 146de3a9980SAnton Yakovlev /* pin configuration (High Definition Audio Specification 7.3.3.31) */ 147de3a9980SAnton Yakovlev __le32 hda_reg_defconf; 148de3a9980SAnton Yakovlev /* pin capabilities (High Definition Audio Specification 7.3.4.9) */ 149de3a9980SAnton Yakovlev __le32 hda_reg_caps; 150de3a9980SAnton Yakovlev /* current jack connection status (0: disconnected, 1: connected) */ 151de3a9980SAnton Yakovlev __u8 connected; 152de3a9980SAnton Yakovlev 153de3a9980SAnton Yakovlev __u8 padding[7]; 154de3a9980SAnton Yakovlev }; 155de3a9980SAnton Yakovlev 156de3a9980SAnton Yakovlev /* jack remapping control request */ 157de3a9980SAnton Yakovlev struct virtio_snd_jack_remap { 158de3a9980SAnton Yakovlev /* .code = VIRTIO_SND_R_JACK_REMAP */ 159de3a9980SAnton Yakovlev struct virtio_snd_jack_hdr hdr; 160de3a9980SAnton Yakovlev /* selected association number */ 161de3a9980SAnton Yakovlev __le32 association; 162de3a9980SAnton Yakovlev /* selected sequence number */ 163de3a9980SAnton Yakovlev __le32 sequence; 164de3a9980SAnton Yakovlev }; 165de3a9980SAnton Yakovlev 166de3a9980SAnton Yakovlev /******************************************************************************* 167de3a9980SAnton Yakovlev * PCM CONTROL MESSAGES 168de3a9980SAnton Yakovlev */ 169de3a9980SAnton Yakovlev struct virtio_snd_pcm_hdr { 170de3a9980SAnton Yakovlev /* VIRTIO_SND_R_PCM_XXX */ 171de3a9980SAnton Yakovlev struct virtio_snd_hdr hdr; 172de3a9980SAnton Yakovlev /* 0 ... virtio_snd_config::streams - 1 */ 173de3a9980SAnton Yakovlev __le32 stream_id; 174de3a9980SAnton Yakovlev }; 175de3a9980SAnton Yakovlev 176de3a9980SAnton Yakovlev /* supported PCM stream features */ 177de3a9980SAnton Yakovlev enum { 178de3a9980SAnton Yakovlev VIRTIO_SND_PCM_F_SHMEM_HOST = 0, 179de3a9980SAnton Yakovlev VIRTIO_SND_PCM_F_SHMEM_GUEST, 180de3a9980SAnton Yakovlev VIRTIO_SND_PCM_F_MSG_POLLING, 181de3a9980SAnton Yakovlev VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS, 182de3a9980SAnton Yakovlev VIRTIO_SND_PCM_F_EVT_XRUNS 183de3a9980SAnton Yakovlev }; 184de3a9980SAnton Yakovlev 185de3a9980SAnton Yakovlev /* supported PCM sample formats */ 186de3a9980SAnton Yakovlev enum { 187de3a9980SAnton Yakovlev /* analog formats (width / physical width) */ 188de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0, /* 4 / 4 bits */ 189de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_MU_LAW, /* 8 / 8 bits */ 190de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_A_LAW, /* 8 / 8 bits */ 191de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S8, /* 8 / 8 bits */ 192de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U8, /* 8 / 8 bits */ 193de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S16, /* 16 / 16 bits */ 194de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U16, /* 16 / 16 bits */ 195de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S18_3, /* 18 / 24 bits */ 196de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U18_3, /* 18 / 24 bits */ 197de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S20_3, /* 20 / 24 bits */ 198de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U20_3, /* 20 / 24 bits */ 199de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S24_3, /* 24 / 24 bits */ 200de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U24_3, /* 24 / 24 bits */ 201de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S20, /* 20 / 32 bits */ 202de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U20, /* 20 / 32 bits */ 203de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S24, /* 24 / 32 bits */ 204de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U24, /* 24 / 32 bits */ 205de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_S32, /* 32 / 32 bits */ 206de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_U32, /* 32 / 32 bits */ 207de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_FLOAT, /* 32 / 32 bits */ 208de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_FLOAT64, /* 64 / 64 bits */ 209de3a9980SAnton Yakovlev /* digital formats (width / physical width) */ 210de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_DSD_U8, /* 8 / 8 bits */ 211de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_DSD_U16, /* 16 / 16 bits */ 212de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_DSD_U32, /* 32 / 32 bits */ 213de3a9980SAnton Yakovlev VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME /* 32 / 32 bits */ 214de3a9980SAnton Yakovlev }; 215de3a9980SAnton Yakovlev 216de3a9980SAnton Yakovlev /* supported PCM frame rates */ 217de3a9980SAnton Yakovlev enum { 218de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_5512 = 0, 219de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_8000, 220de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_11025, 221de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_16000, 222de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_22050, 223de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_32000, 224de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_44100, 225de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_48000, 226de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_64000, 227de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_88200, 228de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_96000, 229de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_176400, 230de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_192000, 231de3a9980SAnton Yakovlev VIRTIO_SND_PCM_RATE_384000 232de3a9980SAnton Yakovlev }; 233de3a9980SAnton Yakovlev 234de3a9980SAnton Yakovlev struct virtio_snd_pcm_info { 235de3a9980SAnton Yakovlev /* common header */ 236de3a9980SAnton Yakovlev struct virtio_snd_info hdr; 237de3a9980SAnton Yakovlev /* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */ 238de3a9980SAnton Yakovlev __le32 features; 239de3a9980SAnton Yakovlev /* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */ 240de3a9980SAnton Yakovlev __le64 formats; 241de3a9980SAnton Yakovlev /* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */ 242de3a9980SAnton Yakovlev __le64 rates; 243de3a9980SAnton Yakovlev /* dataflow direction (VIRTIO_SND_D_XXX) */ 244de3a9980SAnton Yakovlev __u8 direction; 245de3a9980SAnton Yakovlev /* minimum # of supported channels */ 246de3a9980SAnton Yakovlev __u8 channels_min; 247de3a9980SAnton Yakovlev /* maximum # of supported channels */ 248de3a9980SAnton Yakovlev __u8 channels_max; 249de3a9980SAnton Yakovlev 250de3a9980SAnton Yakovlev __u8 padding[5]; 251de3a9980SAnton Yakovlev }; 252de3a9980SAnton Yakovlev 253de3a9980SAnton Yakovlev /* set PCM stream format */ 254de3a9980SAnton Yakovlev struct virtio_snd_pcm_set_params { 255de3a9980SAnton Yakovlev /* .code = VIRTIO_SND_R_PCM_SET_PARAMS */ 256de3a9980SAnton Yakovlev struct virtio_snd_pcm_hdr hdr; 257de3a9980SAnton Yakovlev /* size of the hardware buffer */ 258de3a9980SAnton Yakovlev __le32 buffer_bytes; 259de3a9980SAnton Yakovlev /* size of the hardware period */ 260de3a9980SAnton Yakovlev __le32 period_bytes; 261de3a9980SAnton Yakovlev /* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */ 262de3a9980SAnton Yakovlev __le32 features; 263de3a9980SAnton Yakovlev /* selected # of channels */ 264de3a9980SAnton Yakovlev __u8 channels; 265de3a9980SAnton Yakovlev /* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */ 266de3a9980SAnton Yakovlev __u8 format; 267de3a9980SAnton Yakovlev /* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */ 268de3a9980SAnton Yakovlev __u8 rate; 269de3a9980SAnton Yakovlev 270de3a9980SAnton Yakovlev __u8 padding; 271de3a9980SAnton Yakovlev }; 272de3a9980SAnton Yakovlev 273de3a9980SAnton Yakovlev /******************************************************************************* 274de3a9980SAnton Yakovlev * PCM I/O MESSAGES 275de3a9980SAnton Yakovlev */ 276de3a9980SAnton Yakovlev 277de3a9980SAnton Yakovlev /* I/O request header */ 278de3a9980SAnton Yakovlev struct virtio_snd_pcm_xfer { 279de3a9980SAnton Yakovlev /* 0 ... virtio_snd_config::streams - 1 */ 280de3a9980SAnton Yakovlev __le32 stream_id; 281de3a9980SAnton Yakovlev }; 282de3a9980SAnton Yakovlev 283de3a9980SAnton Yakovlev /* I/O request status */ 284de3a9980SAnton Yakovlev struct virtio_snd_pcm_status { 285de3a9980SAnton Yakovlev /* VIRTIO_SND_S_XXX */ 286de3a9980SAnton Yakovlev __le32 status; 287de3a9980SAnton Yakovlev /* current device latency */ 288de3a9980SAnton Yakovlev __le32 latency_bytes; 289de3a9980SAnton Yakovlev }; 290de3a9980SAnton Yakovlev 291de3a9980SAnton Yakovlev /******************************************************************************* 292de3a9980SAnton Yakovlev * CHANNEL MAP CONTROL MESSAGES 293de3a9980SAnton Yakovlev */ 294de3a9980SAnton Yakovlev struct virtio_snd_chmap_hdr { 295de3a9980SAnton Yakovlev /* VIRTIO_SND_R_CHMAP_XXX */ 296de3a9980SAnton Yakovlev struct virtio_snd_hdr hdr; 297de3a9980SAnton Yakovlev /* 0 ... virtio_snd_config::chmaps - 1 */ 298de3a9980SAnton Yakovlev __le32 chmap_id; 299de3a9980SAnton Yakovlev }; 300de3a9980SAnton Yakovlev 301de3a9980SAnton Yakovlev /* standard channel position definition */ 302de3a9980SAnton Yakovlev enum { 303de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_NONE = 0, /* undefined */ 304de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_NA, /* silent */ 305de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_MONO, /* mono stream */ 306de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FL, /* front left */ 307de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FR, /* front right */ 308de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_RL, /* rear left */ 309de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_RR, /* rear right */ 310de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FC, /* front center */ 311de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_LFE, /* low frequency (LFE) */ 312de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_SL, /* side left */ 313de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_SR, /* side right */ 314de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_RC, /* rear center */ 315de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FLC, /* front left center */ 316de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FRC, /* front right center */ 317de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_RLC, /* rear left center */ 318de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_RRC, /* rear right center */ 319de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FLW, /* front left wide */ 320de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FRW, /* front right wide */ 321de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FLH, /* front left high */ 322de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FCH, /* front center high */ 323de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_FRH, /* front right high */ 324de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TC, /* top center */ 325de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TFL, /* top front left */ 326de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TFR, /* top front right */ 327de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TFC, /* top front center */ 328de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TRL, /* top rear left */ 329de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TRR, /* top rear right */ 330de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TRC, /* top rear center */ 331de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TFLC, /* top front left center */ 332de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TFRC, /* top front right center */ 333de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TSL, /* top side left */ 334de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_TSR, /* top side right */ 335de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_LLFE, /* left LFE */ 336de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_RLFE, /* right LFE */ 337de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_BC, /* bottom center */ 338de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_BLC, /* bottom left center */ 339de3a9980SAnton Yakovlev VIRTIO_SND_CHMAP_BRC /* bottom right center */ 340de3a9980SAnton Yakovlev }; 341de3a9980SAnton Yakovlev 342de3a9980SAnton Yakovlev /* maximum possible number of channels */ 343de3a9980SAnton Yakovlev #define VIRTIO_SND_CHMAP_MAX_SIZE 18 344de3a9980SAnton Yakovlev 345de3a9980SAnton Yakovlev struct virtio_snd_chmap_info { 346de3a9980SAnton Yakovlev /* common header */ 347de3a9980SAnton Yakovlev struct virtio_snd_info hdr; 348de3a9980SAnton Yakovlev /* dataflow direction (VIRTIO_SND_D_XXX) */ 349de3a9980SAnton Yakovlev __u8 direction; 350de3a9980SAnton Yakovlev /* # of valid channel position values */ 351de3a9980SAnton Yakovlev __u8 channels; 352de3a9980SAnton Yakovlev /* channel position values (VIRTIO_SND_CHMAP_XXX) */ 353de3a9980SAnton Yakovlev __u8 positions[VIRTIO_SND_CHMAP_MAX_SIZE]; 354de3a9980SAnton Yakovlev }; 355de3a9980SAnton Yakovlev 356*d6568e3dSAnton Yakovlev /******************************************************************************* 357*d6568e3dSAnton Yakovlev * CONTROL ELEMENTS MESSAGES 358*d6568e3dSAnton Yakovlev */ 359*d6568e3dSAnton Yakovlev struct virtio_snd_ctl_hdr { 360*d6568e3dSAnton Yakovlev /* VIRTIO_SND_R_CTL_XXX */ 361*d6568e3dSAnton Yakovlev struct virtio_snd_hdr hdr; 362*d6568e3dSAnton Yakovlev /* 0 ... virtio_snd_config::controls - 1 */ 363*d6568e3dSAnton Yakovlev __le32 control_id; 364*d6568e3dSAnton Yakovlev }; 365*d6568e3dSAnton Yakovlev 366*d6568e3dSAnton Yakovlev /* supported roles for control elements */ 367*d6568e3dSAnton Yakovlev enum { 368*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ROLE_UNDEFINED = 0, 369*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ROLE_VOLUME, 370*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ROLE_MUTE, 371*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ROLE_GAIN 372*d6568e3dSAnton Yakovlev }; 373*d6568e3dSAnton Yakovlev 374*d6568e3dSAnton Yakovlev /* supported value types for control elements */ 375*d6568e3dSAnton Yakovlev enum { 376*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_TYPE_BOOLEAN = 0, 377*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_TYPE_INTEGER, 378*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_TYPE_INTEGER64, 379*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_TYPE_ENUMERATED, 380*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_TYPE_BYTES, 381*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_TYPE_IEC958 382*d6568e3dSAnton Yakovlev }; 383*d6568e3dSAnton Yakovlev 384*d6568e3dSAnton Yakovlev /* supported access rights for control elements */ 385*d6568e3dSAnton Yakovlev enum { 386*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ACCESS_READ = 0, 387*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ACCESS_WRITE, 388*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ACCESS_VOLATILE, 389*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ACCESS_INACTIVE, 390*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ACCESS_TLV_READ, 391*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ACCESS_TLV_WRITE, 392*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_ACCESS_TLV_COMMAND 393*d6568e3dSAnton Yakovlev }; 394*d6568e3dSAnton Yakovlev 395*d6568e3dSAnton Yakovlev struct virtio_snd_ctl_info { 396*d6568e3dSAnton Yakovlev /* common header */ 397*d6568e3dSAnton Yakovlev struct virtio_snd_info hdr; 398*d6568e3dSAnton Yakovlev /* element role (VIRTIO_SND_CTL_ROLE_XXX) */ 399*d6568e3dSAnton Yakovlev __le32 role; 400*d6568e3dSAnton Yakovlev /* element value type (VIRTIO_SND_CTL_TYPE_XXX) */ 401*d6568e3dSAnton Yakovlev __le32 type; 402*d6568e3dSAnton Yakovlev /* element access right bit map (1 << VIRTIO_SND_CTL_ACCESS_XXX) */ 403*d6568e3dSAnton Yakovlev __le32 access; 404*d6568e3dSAnton Yakovlev /* # of members in the element value */ 405*d6568e3dSAnton Yakovlev __le32 count; 406*d6568e3dSAnton Yakovlev /* index for an element with a non-unique name */ 407*d6568e3dSAnton Yakovlev __le32 index; 408*d6568e3dSAnton Yakovlev /* name identifier string for the element */ 409*d6568e3dSAnton Yakovlev __u8 name[44]; 410*d6568e3dSAnton Yakovlev /* additional information about the element's value */ 411*d6568e3dSAnton Yakovlev union { 412*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_INTEGER */ 413*d6568e3dSAnton Yakovlev struct { 414*d6568e3dSAnton Yakovlev /* minimum supported value */ 415*d6568e3dSAnton Yakovlev __le32 min; 416*d6568e3dSAnton Yakovlev /* maximum supported value */ 417*d6568e3dSAnton Yakovlev __le32 max; 418*d6568e3dSAnton Yakovlev /* fixed step size for value (0 = variable size) */ 419*d6568e3dSAnton Yakovlev __le32 step; 420*d6568e3dSAnton Yakovlev } integer; 421*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_INTEGER64 */ 422*d6568e3dSAnton Yakovlev struct { 423*d6568e3dSAnton Yakovlev /* minimum supported value */ 424*d6568e3dSAnton Yakovlev __le64 min; 425*d6568e3dSAnton Yakovlev /* maximum supported value */ 426*d6568e3dSAnton Yakovlev __le64 max; 427*d6568e3dSAnton Yakovlev /* fixed step size for value (0 = variable size) */ 428*d6568e3dSAnton Yakovlev __le64 step; 429*d6568e3dSAnton Yakovlev } integer64; 430*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_ENUMERATED */ 431*d6568e3dSAnton Yakovlev struct { 432*d6568e3dSAnton Yakovlev /* # of options supported for value */ 433*d6568e3dSAnton Yakovlev __le32 items; 434*d6568e3dSAnton Yakovlev } enumerated; 435*d6568e3dSAnton Yakovlev } value; 436*d6568e3dSAnton Yakovlev }; 437*d6568e3dSAnton Yakovlev 438*d6568e3dSAnton Yakovlev struct virtio_snd_ctl_enum_item { 439*d6568e3dSAnton Yakovlev /* option name */ 440*d6568e3dSAnton Yakovlev __u8 item[64]; 441*d6568e3dSAnton Yakovlev }; 442*d6568e3dSAnton Yakovlev 443*d6568e3dSAnton Yakovlev struct virtio_snd_ctl_iec958 { 444*d6568e3dSAnton Yakovlev /* AES/IEC958 channel status bits */ 445*d6568e3dSAnton Yakovlev __u8 status[24]; 446*d6568e3dSAnton Yakovlev /* AES/IEC958 subcode bits */ 447*d6568e3dSAnton Yakovlev __u8 subcode[147]; 448*d6568e3dSAnton Yakovlev /* nothing */ 449*d6568e3dSAnton Yakovlev __u8 pad; 450*d6568e3dSAnton Yakovlev /* AES/IEC958 subframe bits */ 451*d6568e3dSAnton Yakovlev __u8 dig_subframe[4]; 452*d6568e3dSAnton Yakovlev }; 453*d6568e3dSAnton Yakovlev 454*d6568e3dSAnton Yakovlev struct virtio_snd_ctl_value { 455*d6568e3dSAnton Yakovlev union { 456*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_BOOLEAN|INTEGER value */ 457*d6568e3dSAnton Yakovlev __le32 integer[128]; 458*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_INTEGER64 value */ 459*d6568e3dSAnton Yakovlev __le64 integer64[64]; 460*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_ENUMERATED value (option indexes) */ 461*d6568e3dSAnton Yakovlev __le32 enumerated[128]; 462*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_BYTES value */ 463*d6568e3dSAnton Yakovlev __u8 bytes[512]; 464*d6568e3dSAnton Yakovlev /* VIRTIO_SND_CTL_TYPE_IEC958 value */ 465*d6568e3dSAnton Yakovlev struct virtio_snd_ctl_iec958 iec958; 466*d6568e3dSAnton Yakovlev } value; 467*d6568e3dSAnton Yakovlev }; 468*d6568e3dSAnton Yakovlev 469*d6568e3dSAnton Yakovlev /* supported event reason types */ 470*d6568e3dSAnton Yakovlev enum { 471*d6568e3dSAnton Yakovlev /* element's value has changed */ 472*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_EVT_MASK_VALUE = 0, 473*d6568e3dSAnton Yakovlev /* element's information has changed */ 474*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_EVT_MASK_INFO, 475*d6568e3dSAnton Yakovlev /* element's metadata has changed */ 476*d6568e3dSAnton Yakovlev VIRTIO_SND_CTL_EVT_MASK_TLV 477*d6568e3dSAnton Yakovlev }; 478*d6568e3dSAnton Yakovlev 479*d6568e3dSAnton Yakovlev struct virtio_snd_ctl_event { 480*d6568e3dSAnton Yakovlev /* VIRTIO_SND_EVT_CTL_NOTIFY */ 481*d6568e3dSAnton Yakovlev struct virtio_snd_hdr hdr; 482*d6568e3dSAnton Yakovlev /* 0 ... virtio_snd_config::controls - 1 */ 483*d6568e3dSAnton Yakovlev __le16 control_id; 484*d6568e3dSAnton Yakovlev /* event reason bit map (1 << VIRTIO_SND_CTL_EVT_MASK_XXX) */ 485*d6568e3dSAnton Yakovlev __le16 mask; 486*d6568e3dSAnton Yakovlev }; 487*d6568e3dSAnton Yakovlev 488de3a9980SAnton Yakovlev #endif /* VIRTIO_SND_IF_H */ 489