#![allow(dead_code)]
#![allow(unused_variables)]
use std::any::Any;
use std::sync::Arc;
use crate::Args;
use crate::Direction;
use crate::Driver;
use crate::Error;
use crate::Range;
use crate::RxStreamer;
use crate::TxStreamer;
pub trait DeviceTrait: Any + Send {
type RxStreamer: RxStreamer;
type TxStreamer: TxStreamer;
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn driver(&self) -> Driver;
fn id(&self) -> Result<String, Error>;
fn info(&self) -> Result<Args, Error>;
fn num_channels(&self, direction: Direction) -> Result<usize, Error>;
fn full_duplex(&self, direction: Direction, channel: usize) -> Result<bool, Error>;
fn rx_streamer(&self, channels: &[usize], args: Args) -> Result<Self::RxStreamer, Error>;
fn tx_streamer(&self, channels: &[usize], args: Args) -> Result<Self::TxStreamer, Error>;
fn antennas(&self, direction: Direction, channel: usize) -> Result<Vec<String>, Error>;
fn antenna(&self, direction: Direction, channel: usize) -> Result<String, Error>;
fn set_antenna(&self, direction: Direction, channel: usize, name: &str) -> Result<(), Error>;
fn supports_agc(&self, direction: Direction, channel: usize) -> Result<bool, Error>;
fn enable_agc(&self, direction: Direction, channel: usize, agc: bool) -> Result<(), Error>;
fn agc(&self, direction: Direction, channel: usize) -> Result<bool, Error>;
fn gain_elements(&self, direction: Direction, channel: usize) -> Result<Vec<String>, Error>;
fn set_gain(&self, direction: Direction, channel: usize, gain: f64) -> Result<(), Error>;
fn gain(&self, direction: Direction, channel: usize) -> Result<Option<f64>, Error>;
fn gain_range(&self, direction: Direction, channel: usize) -> Result<Range, Error>;
fn set_gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
gain: f64,
) -> Result<(), Error>;
fn gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Option<f64>, Error>;
fn gain_element_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error>;
fn frequency_range(&self, direction: Direction, channel: usize) -> Result<Range, Error>;
fn frequency(&self, direction: Direction, channel: usize) -> Result<f64, Error>;
fn set_frequency(
&self,
direction: Direction,
channel: usize,
frequency: f64,
args: Args,
) -> Result<(), Error>;
fn frequency_components(
&self,
direction: Direction,
channel: usize,
) -> Result<Vec<String>, Error>;
fn component_frequency_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error>;
fn component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<f64, Error>;
fn set_component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
frequency: f64,
) -> Result<(), Error>;
fn sample_rate(&self, direction: Direction, channel: usize) -> Result<f64, Error>;
fn set_sample_rate(&self, direction: Direction, channel: usize, rate: f64)
-> Result<(), Error>;
fn get_sample_rate_range(&self, direction: Direction, channel: usize) -> Result<Range, Error>;
}
#[derive(Clone)]
pub struct Device<T: DeviceTrait + Clone + Any> {
dev: T,
}
impl Device<GenericDevice> {
pub fn new() -> Result<Self, Error> {
let mut devs = crate::enumerate()?;
if devs.is_empty() {
return Err(Error::NotFound);
}
Self::from_args(devs.remove(0))
}
pub fn from_args<A: TryInto<Args>>(args: A) -> Result<Self, Error> {
let args = args.try_into().map_err(|_| Error::ValueError)?;
let driver = match args.get::<Driver>("driver") {
Ok(d) => Some(d),
Err(Error::NotFound) => None,
Err(e) => return Err(e),
};
#[cfg(all(feature = "aaronia", any(target_os = "linux", target_os = "windows")))]
{
if driver.is_none() || matches!(driver, Some(Driver::Aaronia)) {
match crate::impls::Aaronia::open(&args) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
#[cfg(all(feature = "aaronia_http", not(target_arch = "wasm32")))]
{
if driver.is_none() || matches!(driver, Some(Driver::AaroniaHttp)) {
match crate::impls::AaroniaHttp::open(&args) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
#[cfg(all(feature = "rtlsdr", not(target_arch = "wasm32")))]
{
if driver.is_none() || matches!(driver, Some(Driver::RtlSdr)) {
match crate::impls::RtlSdr::open(&args) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
#[cfg(all(feature = "soapy", not(target_arch = "wasm32")))]
{
if driver.is_none() || matches!(driver, Some(Driver::Soapy)) {
match crate::impls::Soapy::open(&args) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
Err(Error::NotFound)
}
#[cfg(all(feature = "web", not(target_arch = "wasm32")))]
pub fn from_args_with_runtime<A: TryInto<Args>, E: crate::Executor, C: crate::Connect>(
args: A,
executor: E,
connector: C,
) -> Result<Self, Error> {
let args = args.try_into().or(Err(Error::ValueError))?;
let driver = match args.get::<Driver>("driver") {
Ok(d) => Some(d),
Err(Error::NotFound) => None,
Err(e) => return Err(e),
};
#[cfg(all(feature = "aaronia", any(target_os = "linux", target_os = "windows")))]
{
if driver.is_none() || matches!(driver, Some(Driver::Aaronia)) {
match crate::impls::Aaronia::open(&args) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
#[cfg(all(feature = "aaronia_http", not(target_arch = "wasm32")))]
{
if driver.is_none() || matches!(driver, Some(Driver::AaroniaHttp)) {
match crate::impls::AaroniaHttp::open_with_runtime(&args, executor, connector) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
#[cfg(all(feature = "rtlsdr", not(target_arch = "wasm32")))]
{
if driver.is_none() || matches!(driver, Some(Driver::RtlSdr)) {
match crate::impls::RtlSdr::open(&args) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
#[cfg(all(feature = "soapy", not(target_arch = "wasm32")))]
{
if driver.is_none() || matches!(driver, Some(Driver::Soapy)) {
match crate::impls::Soapy::open(&args) {
Ok(d) => {
return Ok(Device {
dev: Arc::new(DeviceWrapper { dev: d }),
})
}
Err(Error::NotFound) => {
if driver.is_some() {
return Err(Error::NotFound);
}
}
Err(e) => return Err(e),
}
}
}
Err(Error::NotFound)
}
}
pub type GenericDevice =
Arc<dyn DeviceTrait<RxStreamer = Box<dyn RxStreamer>, TxStreamer = Box<dyn TxStreamer>> + Sync>;
impl<T: DeviceTrait + Clone + Any> Device<T> {
pub fn from_impl(dev: T) -> Self {
Self { dev }
}
pub fn impl_ref<D: DeviceTrait + Any>(&self) -> Result<&D, Error> {
if let Some(d) = self.dev.as_any().downcast_ref::<D>() {
return Ok(d);
}
let d = self
.dev
.as_any()
.downcast_ref::<Arc<
(dyn DeviceTrait<
RxStreamer = Box<(dyn RxStreamer + 'static)>,
TxStreamer = Box<(dyn TxStreamer + 'static)>,
> + Sync
+ 'static),
>>()
.ok_or(Error::ValueError)?;
let d = (**d)
.as_any()
.downcast_ref::<DeviceWrapper<D>>()
.ok_or(Error::ValueError)?;
Ok(&d.dev)
}
pub fn impl_mut<D: DeviceTrait + Any>(&mut self) -> Result<&mut D, Error> {
if let Some(d) = self.dev.as_any().downcast_ref::<D>() {
Ok(self.dev.as_any_mut().downcast_mut::<D>().unwrap())
} else {
let d = self
.dev
.as_any_mut()
.downcast_mut::<Box<
(dyn DeviceTrait<
RxStreamer = Box<(dyn RxStreamer + 'static)>,
TxStreamer = Box<(dyn TxStreamer + 'static)>,
> + 'static),
>>()
.ok_or(Error::ValueError)?;
let d = (**d)
.as_any_mut()
.downcast_mut::<DeviceWrapper<D>>()
.ok_or(Error::ValueError)?;
Ok(&mut d.dev)
}
}
}
struct DeviceWrapper<D: DeviceTrait> {
dev: D,
}
impl<
R: RxStreamer + 'static,
T: TxStreamer + 'static,
D: DeviceTrait<RxStreamer = R, TxStreamer = T>,
> DeviceTrait for DeviceWrapper<D>
{
type RxStreamer = Box<dyn RxStreamer>;
type TxStreamer = Box<dyn TxStreamer>;
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn driver(&self) -> Driver {
self.dev.driver()
}
fn id(&self) -> Result<String, Error> {
self.dev.id()
}
fn info(&self) -> Result<Args, Error> {
self.dev.info()
}
fn num_channels(&self, direction: Direction) -> Result<usize, Error> {
self.dev.num_channels(direction)
}
fn full_duplex(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.dev.full_duplex(direction, channel)
}
fn rx_streamer(&self, channels: &[usize], args: Args) -> Result<Self::RxStreamer, Error> {
Ok(Box::new(self.dev.rx_streamer(channels, args)?))
}
fn tx_streamer(&self, channels: &[usize], args: Args) -> Result<Self::TxStreamer, Error> {
Ok(Box::new(self.dev.tx_streamer(channels, args)?))
}
fn antennas(&self, direction: Direction, channel: usize) -> Result<Vec<String>, Error> {
self.dev.antennas(direction, channel)
}
fn antenna(&self, direction: Direction, channel: usize) -> Result<String, Error> {
self.dev.antenna(direction, channel)
}
fn set_antenna(&self, direction: Direction, channel: usize, name: &str) -> Result<(), Error> {
self.dev.set_antenna(direction, channel, name)
}
fn gain_elements(&self, direction: Direction, channel: usize) -> Result<Vec<String>, Error> {
self.dev.gain_elements(direction, channel)
}
fn supports_agc(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.dev.supports_agc(direction, channel)
}
fn enable_agc(&self, direction: Direction, channel: usize, agc: bool) -> Result<(), Error> {
self.dev.enable_agc(direction, channel, agc)
}
fn agc(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.dev.agc(direction, channel)
}
fn set_gain(&self, direction: Direction, channel: usize, gain: f64) -> Result<(), Error> {
self.dev.set_gain(direction, channel, gain)
}
fn gain(&self, direction: Direction, channel: usize) -> Result<Option<f64>, Error> {
self.dev.gain(direction, channel)
}
fn gain_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.dev.gain_range(direction, channel)
}
fn set_gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
gain: f64,
) -> Result<(), Error> {
self.dev.set_gain_element(direction, channel, name, gain)
}
fn gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Option<f64>, Error> {
self.dev.gain_element(direction, channel, name)
}
fn gain_element_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error> {
self.dev.gain_element_range(direction, channel, name)
}
fn frequency_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.dev.frequency_range(direction, channel)
}
fn frequency(&self, direction: Direction, channel: usize) -> Result<f64, Error> {
self.dev.frequency(direction, channel)
}
fn set_frequency(
&self,
direction: Direction,
channel: usize,
frequency: f64,
args: Args,
) -> Result<(), Error> {
self.dev.set_frequency(direction, channel, frequency, args)
}
fn frequency_components(
&self,
direction: Direction,
channel: usize,
) -> Result<Vec<String>, Error> {
self.dev.frequency_components(direction, channel)
}
fn component_frequency_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error> {
self.dev.component_frequency_range(direction, channel, name)
}
fn component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<f64, Error> {
self.dev.component_frequency(direction, channel, name)
}
fn set_component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
frequency: f64,
) -> Result<(), Error> {
self.dev
.set_component_frequency(direction, channel, name, frequency)
}
fn sample_rate(&self, direction: Direction, channel: usize) -> Result<f64, Error> {
self.dev.sample_rate(direction, channel)
}
fn set_sample_rate(
&self,
direction: Direction,
channel: usize,
rate: f64,
) -> Result<(), Error> {
self.dev.set_sample_rate(direction, channel, rate)
}
fn get_sample_rate_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.dev.get_sample_rate_range(direction, channel)
}
}
#[doc(hidden)]
impl DeviceTrait for GenericDevice {
type RxStreamer = Box<dyn RxStreamer>;
type TxStreamer = Box<dyn TxStreamer>;
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn driver(&self) -> Driver {
self.as_ref().driver()
}
fn id(&self) -> Result<String, Error> {
self.as_ref().id()
}
fn info(&self) -> Result<Args, Error> {
self.as_ref().info()
}
fn num_channels(&self, direction: Direction) -> Result<usize, Error> {
self.as_ref().num_channels(direction)
}
fn full_duplex(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.as_ref().full_duplex(direction, channel)
}
fn rx_streamer(&self, channels: &[usize], args: Args) -> Result<Self::RxStreamer, Error> {
Ok(Box::new(self.as_ref().rx_streamer(channels, args)?))
}
fn tx_streamer(&self, channels: &[usize], args: Args) -> Result<Self::TxStreamer, Error> {
Ok(Box::new(self.as_ref().tx_streamer(channels, args)?))
}
fn antennas(&self, direction: Direction, channel: usize) -> Result<Vec<String>, Error> {
self.as_ref().antennas(direction, channel)
}
fn antenna(&self, direction: Direction, channel: usize) -> Result<String, Error> {
self.as_ref().antenna(direction, channel)
}
fn set_antenna(&self, direction: Direction, channel: usize, name: &str) -> Result<(), Error> {
self.as_ref().set_antenna(direction, channel, name)
}
fn gain_elements(&self, direction: Direction, channel: usize) -> Result<Vec<String>, Error> {
self.as_ref().gain_elements(direction, channel)
}
fn supports_agc(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.as_ref().supports_agc(direction, channel)
}
fn enable_agc(&self, direction: Direction, channel: usize, agc: bool) -> Result<(), Error> {
self.as_ref().enable_agc(direction, channel, agc)
}
fn agc(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.as_ref().agc(direction, channel)
}
fn set_gain(&self, direction: Direction, channel: usize, gain: f64) -> Result<(), Error> {
self.as_ref().set_gain(direction, channel, gain)
}
fn gain(&self, direction: Direction, channel: usize) -> Result<Option<f64>, Error> {
self.as_ref().gain(direction, channel)
}
fn gain_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.as_ref().gain_range(direction, channel)
}
fn set_gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
gain: f64,
) -> Result<(), Error> {
self.as_ref()
.set_gain_element(direction, channel, name, gain)
}
fn gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Option<f64>, Error> {
self.as_ref().gain_element(direction, channel, name)
}
fn gain_element_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error> {
self.as_ref().gain_element_range(direction, channel, name)
}
fn frequency_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.as_ref().frequency_range(direction, channel)
}
fn frequency(&self, direction: Direction, channel: usize) -> Result<f64, Error> {
self.as_ref().frequency(direction, channel)
}
fn set_frequency(
&self,
direction: Direction,
channel: usize,
frequency: f64,
args: Args,
) -> Result<(), Error> {
self.as_ref()
.set_frequency(direction, channel, frequency, args)
}
fn frequency_components(
&self,
direction: Direction,
channel: usize,
) -> Result<Vec<String>, Error> {
self.as_ref().frequency_components(direction, channel)
}
fn component_frequency_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error> {
self.as_ref()
.component_frequency_range(direction, channel, name)
}
fn component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<f64, Error> {
self.as_ref().component_frequency(direction, channel, name)
}
fn set_component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
frequency: f64,
) -> Result<(), Error> {
self.as_ref()
.set_component_frequency(direction, channel, name, frequency)
}
fn sample_rate(&self, direction: Direction, channel: usize) -> Result<f64, Error> {
self.as_ref().sample_rate(direction, channel)
}
fn set_sample_rate(
&self,
direction: Direction,
channel: usize,
rate: f64,
) -> Result<(), Error> {
self.as_ref().set_sample_rate(direction, channel, rate)
}
fn get_sample_rate_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.as_ref().get_sample_rate_range(direction, channel)
}
}
impl<
R: RxStreamer + 'static,
T: TxStreamer + 'static,
D: DeviceTrait<RxStreamer = R, TxStreamer = T> + Clone + 'static,
> Device<D>
{
pub fn driver(&self) -> Driver {
self.dev.driver()
}
pub fn id(&self) -> Result<String, Error> {
self.dev.id()
}
pub fn info(&self) -> Result<Args, Error> {
self.dev.info()
}
pub fn num_channels(&self, direction: Direction) -> Result<usize, Error> {
self.dev.num_channels(direction)
}
pub fn full_duplex(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.dev.full_duplex(direction, channel)
}
pub fn rx_streamer(&self, channels: &[usize]) -> Result<R, Error> {
self.dev.rx_streamer(channels, Args::new())
}
pub fn rx_streamer_with_args(&self, channels: &[usize], args: Args) -> Result<R, Error> {
self.dev.rx_streamer(channels, args)
}
pub fn tx_streamer(&self, channels: &[usize]) -> Result<T, Error> {
self.dev.tx_streamer(channels, Args::new())
}
pub fn tx_streamer_with_args(&self, channels: &[usize], args: Args) -> Result<T, Error> {
self.dev.tx_streamer(channels, args)
}
pub fn antennas(&self, direction: Direction, channel: usize) -> Result<Vec<String>, Error> {
self.dev.antennas(direction, channel)
}
pub fn antenna(&self, direction: Direction, channel: usize) -> Result<String, Error> {
self.dev.antenna(direction, channel)
}
pub fn set_antenna(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<(), Error> {
self.dev.set_antenna(direction, channel, name)
}
pub fn supports_agc(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.dev.supports_agc(direction, channel)
}
pub fn enable_agc(&self, direction: Direction, channel: usize, agc: bool) -> Result<(), Error> {
self.dev.enable_agc(direction, channel, agc)
}
pub fn agc(&self, direction: Direction, channel: usize) -> Result<bool, Error> {
self.dev.agc(direction, channel)
}
pub fn gain_elements(
&self,
direction: Direction,
channel: usize,
) -> Result<Vec<String>, Error> {
self.dev.gain_elements(direction, channel)
}
pub fn set_gain(&self, direction: Direction, channel: usize, gain: f64) -> Result<(), Error> {
self.dev.set_gain(direction, channel, gain)
}
pub fn gain(&self, direction: Direction, channel: usize) -> Result<Option<f64>, Error> {
self.dev.gain(direction, channel)
}
pub fn gain_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.dev.gain_range(direction, channel)
}
pub fn set_gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
gain: f64,
) -> Result<(), Error> {
self.dev.set_gain_element(direction, channel, name, gain)
}
pub fn gain_element(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Option<f64>, Error> {
self.dev.gain_element(direction, channel, name)
}
pub fn gain_element_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error> {
self.dev.gain_element_range(direction, channel, name)
}
pub fn frequency_range(&self, direction: Direction, channel: usize) -> Result<Range, Error> {
self.dev.frequency_range(direction, channel)
}
pub fn frequency(&self, direction: Direction, channel: usize) -> Result<f64, Error> {
self.dev.frequency(direction, channel)
}
pub fn set_frequency(
&self,
direction: Direction,
channel: usize,
frequency: f64,
) -> Result<(), Error> {
self.dev
.set_frequency(direction, channel, frequency, Args::new())
}
pub fn set_frequency_with_args(
&self,
direction: Direction,
channel: usize,
frequency: f64,
args: Args,
) -> Result<(), Error> {
self.dev.set_frequency(direction, channel, frequency, args)
}
pub fn frequency_components(
&self,
direction: Direction,
channel: usize,
) -> Result<Vec<String>, Error> {
self.dev.frequency_components(direction, channel)
}
pub fn component_frequency_range(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<Range, Error> {
self.dev.component_frequency_range(direction, channel, name)
}
pub fn component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
) -> Result<f64, Error> {
self.dev.component_frequency(direction, channel, name)
}
pub fn set_component_frequency(
&self,
direction: Direction,
channel: usize,
name: &str,
frequency: f64,
) -> Result<(), Error> {
self.dev
.set_component_frequency(direction, channel, name, frequency)
}
pub fn sample_rate(&self, direction: Direction, channel: usize) -> Result<f64, Error> {
self.dev.sample_rate(direction, channel)
}
pub fn set_sample_rate(
&self,
direction: Direction,
channel: usize,
rate: f64,
) -> Result<(), Error> {
self.dev.set_sample_rate(direction, channel, rate)
}
pub fn get_sample_rate_range(
&self,
direction: Direction,
channel: usize,
) -> Result<Range, Error> {
self.dev.get_sample_rate_range(direction, channel)
}
}