onix/
media.rs

1use crate::DeviceInfo;
2use crate::Request;
3use crate::Topology;
4use core::fmt;
5use log::trace;
6use rustix::fd::{AsFd, BorrowedFd, OwnedFd};
7use rustix::io::Result;
8use std::fs::OpenOptions;
9use std::io;
10use std::path::{Path, PathBuf};
11
12/// Represents a media API device, such as `/dev/media0`.
13pub struct Media {
14    fd: OwnedFd,
15    name: PathBuf,
16}
17
18impl fmt::Debug for Media {
19    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
20        fmt.debug_tuple("Media").field(&self.name).finish()
21    }
22}
23
24impl AsFd for Media {
25    fn as_fd(&self) -> BorrowedFd {
26        self.fd.as_fd()
27    }
28}
29
30impl Media {
31    /// Opens a new file descriptor to the given media device file path.
32    pub fn open<P: AsRef<Path>>(filename: P) -> io::Result<Media> {
33        let name = filename.as_ref().to_owned();
34        let file = OpenOptions::new().read(true).write(true).open(filename)?;
35        let fd = file.into();
36        trace!("open({name:?})");
37        Ok(Media { fd, name })
38    }
39
40    /// Returns the file path of this media device.
41    pub fn path(&self) -> &Path {
42        self.name.as_path()
43    }
44
45    /// Returns the description of this media device.
46    pub fn device_info(&self) -> Result<DeviceInfo> {
47        DeviceInfo::from_media(self)
48    }
49
50    /// Returns the topology of this media device.
51    pub fn get_topology(&self) -> Result<Topology> {
52        Topology::from_media(self)
53    }
54
55    /// Allocates a new request.
56    pub fn request_alloc(&self) -> Result<Request> {
57        Request::from_media(self)
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64
65    macro_rules! assert_size (
66        ($t:ty, $sz:expr) => (
67            assert_eq!(core::mem::size_of::<$t>(), $sz);
68        );
69    );
70
71    #[test]
72    fn size() {
73        assert_size!(Media, 32);
74    }
75}