alsactl/
elem_value.rs

1// SPDX-License-Identifier: MIT
2use super::*;
3
4/// Trait containing the rest of [`struct@ElemValue`] methods.
5///
6/// # Implementors
7///
8/// [`ElemValue`][struct@crate::ElemValue]
9pub trait ElemValueExtManual {
10    // NOTE: conversion between gboolean(=i32) and bool(=uchar in most ABIs). Read:
11    // https://gitlab.gnome.org/GNOME/gobject-introspection/-/issues/392
12    /// Copy the array into internal data for [`ElemType`][crate::ElemType].BOOLEAN element.
13    /// ## `values`
14    /// The array for boolean values.
15    #[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    /// Refer to the array specific to [`ElemType`][crate::ElemType].BYTES element in internal storage.
23    ///
24    /// # Returns
25    ///
26    ///
27    /// ## `values`
28    /// The array for 8 bit unsigned integer
29    ///          values.
30    #[doc(alias = "alsactl_elem_value_get_bytes")]
31    fn bytes(&self) -> &[u8];
32
33    /// Refer to the array for [`ElemType`][crate::ElemType].INTEGER element in internal storage.
34    ///
35    /// # Returns
36    ///
37    ///
38    /// ## `values`
39    /// The array for 32 bit signed integer
40    ///          values.
41    #[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    /// Refer to the array for [`ElemType`][crate::ElemType].INTEGER64 element in internal storage.
49    ///
50    /// # Returns
51    ///
52    ///
53    /// ## `values`
54    /// The array for 64 bit signed integer values.
55    #[doc(alias = "alsactl_elem_value_get_int64")]
56    fn int64(&self) -> &[i64];
57
58    /// Refer to the array specific to [`ElemType`][crate::ElemType].IEC60958 element in internal storage.
59    ///
60    /// # Returns
61    ///
62    ///
63    /// ## `status`
64    /// The array of byte data for channel status
65    ///          bits of IEC 60958.
66    #[doc(alias = "alsactl_elem_value_get_iec60958_channel_status")]
67    fn iec60958_channel_status(&self) -> &[u8];
68    /// Refer to the array specific to [`ElemType`][crate::ElemType].IEC60958 element in internal storage.
69    ///
70    /// # Returns
71    ///
72    ///
73    /// ## `data`
74    /// The array of byte data for user data bits of
75    ///        IEC 60958.
76    #[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}