diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-10-07 16:53:24 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-10-07 16:53:24 +0000 |
commit | 4f97d6740411fb53a4fb5f6e1af03e1f1b28c1ba (patch) | |
tree | 7e0e07b9d8d50fc5dd352d5b36d74fa3cb3427db /cras/src/tests/dev_io_unittest.cc | |
parent | 8d2c5b2edb9023b91d79709f2900ee1b643a3127 (diff) | |
parent | 8cfb92904b40ff98c82dd5309698999a28c91388 (diff) | |
download | adhd-4f97d6740411fb53a4fb5f6e1af03e1f1b28c1ba.tar.gz |
Snap for 7803083 from 8cfb92904b40ff98c82dd5309698999a28c91388 to mainline-tzdata2-release
Change-Id: Ice40f0028ec451c06ea7097e88c4152da1105d57
Diffstat (limited to 'cras/src/tests/dev_io_unittest.cc')
-rw-r--r-- | cras/src/tests/dev_io_unittest.cc | 209 |
1 files changed, 198 insertions, 11 deletions
diff --git a/cras/src/tests/dev_io_unittest.cc b/cras/src/tests/dev_io_unittest.cc index a18dd48a..2dbf344e 100644 --- a/cras/src/tests/dev_io_unittest.cc +++ b/cras/src/tests/dev_io_unittest.cc @@ -8,6 +8,7 @@ #include <time.h> #include <memory> +#include <unordered_map> extern "C" { #include "cras_iodev.h" // stubbed @@ -27,7 +28,15 @@ struct audio_thread_event_log* atlog; #include "rstream_stub.h" static float dev_stream_capture_software_gain_scaler_val; +static float input_data_get_software_gain_scaler_val; static unsigned int dev_stream_capture_avail_ret = 480; +struct set_dev_rate_data { + unsigned int dev_rate; + double dev_rate_ratio; + double main_rate_ratio; + int coarse_rate_adjust; +}; +std::unordered_map<struct dev_stream*, set_dev_rate_data> set_dev_rate_map; namespace { @@ -38,6 +47,7 @@ class DevIoSuite : public testing::Test { iodev_stub_reset(); rstream_stub_reset(); fill_audio_format(&format, 48000); + set_dev_rate_map.clear(); stream = create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format); } @@ -69,25 +79,90 @@ TEST_F(DevIoSuite, SendCapturedFails) { TEST_F(DevIoSuite, CaptureGain) { struct open_dev* dev_list = NULL; + struct open_dev* odev_list = NULL; struct timespec ts; DevicePtr dev = create_device(CRAS_STREAM_INPUT, cb_threshold, &format, CRAS_NODE_TYPE_MIC); dev->dev->state = CRAS_IODEV_STATE_NORMAL_RUN; - dev->dev->software_gain_scaler = 0.99f; iodev_stub_frames_queued(dev->dev.get(), 20, ts); DL_APPEND(dev_list, dev->odev.get()); add_stream_to_dev(dev->dev, stream); - /* For stream that uses APM, always apply gain scaler 1.0f regardless of - * what node/stream gains are. */ - stream->rstream->apm_list = reinterpret_cast<struct cras_apm_list*>(0xf0f); - dev_io_capture(&dev_list); + /* The applied scaler gain should match what is reported by input_data. */ + dev->dev->active_node->ui_gain_scaler = 1.0f; + input_data_get_software_gain_scaler_val = 1.0f; + dev_io_capture(&dev_list, &odev_list); EXPECT_EQ(1.0f, dev_stream_capture_software_gain_scaler_val); - stream->rstream->apm_list = 0x0; - dev_io_capture(&dev_list); + input_data_get_software_gain_scaler_val = 0.99f; + dev_io_capture(&dev_list, &odev_list); EXPECT_EQ(0.99f, dev_stream_capture_software_gain_scaler_val); + + dev->dev->active_node->ui_gain_scaler = 0.6f; + input_data_get_software_gain_scaler_val = 0.7f; + dev_io_capture(&dev_list, &odev_list); + EXPECT_FLOAT_EQ(0.42f, dev_stream_capture_software_gain_scaler_val); +} + +/* + * When input and output devices are on the internal sound card, + * and their device rates are the same, use the estimated rate + * on the output device as the estimated rate of input device. + */ +TEST_F(DevIoSuite, CopyOutputEstimatedRate) { + struct open_dev* idev_list = NULL; + struct open_dev* odev_list = NULL; + struct timespec ts; + DevicePtr out_dev = create_device(CRAS_STREAM_OUTPUT, cb_threshold, &format, + CRAS_NODE_TYPE_INTERNAL_SPEAKER); + DevicePtr in_dev = create_device(CRAS_STREAM_INPUT, cb_threshold, &format, + CRAS_NODE_TYPE_MIC); + + in_dev->dev->state = CRAS_IODEV_STATE_NORMAL_RUN; + iodev_stub_frames_queued(in_dev->dev.get(), 20, ts); + DL_APPEND(idev_list, in_dev->odev.get()); + add_stream_to_dev(in_dev->dev, stream); + DL_APPEND(odev_list, out_dev->odev.get()); + iodev_stub_on_internal_card(out_dev->dev->active_node, 1); + iodev_stub_on_internal_card(in_dev->dev->active_node, 1); + + iodev_stub_est_rate_ratio(in_dev->dev.get(), 0.8f); + iodev_stub_est_rate_ratio(out_dev->dev.get(), 1.2f); + + dev_io_capture(&idev_list, &odev_list); + + EXPECT_FLOAT_EQ(1.2f, set_dev_rate_map[stream->dstream.get()].dev_rate_ratio); +} + +/* + * When input and output devices are not both on the internal sound card, + * estimated rates are independent. + */ +TEST_F(DevIoSuite, InputOutputIndependentEstimatedRate) { + struct open_dev* idev_list = NULL; + struct open_dev* odev_list = NULL; + struct timespec ts; + DevicePtr out_dev = create_device(CRAS_STREAM_OUTPUT, cb_threshold, &format, + CRAS_NODE_TYPE_INTERNAL_SPEAKER); + DevicePtr in_dev = create_device(CRAS_STREAM_INPUT, cb_threshold, &format, + CRAS_NODE_TYPE_USB); + + in_dev->dev->state = CRAS_IODEV_STATE_NORMAL_RUN; + iodev_stub_frames_queued(in_dev->dev.get(), 20, ts); + DL_APPEND(idev_list, in_dev->odev.get()); + add_stream_to_dev(in_dev->dev, stream); + DL_APPEND(odev_list, out_dev->odev.get()); + iodev_stub_on_internal_card(out_dev->dev->active_node, 1); + iodev_stub_on_internal_card(in_dev->dev->active_node, 0); + + iodev_stub_est_rate_ratio(in_dev->dev.get(), 0.8f); + iodev_stub_est_rate_ratio(out_dev->dev.get(), 1.2f); + iodev_stub_update_rate(in_dev->dev.get(), 1); + + dev_io_capture(&idev_list, &odev_list); + + EXPECT_FLOAT_EQ(0.8f, set_dev_rate_map[stream->dstream.get()].dev_rate_ratio); } /* @@ -132,6 +207,49 @@ TEST_F(DevIoSuite, SendCapturedNeedToResetDevices) { } /* + * If any hw_level is larger than 0.5 * buffer_size and + * DROP_FRAMES_THRESHOLD_MS, reset all input devices. + */ + +TEST_F(DevIoSuite, SendCapturedNeedToResetDevices2) { + struct timespec start; + struct timespec drop_time; + struct open_dev* dev_list = NULL; + bool rc; + + stream = create_stream(1, 1, CRAS_STREAM_INPUT, 2000, &format); + + clock_gettime(CLOCK_MONOTONIC_RAW, &start); + AddFakeDataToStream(stream.get(), 0); + + DevicePtr dev1 = + create_device(CRAS_STREAM_INPUT, 2048, &format, CRAS_NODE_TYPE_MIC); + DevicePtr dev2 = + create_device(CRAS_STREAM_INPUT, 10000, &format, CRAS_NODE_TYPE_MIC); + DL_APPEND(dev_list, dev1->odev.get()); + DL_APPEND(dev_list, dev2->odev.get()); + add_stream_to_dev(dev1->dev, stream); + add_stream_to_dev(dev2->dev, stream); + + iodev_stub_frames_queued(dev1->dev.get(), 2480, start); + iodev_stub_frames_queued(dev2->dev.get(), 2480, start); + EXPECT_EQ(0, dev_io_send_captured_samples(dev_list)); + + /* + * Should drop frames to one min_cb_level, which is 2480 - 2000 = 480 (10ms). + */ + rc = iodev_stub_get_drop_time(dev1->dev.get(), &drop_time); + EXPECT_EQ(true, rc); + EXPECT_EQ(0, drop_time.tv_sec); + EXPECT_EQ(10000000, drop_time.tv_nsec); + + rc = iodev_stub_get_drop_time(dev2->dev.get(), &drop_time); + EXPECT_EQ(true, rc); + EXPECT_EQ(0, drop_time.tv_sec); + EXPECT_EQ(10000000, drop_time.tv_nsec); +} + +/* * If the hw_level is larger than 1.5 * largest_cb_level but less than * DROP_FRAMES_THRESHOLD_MS, do nothing. */ @@ -156,7 +274,10 @@ TEST_F(DevIoSuite, SendCapturedLevelLessThanThreshold) { EXPECT_EQ(false, rc); } -/* If all hw_level is less than 1.5 * largest_cb_level, do nothing. */ +/* + * If all hw_level is less than 1.5 * largest_cb_level and 0.5 * buffer_size, + * do nothing. + */ TEST_F(DevIoSuite, SendCapturedNoNeedToResetDevices) { struct timespec start; struct timespec drop_time; @@ -186,6 +307,50 @@ TEST_F(DevIoSuite, SendCapturedNoNeedToResetDevices) { EXPECT_EQ(false, rc); } +/* + * On loopback and hotword devices, if any hw_level is larger than + * 1.5 * largest_cb_level and DROP_FRAMES_THRESHOLD_MS, do nothing. + */ +TEST_F(DevIoSuite, SendCapturedNoNeedToDrop) { + struct timespec start; + struct timespec drop_time; + struct open_dev* dev_list = NULL; + bool rc; + + clock_gettime(CLOCK_MONOTONIC_RAW, &start); + AddFakeDataToStream(stream.get(), 0); + + DevicePtr dev1 = + create_device(CRAS_STREAM_INPUT, 480, &format, CRAS_NODE_TYPE_HOTWORD); + DevicePtr dev2 = create_device(CRAS_STREAM_INPUT, 480, &format, + CRAS_NODE_TYPE_POST_MIX_PRE_DSP); + DevicePtr dev3 = + create_device(CRAS_STREAM_INPUT, 480, &format, CRAS_NODE_TYPE_POST_DSP); + + DL_APPEND(dev_list, dev1->odev.get()); + DL_APPEND(dev_list, dev2->odev.get()); + DL_APPEND(dev_list, dev3->odev.get()); + + add_stream_to_dev(dev1->dev, stream); + add_stream_to_dev(dev2->dev, stream); + add_stream_to_dev(dev3->dev, stream); + + iodev_stub_frames_queued(dev1->dev.get(), 4800, start); + iodev_stub_frames_queued(dev2->dev.get(), 4800, start); + iodev_stub_frames_queued(dev2->dev.get(), 4800, start); + + EXPECT_EQ(0, dev_io_send_captured_samples(dev_list)); + + rc = iodev_stub_get_drop_time(dev1->dev.get(), &drop_time); + EXPECT_EQ(false, rc); + + rc = iodev_stub_get_drop_time(dev2->dev.get(), &drop_time); + EXPECT_EQ(false, rc); + + rc = iodev_stub_get_drop_time(dev3->dev.get(), &drop_time); + EXPECT_EQ(false, rc); +} + /* Stubs */ extern "C" { @@ -204,10 +369,20 @@ int input_data_put_for_stream(struct input_data* data, return 0; } +float input_data_get_software_gain_scaler(struct input_data* data, + float idev_sw_gain_scaler, + struct cras_rstream* stream) { + return input_data_get_software_gain_scaler_val; +} + int cras_audio_thread_event_drop_samples() { return 0; } +int cras_audio_thread_event_severe_underrun() { + return 0; +} + int dev_stream_attached_devs(const struct dev_stream* dev_stream) { return 0; } @@ -227,8 +402,16 @@ int dev_stream_mix(struct dev_stream* dev_stream, void dev_stream_set_dev_rate(struct dev_stream* dev_stream, unsigned int dev_rate, double dev_rate_ratio, - double master_rate_ratio, - int coarse_rate_adjust) {} + double main_rate_ratio, + int coarse_rate_adjust) { + set_dev_rate_data new_data; + new_data.dev_rate = dev_rate; + new_data.dev_rate_ratio = dev_rate_ratio; + new_data.main_rate_ratio = main_rate_ratio; + new_data.coarse_rate_adjust = coarse_rate_adjust; + + set_dev_rate_map[dev_stream] = new_data; +} int dev_stream_capture_update_rstream(struct dev_stream* dev_stream) { return 0; } @@ -268,7 +451,11 @@ struct dev_stream* dev_stream_create(struct cras_rstream* stream, unsigned int dev_id, const struct cras_audio_format* dev_fmt, void* dev_ptr, - struct timespec* cb_ts) { + struct timespec* cb_ts, + const struct timespec* sleep_interval_ts) { + return 0; +} +int cras_device_monitor_error_close(unsigned int dev_idx) { return 0; } } // extern "C" |