cras_types: Add CRAS_CLIENT_TYPE_ARCVM for arc in VM

Add a new client type for arc in VM for UMA and to separate it
from other linux VMs.

Changes:
- Add CRAS_CLIENT_TYPE_ARCVM for arc in VM
- Generate cras_sys from the latest codebase
- Add FromStr for CRAS_CLIENT_TYPE
- Expose cras_sys::Error in libcras as CrasSysError
- Add PluginVM and ARCVM to metrics_client_type_str for UMA

BUG=b:177393225
TEST=Apply full patch set and start audio in ARCVM with
     `cras_test_client --dump_a`

Change-Id: I76960479431d34d9c1b311856eef8f64500bf654
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/2744525
Reviewed-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Tested-by: Chih-Yang Hsia <paulhsia@chromium.org>
Commit-Queue: Chih-Yang Hsia <paulhsia@chromium.org>
diff --git a/cras/client/cras-sys/src/gen.rs b/cras/client/cras-sys/src/gen.rs
index 0375a0b..6fb4cdf 100644
--- a/cras/client/cras-sys/src/gen.rs
+++ b/cras/client/cras-sys/src/gen.rs
@@ -748,7 +748,9 @@
     CRAS_CAPTURE = 2,
     CRAS_VMS_LEGACY = 3,
     CRAS_VMS_UNIFIED = 4,
-    CRAS_NUM_CONN_TYPE = 5,
+    CRAS_PLUGIN_PLAYBACK = 5,
+    CRAS_PLUGIN_UNIFIED = 6,
+    CRAS_NUM_CONN_TYPE = 7,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
@@ -798,6 +800,9 @@
     CRAS_CLIENT_TYPE_CROSVM = 6,
     CRAS_CLIENT_TYPE_SERVER_STREAM = 7,
     CRAS_CLIENT_TYPE_LACROS = 8,
+    CRAS_CLIENT_TYPE_PLUGIN = 9,
+    CRAS_CLIENT_TYPE_ARCVM = 10,
+    CRAS_NUM_CLIENT_TYPE = 11,
 }
 impl CRAS_STREAM_EFFECT {
     pub const APM_ECHO_CANCELLATION: CRAS_STREAM_EFFECT = CRAS_STREAM_EFFECT(1);
@@ -914,24 +919,25 @@
     BT_A2DP_START = 6,
     BT_A2DP_SUSPENDED = 7,
     BT_CODEC_SELECTION = 8,
-    BT_DEV_CONNECTED_CHANGE = 9,
-    BT_DEV_CONN_WATCH_CB = 10,
-    BT_DEV_SUSPEND_CB = 11,
-    BT_HFP_NEW_CONNECTION = 12,
-    BT_HFP_REQUEST_DISCONNECT = 13,
-    BT_HFP_SUPPORTED_FEATURES = 14,
-    BT_HFP_HF_INDICATOR = 15,
-    BT_HFP_SET_SPEAKER_GAIN = 16,
-    BT_HFP_UPDATE_SPEAKER_GAIN = 17,
-    BT_HSP_NEW_CONNECTION = 18,
-    BT_HSP_REQUEST_DISCONNECT = 19,
-    BT_NEW_AUDIO_PROFILE_AFTER_CONNECT = 20,
-    BT_RESET = 21,
-    BT_SCO_CONNECT = 22,
-    BT_TRANSPORT_ACQUIRE = 23,
-    BT_TRANSPORT_RELEASE = 24,
-    BT_TRANSPORT_SET_VOLUME = 25,
-    BT_TRANSPORT_UPDATE_VOLUME = 26,
+    BT_DEV_CONNECTED = 9,
+    BT_DEV_DISCONNECTED = 10,
+    BT_DEV_CONN_WATCH_CB = 11,
+    BT_DEV_SUSPEND_CB = 12,
+    BT_HFP_NEW_CONNECTION = 13,
+    BT_HFP_REQUEST_DISCONNECT = 14,
+    BT_HFP_SUPPORTED_FEATURES = 15,
+    BT_HFP_HF_INDICATOR = 16,
+    BT_HFP_SET_SPEAKER_GAIN = 17,
+    BT_HFP_UPDATE_SPEAKER_GAIN = 18,
+    BT_HSP_NEW_CONNECTION = 19,
+    BT_HSP_REQUEST_DISCONNECT = 20,
+    BT_NEW_AUDIO_PROFILE_AFTER_CONNECT = 21,
+    BT_RESET = 22,
+    BT_SCO_CONNECT = 23,
+    BT_TRANSPORT_ACQUIRE = 24,
+    BT_TRANSPORT_RELEASE = 25,
+    BT_TRANSPORT_SET_VOLUME = 26,
+    BT_TRANSPORT_UPDATE_VOLUME = 27,
 }
 #[repr(C, packed)]
 #[derive(Debug, Copy, Clone)]
@@ -2117,12 +2123,15 @@
     pub bt_wbs_enabled: i32,
     pub deprioritize_bt_wbs_mic: i32,
     pub main_thread_debug_info: main_thread_debug_info,
+    pub num_input_streams_with_permission: [u32; 11usize],
+    pub noise_cancellation_enabled: i32,
+    pub hotword_pause_at_suspend: i32,
 }
 #[test]
 fn bindgen_test_layout_cras_server_state() {
     assert_eq!(
         ::std::mem::size_of::<cras_server_state>(),
-        1414292usize,
+        1414344usize,
         concat!("Size of: ", stringify!(cras_server_state))
     );
     assert_eq!(
@@ -2520,6 +2529,45 @@
             stringify!(main_thread_debug_info)
         )
     );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<cras_server_state>())).num_input_streams_with_permission
