diff options
Diffstat (limited to 'cras/src/server/cras_device_monitor.c')
-rw-r--r-- | cras/src/server/cras_device_monitor.c | 20 |
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); |