diff options
Diffstat (limited to 'cras/src/server/cras_device_monitor.c')
-rw-r--r-- | cras/src/server/cras_device_monitor.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/cras/src/server/cras_device_monitor.c b/cras/src/server/cras_device_monitor.c index 7dd0f5d7..7dd8f27c 100644 --- a/cras/src/server/cras_device_monitor.c +++ b/cras/src/server/cras_device_monitor.c @@ -18,26 +18,27 @@ enum CRAS_DEVICE_MONITOR_MSG_TYPE { struct cras_device_monitor_message { struct cras_main_message header; enum CRAS_DEVICE_MONITOR_MSG_TYPE message_type; - unsigned int dev_idx; + struct cras_iodev *iodev; }; -static void init_device_msg(struct cras_device_monitor_message *msg, - enum CRAS_DEVICE_MONITOR_MSG_TYPE type, - unsigned int dev_idx) +static void init_device_msg( + struct cras_device_monitor_message *msg, + enum CRAS_DEVICE_MONITOR_MSG_TYPE type, + struct cras_iodev *iodev) { memset(msg, 0, sizeof(*msg)); msg->header.type = CRAS_MAIN_MONITOR_DEVICE; msg->header.length = sizeof(*msg); msg->message_type = type; - msg->dev_idx = dev_idx; + msg->iodev = iodev; } -int cras_device_monitor_reset_device(unsigned int dev_idx) +int cras_device_monitor_reset_device(struct cras_iodev *iodev) { struct cras_device_monitor_message msg; int err; - init_device_msg(&msg, RESET_DEVICE, dev_idx); + init_device_msg(&msg, RESET_DEVICE, iodev); err = cras_main_message_send((struct cras_main_message *)&msg); if (err < 0) { syslog(LOG_ERR, "Failed to send device message %d", @@ -47,12 +48,12 @@ int cras_device_monitor_reset_device(unsigned int dev_idx) return 0; } -int cras_device_monitor_set_device_mute_state(unsigned int dev_idx) +int cras_device_monitor_set_device_mute_state(struct cras_iodev *iodev) { struct cras_device_monitor_message msg; int err; - init_device_msg(&msg, SET_MUTE_STATE, dev_idx); + init_device_msg(&msg, SET_MUTE_STATE, iodev); err = cras_main_message_send((struct cras_main_message *)&msg); if (err < 0) { syslog(LOG_ERR, "Failed to send device message %d", @@ -62,27 +63,29 @@ int cras_device_monitor_set_device_mute_state(unsigned int dev_idx) 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. * Let main thread follow the disable/enable sequence in iodev_list - * to properly close/open the device while enabling/disabling fallback + * to properly close/open the device while enabling/disabling fallback * device. */ static void handle_device_message(struct cras_main_message *msg, void *arg) { struct cras_device_monitor_message *device_msg = - (struct cras_device_monitor_message *)msg; + (struct cras_device_monitor_message *)msg; + struct cras_iodev *iodev = device_msg->iodev; switch (device_msg->message_type) { case RESET_DEVICE: syslog(LOG_ERR, "trying to recover device 0x%x by resetting it", - device_msg->dev_idx); - cras_iodev_list_suspend_dev(device_msg->dev_idx); - cras_iodev_list_resume_dev(device_msg->dev_idx); + iodev->info.idx); + cras_iodev_list_disable_dev(iodev, true); + cras_iodev_list_enable_dev(iodev); break; case SET_MUTE_STATE: - cras_iodev_list_set_dev_mute(device_msg->dev_idx); + cras_iodev_set_mute(iodev); break; default: syslog(LOG_ERR, "Unknown device message type %u", |