+                as *const _ as usize
+        },
+        1414292usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(cras_server_state),
+            "::",
+            stringify!(num_input_streams_with_permission)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<cras_server_state>())).noise_cancellation_enabled as *const _
+                as usize
+        },
+        1414336usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(cras_server_state),
+            "::",
+            stringify!(noise_cancellation_enabled)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<cras_server_state>())).hotword_pause_at_suspend as *const _
+                as usize
+        },
+        1414340usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(cras_server_state),
+            "::",
+            stringify!(hotword_pause_at_suspend)
+        )
+    );
 }
 pub const cras_notify_device_action_CRAS_DEVICE_ACTION_ADD: cras_notify_device_action = 0;
 pub const cras_notify_device_action_CRAS_DEVICE_ACTION_REMOVE: cras_notify_device_action = 1;
diff --git a/cras/client/cras-sys/src/lib.rs b/cras/client/cras-sys/src/lib.rs
index 8128575..2b3d21e 100644
--- a/cras/client/cras-sys/src/lib.rs
+++ b/cras/client/cras-sys/src/lib.rs
@@ -10,6 +10,7 @@
 use std::fmt;
 use std::iter::FromIterator;
 use std::os::raw::c_char;
+use std::str::FromStr;
 use std::time::Duration;
 
 #[allow(dead_code)]
@@ -47,6 +48,7 @@
 pub enum Error {
     InvalidChannel(i8),
     InvalidClientType(u32),
+    InvalidClientTypeStr,
     InvalidStreamType(u32),
 }
 
@@ -68,6 +70,7 @@
                 t,
                 CRAS_CLIENT_TYPE::CRAS_CLIENT_TYPE_SERVER_STREAM as u32 + 1
             ),
+            InvalidClientTypeStr => write!(f, "Invalid client type string"),
             InvalidStreamType(t) => write!(
                 f,
                 "Stream type {} is not within valid range [0, {})",
@@ -426,6 +429,18 @@
     }
 }
 
+impl FromStr for CRAS_CLIENT_TYPE {
+    type Err = Error;
+    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
+        use CRAS_CLIENT_TYPE::*;
+        match s {
+            "crosvm" => Ok(CRAS_CLIENT_TYPE_CROSVM),
+            "arcvm" => Ok(CRAS_CLIENT_TYPE_ARCVM),
+            _ => Err(Error::InvalidClientTypeStr),
+        }
+    }
+}
+
 impl Default for audio_stream_debug_info {
     fn default() -> Self {
         Self {
diff --git a/cras/client/libcras/src/libcras.rs b/cras/client/libcras/src/libcras.rs
index 80d2cff..402a4a2 100644
--- a/cras/client/libcras/src/libcras.rs
+++ b/cras/client/libcras/src/libcras.rs
@@ -136,7 +136,7 @@
     CRAS_CLIENT_TYPE as CrasClientType, CRAS_NODE_TYPE as CrasNodeType,
     CRAS_STREAM_EFFECT as CrasStreamEffect,
 };
-pub use cras_sys::{AudioDebugInfo, CrasIodevInfo, CrasIonodeInfo};
+pub use cras_sys::{AudioDebugInfo, CrasIodevInfo, CrasIonodeInfo, Error as CrasSysError};
 use sys_util::{PollContext, PollToken, SharedMemory};
 
 mod audio_socket;
diff --git a/cras/src/common/cras_types.h b/cras/src/common/cras_types.h
index 89e3b81..544ba02 100644
--- a/cras/src/common/cras_types.h
+++ b/cras/src/common/cras_types.h
@@ -169,6 +169,7 @@
 	CRAS_CLIENT_TYPE_SERVER_STREAM, /* Server stream */
 	CRAS_CLIENT_TYPE_LACROS, /* LaCrOS */
 	CRAS_CLIENT_TYPE_PLUGIN, /* PluginVM */
+	CRAS_CLIENT_TYPE_ARCVM, /* ARCVM */
 	CRAS_NUM_CLIENT_TYPE, /* numbers of CRAS_CLIENT_TYPE */
 };
 
@@ -213,6 +214,7 @@
 	ENUM_STR(CRAS_CLIENT_TYPE_SERVER_STREAM)
 	ENUM_STR(CRAS_CLIENT_TYPE_LACROS)
 	ENUM_STR(CRAS_CLIENT_TYPE_PLUGIN)
+	ENUM_STR(CRAS_CLIENT_TYPE_ARCVM)
 	default:
 		return "INVALID_CLIENT_TYPE";
 	}
diff --git a/cras/src/server/cras_server_metrics.c b/cras/src/server/cras_server_metrics.c
index e03dfd9..f4f5409 100644
--- a/cras/src/server/cras_server_metrics.c
+++ b/cras/src/server/cras_server_metrics.c
@@ -306,6 +306,10 @@
 		return "ServerStream";
 	case CRAS_CLIENT_TYPE_LACROS:
 		return "LaCrOS";
+	case CRAS_CLIENT_TYPE_PLUGIN:
+		return "PluginVM";
+	case CRAS_CLIENT_TYPE_ARCVM:
+		return "ARCVM";
 	default:
 		return "InvalidType";
 	}