1use super::*;
3
4pub trait ElemValueExtManual {
10 #[doc(alias = "alsactl_elem_value_set_bool")]
16 fn set_bool(&self, values: &[bool]);
17
18 #[doc(alias = "alsactl_elem_value_get_bool")]
19 #[doc(alias = "get_bool")]
20 fn boolean(&self) -> Vec<bool>;
21
22 #[doc(alias = "alsactl_elem_value_get_bytes")]
31 fn bytes(&self) -> &[u8];
32
33 #[doc(alias = "alsactl_elem_value_get_int")]
42 fn int(&self) -> &[i32];
43
44 #[doc(alias = "alsactl_elem_value_get_enum")]
45 #[doc(alias = "get_enum")]
46 fn enumerated(&self) -> &[u32];
47
48 #[doc(alias = "alsactl_elem_value_get_int64")]
56 fn int64(&self) -> &[i64];
57
58 #[doc(alias = "alsactl_elem_value_get_iec60958_channel_status")]
67 fn iec60958_channel_status(&self) -> &[u8];
68 #[doc(alias = "alsactl_elem_value_get_iec60958_user_data")]
77 fn iec60958_user_data(&self) -> &[u8];
78}
79
80impl<O: IsA<ElemValue>> ElemValueExtManual for O {
81 fn set_bool(&self, values: &[bool]) {
82 let entries: Vec<glib::ffi::gboolean> = values.iter().map(|&val| val.into_glib()).collect();
83
84 unsafe {
85 ffi::alsactl_elem_value_set_bool(
86 self.as_ref().to_glib_none().0,
87 entries.as_ptr(),
88 entries.len(),
89 );
90 }
91 }
92
93 fn boolean(&self) -> Vec<bool> {
94 let mut data = std::ptr::null_mut() as *const [glib::ffi::gboolean; 128];
95
96 unsafe {
97 ffi::alsactl_elem_value_get_bool(self.as_ref().to_glib_none().0, &mut data);
98
99 (*data).iter().map(|&val| from_glib(val)).collect()
100 }
101 }
102
103 fn bytes(&self) -> &[u8] {
104 unsafe {
105 let mut data = std::ptr::null_mut() as *const [u8; 512];
106
107 ffi::alsactl_elem_value_get_bytes(self.as_ref().to_glib_none().0, &mut data);
108
109 &*data
110 }
111 }
112
113 fn int(&self) -> &[i32] {
114 unsafe {
115 let mut data = std::ptr::null_mut() as *const [i32; 128];
116
117 ffi::alsactl_elem_value_get_int(self.as_ref().to_glib_none().0, &mut data);
118
119 &*data
120 }
121 }
122
123 fn enumerated(&self) -> &[u32] {
124 unsafe {
125 let mut data = std::ptr::null_mut() as *const [u32; 128];
126
127 ffi::alsactl_elem_value_get_enum(self.as_ref().to_glib_none().0, &mut data);
128
129 &*data
130 }
131 }
132
133 fn int64(&self) -> &[i64] {
134 unsafe {
135 let mut data = std::ptr::null_mut() as *const [i64; 64];
136
137 ffi::alsactl_elem_value_get_int64(self.as_ref().to_glib_none().0, &mut data);
138
139 &*data
140 }
141 }
142
143 fn iec60958_channel_status(&self) -> &[u8] {
144 unsafe {
145 let mut data = std::ptr::null_mut() as *const [u8; 24];
146
147 ffi::alsactl_elem_value_get_iec60958_channel_status(
148 self.as_ref().to_glib_none().0,
149 &mut data,
150 );
151
152 &*data
153 }
154 }
155
156 fn iec60958_user_data(&self) -> &[u8] {
157 unsafe {
158 let mut data = std::ptr::null_mut() as *const [u8; 147];
159
160 ffi::alsactl_elem_value_get_iec60958_user_data(
161 self.as_ref().to_glib_none().0,
162 &mut data,
163 );
164
165 &*data
166 }
167 }
168}
169
170#[cfg(test)]
171mod test {
172 use crate::{prelude::*, *};
173
174 #[test]
175 fn test_manual_bindings() {
176 let val = ElemValue::new();
177
178 let bool_expected = [false, true, false, true, true, false];
179 val.set_bool(&bool_expected);
180 assert_eq!(bool_expected, val.boolean()[..bool_expected.len()]);
181
182 let bytes_expected = [5, 4, 0, 2, 1, 8, 19, 21, 128, 212, 192];
183 val.set_bytes(&bytes_expected);
184 assert_eq!(bytes_expected, val.bytes()[..bytes_expected.len()]);
185
186 let int_expected = [5, -4, 0, 2, 1, 8, 19, 21, -128, 212, -192000];
187 val.set_int(&int_expected);
188 assert_eq!(int_expected, val.int()[..int_expected.len()]);
189
190 let enum_expected = [5, 4, 0, 2, 1, 8, 19, 21, 128, 212, 192];
191 val.set_enum(&enum_expected);
192 assert_eq!(enum_expected, val.enumerated()[..enum_expected.len()]);
193
194 let int64_expected = [5, 4, 0, 2, 1, 8, -1938754, 21, 128, 212, -92854];
195 val.set_int64(&int64_expected);
196 assert_eq!(int64_expected, val.int64()[..int64_expected.len()]);
197
198 let status_expected = [9, 7, 4, 124, 67];
199 val.set_iec60958_channel_status(&status_expected);
200 assert_eq!(
201 status_expected,
202 val.iec60958_channel_status()[..status_expected.len()]
203 );
204
205 let data_expected = [31, 211, 198, 90, 28, 8, 49];
206 val.set_iec60958_user_data(&data_expected);
207 assert_eq!(
208 data_expected,
209 val.iec60958_user_data()[..data_expected.len()]
210 );
211 }
212}