summaryrefslogtreecommitdiff
path: root/cras/src/server/cras_device_monitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src/server/cras_device_monitor.c')
-rw-r--r--cras/src/server/cras_device_monitor.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/cras/src/server/cras_device_monitor.c b/cras/src/server/cras_device_monitor.c
index 7dd0f5d7..e9730a0b 100644
--- a/cras/src/server/cras_device_monitor.c
+++ b/cras/src/server/cras_device_monitor.c
@@ -13,6 +13,7 @@
enum CRAS_DEVICE_MONITOR_MSG_TYPE {
RESET_DEVICE,
SET_MUTE_STATE,
+ ERROR_CLOSE,
};
struct cras_device_monitor_message {
@@ -62,6 +63,21 @@ int cras_device_monitor_set_device_mute_state(unsigned int dev_idx)
return 0;
}
+int cras_device_monitor_error_close(unsigned int dev_idx)
+{
+ struct cras_device_monitor_message msg;
+ int err;
+
+ init_device_msg(&msg, ERROR_CLOSE, dev_idx);
+ err = cras_main_message_send((struct cras_main_message *)&msg);
+ if (err < 0) {
+ syslog(LOG_ERR, "Failed to send device message %d",
+ ERROR_CLOSE);
+ return err;
+ }
+ return 0;
+}
+
/* When device is in a bad state, e.g. severe underrun,
* it might break how audio thread works and cause busy wake up loop.
* Resetting the device can bring device back to normal state.
@@ -84,6 +100,10 @@ static void handle_device_message(struct cras_main_message *msg, void *arg)
case SET_MUTE_STATE:
cras_iodev_list_set_dev_mute(device_msg->dev_idx);
break;
+ case ERROR_CLOSE:
+ syslog(LOG_ERR, "Close erroneous device in main thread");
+ cras_iodev_list_suspend_dev(device_msg->dev_idx);
+ break;
default:
syslog(LOG_ERR, "Unknown device message type %u",
device_msg->message_type);