summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu-Hsuan Hsu <yuhsuan@chromium.org>2018-09-20 02:21:24 +0800
committerchrome-bot <chrome-bot@chromium.org>2018-09-20 11:39:42 -0700
commit06825486a13073f9f0f6c6235c975a2b599b265e (patch)
tree31066df3531213859187f68d5ee9c42609beedfc
parent67e2a31dbe703e98b5220771462ae4763dbbc3c9 (diff)
downloadadhd-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.c42
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);
}