use std::error;
use std::fmt;
use std::str::FromStr;
use audio_streams::shm_streams::SharedMemory;
use audio_streams::shm_streams::ShmStream;
use audio_streams::shm_streams::ShmStreamSource;
use audio_streams::BoxError;
use audio_streams::SampleFormat;
use audio_streams::StreamDirection;
use audio_streams::StreamEffect;
use audio_streams::StreamSource;
use audio_streams::StreamSourceGenerator;
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[allow(non_camel_case_types)]
pub enum CRAS_CLIENT_TYPE {
#[serde(rename = "arcvm")]
CRAS_CLIENT_TYPE_ARCVM,
#[serde(rename = "crosvm")]
CRAS_CLIENT_TYPE_CROSVM,
}
pub type CrasClientType = CRAS_CLIENT_TYPE;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[allow(non_camel_case_types)]
pub enum CRAS_STREAM_TYPE {
#[serde(rename = "default")]
CRAS_STREAM_TYPE_DEFAULT,
#[serde(rename = "pro_audio")]
CRAS_STREAM_TYPE_PRO_AUDIO,
}
pub type CrasStreamType = CRAS_STREAM_TYPE;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum CrasSocketType {
Legacy,
Unified,
}
#[derive(Debug)]
pub enum Error {
InvalidClientType,
InvalidSocketType,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "")
}
}
impl error::Error for Error {}
pub type CrasSysError = Error;
impl FromStr for CrasClientType {
type Err = CrasSysError;
fn from_str(cras_type: &str) -> std::result::Result<Self, Self::Err> {
match cras_type {
"crosvm" => Ok(CrasClientType::CRAS_CLIENT_TYPE_CROSVM),
"arcvm" => Ok(CrasClientType::CRAS_CLIENT_TYPE_ARCVM),
_ => Err(Error::InvalidClientType),
}
}
}
impl FromStr for CrasSocketType {
type Err = Error;
fn from_str(sock_type: &str) -> std::result::Result<Self, Self::Err> {
match sock_type {
"legacy" => Ok(CrasSocketType::Legacy),
"unified" => Ok(CrasSocketType::Unified),
_ => Err(Error::InvalidSocketType),
}
}
}
pub struct CrasStreamSourceGenerator {}
impl CrasStreamSourceGenerator {
pub fn new(_capture: bool, _client_type: CrasClientType, _socket_type: CrasSocketType) -> Self {
panic!("Cannot create cras audio device on non-chromeos crosvm builds.")
}
pub fn with_stream_type(
_capture: bool,
_client_type: CrasClientType,
_socket_type: CrasSocketType,
_stream_type: CrasStreamType,
) -> Self {
panic!("Cannot create cras audio device on non-chromeos crosvm builds.")
}
}
impl StreamSourceGenerator for CrasStreamSourceGenerator {
fn generate(&self) -> std::result::Result<Box<dyn StreamSource>, BoxError> {
panic!("Cannot create cras audio device on non-chromeos crosvm builds.")
}
}
pub fn deserialize_cras_client_type<'de, D: Deserializer<'de>>(
deserializer: D,
) -> std::result::Result<CRAS_CLIENT_TYPE, D::Error> {
let s = String::deserialize(deserializer)?;
match s.parse() {
Ok(client_type) => Ok(client_type),
Err(e) => Err(serde::de::Error::custom(e.to_string())),
}
}
type Result<T> = std::result::Result<T, Error>;
pub struct CrasClient {}
impl CrasClient {
pub fn with_type(_: CrasSocketType) -> Result<Self> {
panic!("Cannot create cras audio device on non-chromeos crosvm builds.")
}
pub fn set_client_type(&mut self, _: CrasClientType) {}
pub fn enable_cras_capture(&mut self) {}
}
impl<E: std::error::Error> ShmStreamSource<E> for CrasClient {
fn new_stream(
&mut self,
_direction: StreamDirection,
_num_channels: usize,
_format: SampleFormat,
_frame_rate: u32,
_buffer_size: usize,
_effects: &[StreamEffect],
_client_shm: &dyn SharedMemory<Error = E>,
_buffer_offsets: [u64; 2],
) -> std::result::Result<Box<dyn ShmStream>, BoxError> {
panic!("Cannot create cras audio device on non-chromeos crosvm builds.")
}
}