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
12pub 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 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 pub fn path(&self) -> &Path {
42 self.name.as_path()
43 }
44
45 pub fn device_info(&self) -> Result<DeviceInfo> {
47 DeviceInfo::from_media(self)
48 }
49
50 pub fn get_topology(&self) -> Result<Topology> {
52 Topology::from_media(self)
53 }
54
55 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}