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.c33
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",