diff options
author | Yu-Hsuan Hsu <yuhsuan@chromium.org> | 2018-09-20 02:21:24 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-09-20 11:39:42 -0700 |
commit | 06825486a13073f9f0f6c6235c975a2b599b265e (patch) | |
tree | 31066df3531213859187f68d5ee9c42609beedfc | |
parent | 67e2a31dbe703e98b5220771462ae4763dbbc3c9 (diff) | |
download | adhd-06825486a13073f9f0f6c6235c975a2b599b265e.tar.gz |
CRAS: dev_io - Reset audio device when severe underrun/overrun happens
Currently we reset device only for output. We should do that for input
as well. So that user can still use capture stream after overrun
happenning.
BUG=b:116066435
TEST=Keep recording after reseting the audio device on eve
Change-Id: I47c95315596bd278e67edc2380f4df27477f5288
Reviewed-on: https://chromium-review.googlesource.com/1234513
Commit-Ready: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Tested-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
-rw-r--r-- | cras/src/server/dev_io.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/cras/src/server/dev_io.c b/cras/src/server/dev_io.c index f90a827f..472893a7 100644 --- a/cras/src/server/dev_io.c +++ b/cras/src/server/dev_io.c @@ -738,16 +738,34 @@ int dev_io_send_captured_samples(struct open_dev *idev_list) return 0; } +static void handle_dev_err( + int err_rc, + struct open_dev **odevs, + struct open_dev *adev) +{ + if (err_rc == -EPIPE) { + /* Handle severe underrun. */ + ATLOG(atlog, AUDIO_THREAD_SEVERE_UNDERRUN, + adev->dev->info.idx, 0, 0); + cras_iodev_reset_request(adev->dev); + } else { + /* Device error, close it. */ + dev_io_rm_open_dev(odevs, adev); + } +} + int dev_io_capture(struct open_dev **list) { struct open_dev *idev_list = *list; struct open_dev *adev; + int rc; DL_FOREACH(idev_list, adev) { if (!cras_iodev_is_open(adev->dev)) continue; - if (capture_to_streams(adev) < 0) - dev_io_rm_open_dev(list, adev); + rc = capture_to_streams(adev); + if (rc < 0) + handle_dev_err(rc, list, adev); } return 0; @@ -764,22 +782,6 @@ void dev_io_playback_fetch(struct open_dev *odev_list) } } -static void handle_output_dev_err( - int err_rc, - struct open_dev **odevs, - struct open_dev *adev) -{ - if (err_rc == -EPIPE) { - /* Handle severe underrun. */ - ATLOG(atlog, AUDIO_THREAD_SEVERE_UNDERRUN, - adev->dev->info.idx, 0, 0); - cras_iodev_reset_request(adev->dev); - } else { - /* Device error, close it. */ - dev_io_rm_open_dev(odevs, adev); - } -} - int dev_io_playback_write(struct open_dev **odevs, struct cras_fmt_conv *output_converter) { @@ -804,7 +806,7 @@ int dev_io_playback_write(struct open_dev **odevs, rc = write_output_samples(odevs, adev, output_converter); if (rc < 0) { - handle_output_dev_err(rc, odevs, adev); + handle_dev_err(rc, odevs, adev); } else { total_written = rc; @@ -837,7 +839,7 @@ int dev_io_playback_write(struct open_dev **odevs, hw_level, total_written); rc = cras_iodev_output_underrun(adev->dev); if(rc < 0) { - handle_output_dev_err(rc, odevs, adev); + handle_dev_err(rc, odevs, adev); } else { update_dev_wakeup_time(adev, &hw_level); } |