77
88#include <linux/virtio_types.h>
99
10+ /*******************************************************************************
11+ * FEATURE BITS
12+ */
13+ enum {
14+ /* device supports control elements */
15+ VIRTIO_SND_F_CTLS = 0
16+ };
17+
1018/*******************************************************************************
1119 * CONFIGURATION SPACE
1220 */
@@ -17,6 +25,8 @@ struct virtio_snd_config {
1725 __le32 streams ;
1826 /* # of available channel maps */
1927 __le32 chmaps ;
28+ /* # of available control elements */
29+ __le32 controls ;
2030};
2131
2232enum {
@@ -55,6 +65,15 @@ enum {
5565 /* channel map control request types */
5666 VIRTIO_SND_R_CHMAP_INFO = 0x0200 ,
5767
68+ /* control element request types */
69+ VIRTIO_SND_R_CTL_INFO = 0x0300 ,
70+ VIRTIO_SND_R_CTL_ENUM_ITEMS ,
71+ VIRTIO_SND_R_CTL_READ ,
72+ VIRTIO_SND_R_CTL_WRITE ,
73+ VIRTIO_SND_R_CTL_TLV_READ ,
74+ VIRTIO_SND_R_CTL_TLV_WRITE ,
75+ VIRTIO_SND_R_CTL_TLV_COMMAND ,
76+
5877 /* jack event types */
5978 VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000 ,
6079 VIRTIO_SND_EVT_JACK_DISCONNECTED ,
6382 VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100 ,
6483 VIRTIO_SND_EVT_PCM_XRUN ,
6584
85+ /* control element event types */
86+ VIRTIO_SND_EVT_CTL_NOTIFY = 0x1200 ,
87+
6688 /* common status codes */
6789 VIRTIO_SND_S_OK = 0x8000 ,
6890 VIRTIO_SND_S_BAD_MSG ,
@@ -331,4 +353,136 @@ struct virtio_snd_chmap_info {
331353 __u8 positions [VIRTIO_SND_CHMAP_MAX_SIZE ];
332354};
333355
356+ /*******************************************************************************
357+ * CONTROL ELEMENTS MESSAGES
358+ */
359+ struct virtio_snd_ctl_hdr {
360+ /* VIRTIO_SND_R_CTL_XXX */
361+ struct virtio_snd_hdr hdr ;
362+ /* 0 ... virtio_snd_config::controls - 1 */
363+ __le32 control_id ;
364+ };
365+
366+ /* supported roles for control elements */
367+ enum {
368+ VIRTIO_SND_CTL_ROLE_UNDEFINED = 0 ,
369+ VIRTIO_SND_CTL_ROLE_VOLUME ,
370+ VIRTIO_SND_CTL_ROLE_MUTE ,
371+ VIRTIO_SND_CTL_ROLE_GAIN
372+ };
373+
374+ /* supported value types for control elements */
375+ enum {
376+ VIRTIO_SND_CTL_TYPE_BOOLEAN = 0 ,
377+ VIRTIO_SND_CTL_TYPE_INTEGER ,
378+ VIRTIO_SND_CTL_TYPE_INTEGER64 ,
379+ VIRTIO_SND_CTL_TYPE_ENUMERATED ,
380+ VIRTIO_SND_CTL_TYPE_BYTES ,
381+ VIRTIO_SND_CTL_TYPE_IEC958
382+ };
383+
384+ /* supported access rights for control elements */
385+ enum {
386+ VIRTIO_SND_CTL_ACCESS_READ = 0 ,
387+ VIRTIO_SND_CTL_ACCESS_WRITE ,
388+ VIRTIO_SND_CTL_ACCESS_VOLATILE ,
389+ VIRTIO_SND_CTL_ACCESS_INACTIVE ,
390+ VIRTIO_SND_CTL_ACCESS_TLV_READ ,
391+ VIRTIO_SND_CTL_ACCESS_TLV_WRITE ,
392+ VIRTIO_SND_CTL_ACCESS_TLV_COMMAND
393+ };
394+
395+ struct virtio_snd_ctl_info {
396+ /* common header */
397+ struct virtio_snd_info hdr ;
398+ /* element role (VIRTIO_SND_CTL_ROLE_XXX) */
399+ __le32 role ;
400+ /* element value type (VIRTIO_SND_CTL_TYPE_XXX) */
401+ __le32 type ;
402+ /* element access right bit map (1 << VIRTIO_SND_CTL_ACCESS_XXX) */
403+ __le32 access ;
404+ /* # of members in the element value */
405+ __le32 count ;
406+ /* index for an element with a non-unique name */
407+ __le32 index ;
408+ /* name identifier string for the element */
409+ __u8 name [44 ];
410+ /* additional information about the element's value */
411+ union {
412+ /* VIRTIO_SND_CTL_TYPE_INTEGER */
413+ struct {
414+ /* minimum supported value */
415+ __le32 min ;
416+ /* maximum supported value */
417+ __le32 max ;
418+ /* fixed step size for value (0 = variable size) */
419+ __le32 step ;
420+ } integer ;
421+ /* VIRTIO_SND_CTL_TYPE_INTEGER64 */
422+ struct {
423+ /* minimum supported value */
424+ __le64 min ;
425+ /* maximum supported value */
426+ __le64 max ;
427+ /* fixed step size for value (0 = variable size) */
428+ __le64 step ;
429+ } integer64 ;
430+ /* VIRTIO_SND_CTL_TYPE_ENUMERATED */
431+ struct {
432+ /* # of options supported for value */
433+ __le32 items ;
434+ } enumerated ;
435+ } value ;
436+ };
437+
438+ struct virtio_snd_ctl_enum_item {
439+ /* option name */
440+ __u8 item [64 ];
441+ };
442+
443+ struct virtio_snd_ctl_iec958 {
444+ /* AES/IEC958 channel status bits */
445+ __u8 status [24 ];
446+ /* AES/IEC958 subcode bits */
447+ __u8 subcode [147 ];
448+ /* nothing */
449+ __u8 pad ;
450+ /* AES/IEC958 subframe bits */
451+ __u8 dig_subframe [4 ];
452+ };
453+
454+ struct virtio_snd_ctl_value {
455+ union {
456+ /* VIRTIO_SND_CTL_TYPE_BOOLEAN|INTEGER value */
457+ __le32 integer [128 ];
458+ /* VIRTIO_SND_CTL_TYPE_INTEGER64 value */
459+ __le64 integer64 [64 ];
460+ /* VIRTIO_SND_CTL_TYPE_ENUMERATED value (option indexes) */
461+ __le32 enumerated [128 ];
462+ /* VIRTIO_SND_CTL_TYPE_BYTES value */
463+ __u8 bytes [512 ];
464+ /* VIRTIO_SND_CTL_TYPE_IEC958 value */
465+ struct virtio_snd_ctl_iec958 iec958 ;
466+ } value ;
467+ };
468+
469+ /* supported event reason types */
470+ enum {
471+ /* element's value has changed */
472+ VIRTIO_SND_CTL_EVT_MASK_VALUE = 0 ,
473+ /* element's information has changed */
474+ VIRTIO_SND_CTL_EVT_MASK_INFO ,
475+ /* element's metadata has changed */
476+ VIRTIO_SND_CTL_EVT_MASK_TLV
477+ };
478+
479+ struct virtio_snd_ctl_event {
480+ /* VIRTIO_SND_EVT_CTL_NOTIFY */
481+ struct virtio_snd_hdr hdr ;
482+ /* 0 ... virtio_snd_config::controls - 1 */
483+ __le16 control_id ;
484+ /* event reason bit map (1 << VIRTIO_SND_CTL_EVT_MASK_XXX) */
485+ __le16 mask ;
486+ };
487+
334488#endif /* VIRTIO_SND_IF_H */
0 commit comments