1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2021 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker use audio_streams::SampleFormat;
6*bb4ee6a4SAndroid Build Coastguard Worker use remain::sorted;
7*bb4ee6a4SAndroid Build Coastguard Worker use thiserror::Error as ThisError;
8*bb4ee6a4SAndroid Build Coastguard Worker
9*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::snd::constants::*;
10*bb4ee6a4SAndroid Build Coastguard Worker
11*bb4ee6a4SAndroid Build Coastguard Worker #[sorted]
12*bb4ee6a4SAndroid Build Coastguard Worker #[derive(ThisError, Debug)]
13*bb4ee6a4SAndroid Build Coastguard Worker pub enum Error {
14*bb4ee6a4SAndroid Build Coastguard Worker #[error("Unsupported frame rate: {0}")]
15*bb4ee6a4SAndroid Build Coastguard Worker UnsupportedFrameRate(u32),
16*bb4ee6a4SAndroid Build Coastguard Worker #[error("Unsupported virtio frame rate: {0}")]
17*bb4ee6a4SAndroid Build Coastguard Worker UnsupportedVirtioFrameRate(u8),
18*bb4ee6a4SAndroid Build Coastguard Worker #[error("Unsupported virtio pcm format: {0}")]
19*bb4ee6a4SAndroid Build Coastguard Worker UnsupportedVirtioPcmFormat(u8),
20*bb4ee6a4SAndroid Build Coastguard Worker }
21*bb4ee6a4SAndroid Build Coastguard Worker
22*bb4ee6a4SAndroid Build Coastguard Worker type Result<T> = std::result::Result<T, Error>;
23*bb4ee6a4SAndroid Build Coastguard Worker
24*bb4ee6a4SAndroid Build Coastguard Worker /// Converts VIRTIO_SND_PCM_RATE_* enum to frame rate
from_virtio_frame_rate(virtio_frame_rate: u8) -> Result<u32>25*bb4ee6a4SAndroid Build Coastguard Worker pub fn from_virtio_frame_rate(virtio_frame_rate: u8) -> Result<u32> {
26*bb4ee6a4SAndroid Build Coastguard Worker Ok(match virtio_frame_rate {
27*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_5512 => 5512u32,
28*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_8000 => 8000u32,
29*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_11025 => 11025u32,
30*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_16000 => 16000u32,
31*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_22050 => 22050u32,
32*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_32000 => 32000u32,
33*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_44100 => 44100u32,
34*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_48000 => 48000u32,
35*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_64000 => 64000u32,
36*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_88200 => 88200u32,
37*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_96000 => 96000u32,
38*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_176400 => 176400u32,
39*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_192000 => 192000u32,
40*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_RATE_384000 => 384000u32,
41*bb4ee6a4SAndroid Build Coastguard Worker _ => {
42*bb4ee6a4SAndroid Build Coastguard Worker return Err(Error::UnsupportedVirtioFrameRate(virtio_frame_rate));
43*bb4ee6a4SAndroid Build Coastguard Worker }
44*bb4ee6a4SAndroid Build Coastguard Worker })
45*bb4ee6a4SAndroid Build Coastguard Worker }
46*bb4ee6a4SAndroid Build Coastguard Worker
47*bb4ee6a4SAndroid Build Coastguard Worker /// Converts VIRTIO_SND_PCM_FMT_* enum to SampleFormat
from_virtio_sample_format(virtio_pcm_format: u8) -> Result<SampleFormat>48*bb4ee6a4SAndroid Build Coastguard Worker pub fn from_virtio_sample_format(virtio_pcm_format: u8) -> Result<SampleFormat> {
49*bb4ee6a4SAndroid Build Coastguard Worker Ok(match virtio_pcm_format {
50*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_FMT_U8 => SampleFormat::U8,
51*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_FMT_S16 => SampleFormat::S16LE,
52*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_FMT_S24 => SampleFormat::S24LE,
53*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_PCM_FMT_S32 => SampleFormat::S32LE,
54*bb4ee6a4SAndroid Build Coastguard Worker _ => {
55*bb4ee6a4SAndroid Build Coastguard Worker return Err(Error::UnsupportedVirtioPcmFormat(virtio_pcm_format));
56*bb4ee6a4SAndroid Build Coastguard Worker }
57*bb4ee6a4SAndroid Build Coastguard Worker })
58*bb4ee6a4SAndroid Build Coastguard Worker }
59*bb4ee6a4SAndroid Build Coastguard Worker
60*bb4ee6a4SAndroid Build Coastguard Worker /// Converts SampleFormat to VIRTIO_SND_PCM_FMT_*
from_sample_format(format: SampleFormat) -> u861*bb4ee6a4SAndroid Build Coastguard Worker pub fn from_sample_format(format: SampleFormat) -> u8 {
62*bb4ee6a4SAndroid Build Coastguard Worker match format {
63*bb4ee6a4SAndroid Build Coastguard Worker SampleFormat::U8 => VIRTIO_SND_PCM_FMT_U8,
64*bb4ee6a4SAndroid Build Coastguard Worker SampleFormat::S16LE => VIRTIO_SND_PCM_FMT_S16,
65*bb4ee6a4SAndroid Build Coastguard Worker SampleFormat::S24LE => VIRTIO_SND_PCM_FMT_S24,
66*bb4ee6a4SAndroid Build Coastguard Worker SampleFormat::S32LE => VIRTIO_SND_PCM_FMT_S32,
67*bb4ee6a4SAndroid Build Coastguard Worker }
68*bb4ee6a4SAndroid Build Coastguard Worker }
69*bb4ee6a4SAndroid Build Coastguard Worker
70*bb4ee6a4SAndroid Build Coastguard Worker /// Converts frame rate to VIRTIO_SND_PCM_RATE_* enum
virtio_frame_rate(frame_rate: u32) -> Result<u8>71*bb4ee6a4SAndroid Build Coastguard Worker pub fn virtio_frame_rate(frame_rate: u32) -> Result<u8> {
72*bb4ee6a4SAndroid Build Coastguard Worker Ok(match frame_rate {
73*bb4ee6a4SAndroid Build Coastguard Worker 5512u32 => VIRTIO_SND_PCM_RATE_5512,
74*bb4ee6a4SAndroid Build Coastguard Worker 8000u32 => VIRTIO_SND_PCM_RATE_8000,
75*bb4ee6a4SAndroid Build Coastguard Worker 11025u32 => VIRTIO_SND_PCM_RATE_11025,
76*bb4ee6a4SAndroid Build Coastguard Worker 16000u32 => VIRTIO_SND_PCM_RATE_16000,
77*bb4ee6a4SAndroid Build Coastguard Worker 22050u32 => VIRTIO_SND_PCM_RATE_22050,
78*bb4ee6a4SAndroid Build Coastguard Worker 32000u32 => VIRTIO_SND_PCM_RATE_32000,
79*bb4ee6a4SAndroid Build Coastguard Worker 44100u32 => VIRTIO_SND_PCM_RATE_44100,
80*bb4ee6a4SAndroid Build Coastguard Worker 48000u32 => VIRTIO_SND_PCM_RATE_48000,
81*bb4ee6a4SAndroid Build Coastguard Worker 64000u32 => VIRTIO_SND_PCM_RATE_64000,
82*bb4ee6a4SAndroid Build Coastguard Worker 88200u32 => VIRTIO_SND_PCM_RATE_88200,
83*bb4ee6a4SAndroid Build Coastguard Worker 96000u32 => VIRTIO_SND_PCM_RATE_96000,
84*bb4ee6a4SAndroid Build Coastguard Worker 176400u32 => VIRTIO_SND_PCM_RATE_176400,
85*bb4ee6a4SAndroid Build Coastguard Worker 192000u32 => VIRTIO_SND_PCM_RATE_192000,
86*bb4ee6a4SAndroid Build Coastguard Worker 384000u32 => VIRTIO_SND_PCM_RATE_384000,
87*bb4ee6a4SAndroid Build Coastguard Worker _ => {
88*bb4ee6a4SAndroid Build Coastguard Worker return Err(Error::UnsupportedFrameRate(frame_rate));
89*bb4ee6a4SAndroid Build Coastguard Worker }
90*bb4ee6a4SAndroid Build Coastguard Worker })
91*bb4ee6a4SAndroid Build Coastguard Worker }
92*bb4ee6a4SAndroid Build Coastguard Worker
93*bb4ee6a4SAndroid Build Coastguard Worker /// Get the name of VIRTIO_SND_R_PCM_* enums
get_virtio_snd_r_pcm_cmd_name(cmd_code: u32) -> &'static str94*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_virtio_snd_r_pcm_cmd_name(cmd_code: u32) -> &'static str {
95*bb4ee6a4SAndroid Build Coastguard Worker match cmd_code {
96*bb4ee6a4SAndroid Build Coastguard Worker 0 => "Uninitialized",
97*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_R_PCM_SET_PARAMS => "VIRTIO_SND_R_PCM_SET_PARAMS",
98*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_R_PCM_PREPARE => "VIRTIO_SND_R_PCM_PREPARE",
99*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_R_PCM_START => "VIRTIO_SND_R_PCM_START",
100*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_R_PCM_STOP => "VIRTIO_SND_R_PCM_STOP",
101*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_R_PCM_RELEASE => "VIRTIO_SND_R_PCM_RELEASE",
102*bb4ee6a4SAndroid Build Coastguard Worker _ => unreachable!(),
103*bb4ee6a4SAndroid Build Coastguard Worker }
104*bb4ee6a4SAndroid Build Coastguard Worker }
105*bb4ee6a4SAndroid Build Coastguard Worker
get_virtio_direction_name(dir: u8) -> &'static str106*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_virtio_direction_name(dir: u8) -> &'static str {
107*bb4ee6a4SAndroid Build Coastguard Worker match dir {
108*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_D_OUTPUT => "VIRTIO_SND_D_OUTPUT",
109*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_SND_D_INPUT => "VIRTIO_SND_D_INPUT",
110*bb4ee6a4SAndroid Build Coastguard Worker _ => unreachable!(),
111*bb4ee6a4SAndroid Build Coastguard Worker }
112*bb4ee6a4SAndroid Build Coastguard Worker }
113