summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu-Hsuan Hsu <yuhsuan@chromium.org>2018-10-05 13:22:04 +0800
committerchrome-bot <chrome-bot@chromium.org>2018-10-05 07:54:45 -0700
commitc9489d752a3db511c3bdc38a40a2d727b534354b (patch)
treecd118eaa2d0f72622bc64ac68dc92f348b539110
parenta5db32041a33394e8ccb399c4374a66f5d4007b7 (diff)
downloadadhd-c9489d752a3db511c3bdc38a40a2d727b534354b.tar.gz
CRAS: cras_iodev - Record the highest hardware level of device
We records the highest hardware level in device buffer when it is in NORMAL_RUN state. It can be showed by command "cras_test_client --dump_a". It is useful to check whether hardware level is increasing. For input device, update the highest hardware level before reading from the device to ensure it is the largest one. For output device, update after writing into device because of the same reason. BUG=b:116066435 TEST=Can show highest hw_level correctly on peppy. Change-Id: Ic4de2a1c5c042ce694d14dba0e6fae157a8a61f9 Reviewed-on: https://chromium-review.googlesource.com/1263698 Commit-Ready: Yu-Hsuan Hsu <yuhsuan@chromium.org> Tested-by: Yu-Hsuan Hsu <yuhsuan@chromium.org> Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
-rw-r--r--cras/src/common/cras_types.h1
-rw-r--r--cras/src/server/audio_thread.c1
-rw-r--r--cras/src/server/cras_iodev.c8
-rw-r--r--cras/src/server/cras_iodev.h9
-rw-r--r--cras/src/server/dev_io.c5
-rw-r--r--cras/src/tests/audio_thread_unittest.cc5
-rw-r--r--cras/src/tests/cras_test_client.c6
-rw-r--r--cras/src/tests/iodev_stub.cc6
8 files changed, 39 insertions, 2 deletions
diff --git a/cras/src/common/cras_types.h b/cras/src/common/cras_types.h
index b9e4b742..d0463fa2 100644
--- a/cras/src/common/cras_types.h
+++ b/cras/src/common/cras_types.h
@@ -253,6 +253,7 @@ struct __attribute__ ((__packed__)) audio_dev_debug_info {
uint8_t direction;
uint32_t num_underruns;
uint32_t num_severe_underruns;
+ uint32_t highest_hw_level;
};
struct __attribute__ ((__packed__)) audio_stream_debug_info {
diff --git a/cras/src/server/audio_thread.c b/cras/src/server/audio_thread.c
index fbbd1577..8d53f1e3 100644
--- a/cras/src/server/audio_thread.c
+++ b/cras/src/server/audio_thread.c
@@ -550,6 +550,7 @@ static void append_dev_dump_info(struct audio_dev_debug_info *di,
di->num_underruns = cras_iodev_get_num_underruns(adev->dev);
di->num_severe_underruns = cras_iodev_get_num_severe_underruns(
adev->dev);
+ di->highest_hw_level = adev->dev->highest_hw_level;
if (fmt) {
di->frame_rate = fmt->frame_rate;
di->num_channels = fmt->num_channels;
diff --git a/cras/src/server/cras_iodev.c b/cras/src/server/cras_iodev.c
index fe99b665..3130b30f 100644
--- a/cras/src/server/cras_iodev.c
+++ b/cras/src/server/cras_iodev.c
@@ -922,6 +922,7 @@ int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
iodev->reset_request_pending = 0;
iodev->state = CRAS_IODEV_STATE_OPEN;
+ iodev->highest_hw_level = 0;
if (iodev->direction == CRAS_STREAM_OUTPUT) {
/* If device supports start ops, device can be in open state.
@@ -1473,3 +1474,10 @@ int cras_iodev_has_pinned_stream(const struct cras_iodev *dev)
}
return 0;
}
+
+void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev,
+ unsigned int hw_level)
+{
+ iodev->highest_hw_level = MAX(iodev->highest_hw_level, hw_level);
+}
+
diff --git a/cras/src/server/cras_iodev.h b/cras/src/server/cras_iodev.h
index 69546c30..d40af91b 100644
--- a/cras/src/server/cras_iodev.h
+++ b/cras/src/server/cras_iodev.h
@@ -259,6 +259,7 @@ struct cras_iodev {
int input_streaming;
unsigned int input_frames_read;
unsigned int input_dsp_offset;
+ unsigned int highest_hw_level;
struct input_data *input_data;
struct cras_iodev *prev, *next;
};
@@ -751,4 +752,12 @@ int cras_iodev_is_zero_volume(const struct cras_iodev *odev);
*/
int cras_iodev_has_pinned_stream(const struct cras_iodev *dev);
+/*
+ * Updates the highest hardware level of the device.
+ * Args:
+ * iodev - The device.
+ */
+void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev,
+ unsigned int hw_level);
+
#endif /* CRAS_IODEV_H_ */
diff --git a/cras/src/server/dev_io.c b/cras/src/server/dev_io.c
index e58a3634..9d63c472 100644
--- a/cras/src/server/dev_io.c
+++ b/cras/src/server/dev_io.c
@@ -391,6 +391,8 @@ static int capture_to_streams(struct open_dev *adev)
return rc;
hw_level = rc;
+ cras_iodev_update_highest_hw_level(idev, hw_level);
+
ATLOG(atlog, AUDIO_THREAD_READ_AUDIO_TSTAMP, idev->info.idx,
hw_tstamp.tv_sec, hw_tstamp.tv_nsec);
if (timespec_is_nonzero(&hw_tstamp)) {
@@ -575,6 +577,9 @@ void update_dev_wakeup_time(struct open_dev *adev, unsigned int *hw_level)
if (!timespec_is_nonzero(&adev->wake_ts))
adev->wake_ts = now;
+ if (cras_iodev_state(adev->dev) == CRAS_IODEV_STATE_NORMAL_RUN)
+ cras_iodev_update_highest_hw_level(adev->dev, *hw_level);
+
est_rate = adev->dev->ext_format->frame_rate *
cras_iodev_get_est_rate_ratio(adev->dev);
diff --git a/cras/src/tests/audio_thread_unittest.cc b/cras/src/tests/audio_thread_unittest.cc
index 02fbf662..799ce4ca 100644
--- a/cras/src/tests/audio_thread_unittest.cc
+++ b/cras/src/tests/audio_thread_unittest.cc
@@ -1146,6 +1146,11 @@ unsigned int cras_iodev_get_num_severe_underruns(const struct cras_iodev *iodev)
return 0;
}
+void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev,
+ unsigned int hw_level)
+{
+}
+
int cras_iodev_start_ramp(struct cras_iodev *odev,
enum CRAS_IODEV_RAMP_REQUEST request)
{
diff --git a/cras/src/tests/cras_test_client.c b/cras/src/tests/cras_test_client.c
index 770b4cfb..187617b8 100644
--- a/cras/src/tests/cras_test_client.c
+++ b/cras/src/tests/cras_test_client.c
@@ -562,7 +562,8 @@ static void print_audio_debug_info(const struct audio_debug_info *info)
"num_channels: %u\n"
"est_rate_ratio: %lf\n"
"num_underruns: %u\n"
- "num_severe_underruns: %u\n",
+ "num_severe_underruns: %u\n"
+ "highest_hw_level: %u\n",
(unsigned int)info->devs[i].buffer_size,
(unsigned int)info->devs[i].min_buffer_level,
(unsigned int)info->devs[i].min_cb_level,
@@ -571,7 +572,8 @@ static void print_audio_debug_info(const struct audio_debug_info *info)
(unsigned int)info->devs[i].num_channels,
info->devs[i].est_rate_ratio,
(unsigned int)info->devs[i].num_underruns,
- (unsigned int)info->devs[i].num_severe_underruns);
+ (unsigned int)info->devs[i].num_severe_underruns,
+ (unsigned int)info->devs[i].highest_hw_level);
printf("\n");
}
diff --git a/cras/src/tests/iodev_stub.cc b/cras/src/tests/iodev_stub.cc
index 8bdcbf7c..519c3f0a 100644
--- a/cras/src/tests/iodev_stub.cc
+++ b/cras/src/tests/iodev_stub.cc
@@ -139,4 +139,10 @@ unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev *odev,
*hw_level = 0;
return 0;
}
+
+void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev,
+ unsigned int hw_level)
+{
+}
+
} // extern "C"