summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorHiFiPHile <[email protected]>2026-08-25 09:29:07 +0200
committerHiFiPHile <[email protected]>2026-08-25 09:29:07 +0200
commit62243107cec5e48f447661ea7a17969d05f76adb (patch)
tree21117acb436d1009c7d1ea1c0c77a4289adc5b6d /test
parent0fd39954d7800777774c17617e41825e5a3561da (diff)
fix(audio): keep stream state consistent on control failures
Route asynchronous activation and sampling-frequency failures through the stream error callback. Keep a running stream active when SET_INTERFACE alt 0 cannot be submitted so stop can be retried without diverging from device state. Signed-off-by: HiFiPHile <[email protected]>
Diffstat (limited to 'test')
-rw-r--r--test/unit-test/test/host/audio/test_audio_host.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/test/unit-test/test/host/audio/test_audio_host.c b/test/unit-test/test/host/audio/test_audio_host.c
index 63f59c454..51342bfac 100644
--- a/test/unit-test/test/host/audio/test_audio_host.c
+++ b/test/unit-test/test/host/audio/test_audio_host.c
@@ -50,6 +50,18 @@ static uint8_t edpt_xfer_data[16][8];
static uint8_t *edpt_xfer_buffer[16];
static uint8_t edpt_xfer_count;
+static uint8_t err_cb_count;
+static uint8_t err_cb_idx;
+static uint8_t err_cb_stream_idx;
+static uint16_t err_cb_xferred_bytes;
+
+void tuh_audio_err_cb(uint8_t idx, uint8_t stream_idx, uint16_t xferred_bytes) {
+ err_cb_count++;
+ err_cb_idx = idx;
+ err_cb_stream_idx = stream_idx;
+ err_cb_xferred_bytes = xferred_bytes;
+}
+
tusb_speed_t tuh_speed_get(uint8_t daddr) {
(void)daddr;
return TUSB_SPEED_FULL;
@@ -439,6 +451,11 @@ void setUp(void) {
memset(edpt_xfer_buffer, 0, sizeof(edpt_xfer_buffer));
edpt_xfer_count = 0;
+ err_cb_count = 0;
+ err_cb_idx = TUSB_INDEX_INVALID_8;
+ err_cb_stream_idx = TUSB_INDEX_INVALID_8;
+ err_cb_xferred_bytes = 0;
+
fu_cb_count = 0;
fu_cb_user_data = 0;
@@ -558,6 +575,44 @@ void test_audio_host_sets_sampling_frequency_after_each_stream_activation(void)
TEST_ASSERT_EQUAL_UINT8(2, edpt_xfer_count);
}
+void test_audio_host_reports_asynchronous_start_failures(void) {
+ mount_descriptors(capture_fu_before_usb_output, sizeof(capture_fu_before_usb_output));
+ TEST_ASSERT_TRUE(tuh_audio_configure(0, 0, 0));
+
+ TEST_ASSERT_TRUE(tuh_audio_start(0, 0));
+ complete_interface_set(XFER_RESULT_FAILED);
+ TEST_ASSERT_EQUAL_UINT8(1, err_cb_count);
+ TEST_ASSERT_EQUAL_UINT8(0, err_cb_idx);
+ TEST_ASSERT_EQUAL_UINT8(0, err_cb_stream_idx);
+ TEST_ASSERT_EQUAL_UINT16(0, err_cb_xferred_bytes);
+
+ TEST_ASSERT_TRUE(tuh_audio_start(0, 0));
+ complete_interface_set(XFER_RESULT_SUCCESS);
+ complete_control_xfer(XFER_RESULT_STALLED);
+ TEST_ASSERT_EQUAL_UINT8(2, err_cb_count);
+
+ control_xfer_result = false;
+ TEST_ASSERT_TRUE(tuh_audio_start(0, 0));
+ complete_interface_set(XFER_RESULT_SUCCESS);
+ TEST_ASSERT_EQUAL_UINT8(3, err_cb_count);
+}
+
+void test_audio_host_keeps_running_when_stop_cannot_be_submitted(void) {
+ mount_descriptors(capture_fu_before_usb_output, sizeof(capture_fu_before_usb_output));
+ TEST_ASSERT_TRUE(tuh_audio_configure(0, 0, 0));
+ TEST_ASSERT_TRUE(tuh_audio_start(0, 0));
+ complete_interface_set(XFER_RESULT_SUCCESS);
+ complete_control_xfer(XFER_RESULT_SUCCESS);
+ TEST_ASSERT_EQUAL_UINT8(1, edpt_xfer_count);
+
+ interface_set_result = false;
+ TEST_ASSERT_FALSE(tuh_audio_stop(0, 0));
+
+ edpt_busy = false;
+ TEST_ASSERT_TRUE(audioh_xfer_cb(AUDIO_DEV_ADDR, 0x81, XFER_RESULT_SUCCESS, 96));
+ TEST_ASSERT_EQUAL_UINT8(2, edpt_xfer_count);
+}
+
void test_audio_host_parses_discrete_frequencies_with_interval_greater_than_one(void) {
tuh_audio_stream_config_t config;
open_descriptors(playback_with_two_frequencies, sizeof(playback_with_two_frequencies));