1 // Copyright 2020 The ChromiumOS Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 use data_model::Le32; 6 use data_model::Le64; 7 use serde::Deserialize; 8 use serde::Serialize; 9 use zerocopy::AsBytes; 10 use zerocopy::FromBytes; 11 use zerocopy::FromZeroes; 12 13 use crate::virtio::snd::constants::StatusCode; 14 use crate::virtio::snd::constants::VIRTIO_SND_CHMAP_MAX_SIZE; 15 16 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes, Serialize, Deserialize)] 17 #[repr(C)] 18 pub struct virtio_snd_hdr { 19 pub code: Le32, 20 } 21 22 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)] 23 #[repr(C)] 24 pub struct virtio_snd_jack_hdr { 25 pub hdr: virtio_snd_hdr, 26 pub jack_id: Le32, 27 } 28 29 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)] 30 #[repr(C)] 31 pub struct virtio_snd_event { 32 pub hdr: virtio_snd_hdr, 33 pub data: Le32, 34 } 35 36 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)] 37 #[repr(C)] 38 pub struct virtio_snd_query_info { 39 pub hdr: virtio_snd_hdr, 40 pub start_id: Le32, 41 pub count: Le32, 42 pub size: Le32, 43 } 44 45 #[derive( 46 Copy, 47 Clone, 48 Default, 49 AsBytes, 50 FromZeroes, 51 FromBytes, 52 Serialize, 53 Deserialize, 54 PartialEq, 55 Eq, 56 Debug, 57 )] 58 #[repr(C)] 59 pub struct virtio_snd_info { 60 pub hda_fn_nid: Le32, 61 } 62 63 #[derive( 64 Copy, 65 Clone, 66 Default, 67 AsBytes, 68 FromZeroes, 69 FromBytes, 70 Serialize, 71 Deserialize, 72 PartialEq, 73 Eq, 74 Debug, 75 )] 76 #[repr(C)] 77 pub struct virtio_snd_pcm_info { 78 pub hdr: virtio_snd_info, 79 pub features: Le32, /* 1 << VIRTIO_SND_PCM_F_XXX */ 80 pub formats: Le64, /* 1 << VIRTIO_SND_PCM_FMT_XXX */ 81 pub rates: Le64, /* 1 << VIRTIO_SND_PCM_RATE_XXX */ 82 pub direction: u8, 83 pub channels_min: u8, 84 pub channels_max: u8, 85 86 pub padding: [u8; 5], 87 } 88 89 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes, Serialize, Deserialize)] 90 #[repr(C)] 91 pub struct virtio_snd_pcm_hdr { 92 pub hdr: virtio_snd_hdr, 93 pub stream_id: Le32, 94 } 95 96 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes, Serialize, Deserialize)] 97 #[repr(C)] 98 pub struct virtio_snd_pcm_set_params { 99 pub hdr: virtio_snd_pcm_hdr, 100 pub buffer_bytes: Le32, 101 pub period_bytes: Le32, 102 pub features: Le32, /* 1 << VIRTIO_SND_PCM_F_XXX */ 103 pub channels: u8, 104 pub format: u8, 105 pub rate: u8, 106 pub padding: u8, 107 } 108 109 #[derive(Copy, Clone, AsBytes, FromZeroes, FromBytes)] 110 #[repr(C)] 111 pub struct virtio_snd_pcm_xfer { 112 pub stream_id: Le32, 113 } 114 115 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)] 116 #[repr(C)] 117 pub struct virtio_snd_pcm_status { 118 pub status: Le32, 119 pub latency_bytes: Le32, 120 } 121 122 impl virtio_snd_pcm_status { new(status: StatusCode, latency_bytes: u32) -> Self123 pub fn new(status: StatusCode, latency_bytes: u32) -> Self { 124 Self { 125 status: Le32::from(status as u32), 126 latency_bytes: Le32::from(latency_bytes), 127 } 128 } 129 } 130 131 #[derive( 132 Copy, 133 Clone, 134 Default, 135 AsBytes, 136 FromZeroes, 137 FromBytes, 138 Serialize, 139 Deserialize, 140 PartialEq, 141 Eq, 142 Debug, 143 )] 144 #[repr(C)] 145 pub struct virtio_snd_jack_info { 146 pub hdr: virtio_snd_info, 147 pub features: Le32, /* 1 << VIRTIO_SND_JACK_F_XXX */ 148 pub hda_reg_defconf: Le32, 149 pub hda_reg_caps: Le32, 150 pub connected: u8, 151 pub padding: [u8; 7], 152 } 153 154 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)] 155 #[repr(C)] 156 pub struct virtio_snd_jack_remap { 157 pub hdr: virtio_snd_jack_hdr, /* .code = VIRTIO_SND_R_JACK_REMAP */ 158 pub association: Le32, 159 pub sequence: Le32, 160 } 161 162 #[derive( 163 Copy, 164 Clone, 165 Default, 166 AsBytes, 167 FromZeroes, 168 FromBytes, 169 Serialize, 170 Deserialize, 171 PartialEq, 172 Eq, 173 Debug, 174 )] 175 #[repr(C)] 176 pub struct virtio_snd_chmap_info { 177 pub hdr: virtio_snd_info, 178 pub direction: u8, 179 pub channels: u8, 180 pub positions: [u8; VIRTIO_SND_CHMAP_MAX_SIZE], 181 } 182