From 592625514061ca68630566b86dacbe47cd027a93 Mon Sep 17 00:00:00 2001 From: Pin-chih Lin Date: Wed, 29 Jul 2020 15:46:47 +0800 Subject: CRAS: Re-open iodev for higher channel count per request Re-open the device with the format of the attached stream if it has higher channel count than the current format of the device. Fallback device will be transciently enabled during the device re-opening. For stream_list_add(), keep streams in the stream list descending ordered by channel count. It guarantees that while iterating the stream list, the first attachable stream will have the highest channel count. BUG=b:162211010 TEST=On Stadia gameplay, it will first provide two 2-channel streams then a 6-channel stream. Check num_channels in device stat is 6 (for a 5.1 sound system) and all 6 channels have sounds. TEST=FEATURES="test" emerge adhd Change-Id: Ic822f35adcabaf8b72231b84551bc78f3bc75288 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/2319443 Tested-by: Pin-chih Lin Reviewed-by: Cheng-Yi Chiang Commit-Queue: Pin-chih Lin Auto-Submit: Pin-chih Lin --- cras/src/tests/stream_list_unittest.cc | 63 ++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) (limited to 'cras/src/tests/stream_list_unittest.cc') diff --git a/cras/src/tests/stream_list_unittest.cc b/cras/src/tests/stream_list_unittest.cc index 8f3c2e3e..40be35d0 100644 --- a/cras/src/tests/stream_list_unittest.cc +++ b/cras/src/tests/stream_list_unittest.cc @@ -28,13 +28,16 @@ static int removed_cb(struct cras_rstream* rstream) { static unsigned int create_called; static struct cras_rstream_config* create_config; -static struct cras_rstream dummy_rstream; static int create_rstream_cb(struct cras_rstream_config* stream_config, struct cras_rstream** stream) { create_called++; create_config = stream_config; - *stream = &dummy_rstream; - dummy_rstream.stream_id = 0x3003; + *stream = (struct cras_rstream*)malloc(sizeof(struct cras_rstream)); + (*stream)->stream_id = stream_config->stream_id; + (*stream)->direction = stream_config->direction; + if (stream_config->format) + (*stream)->format = *(stream_config->format); + return 0; } @@ -43,6 +46,7 @@ static struct cras_rstream* destroyed_stream; static void destroy_rstream_cb(struct cras_rstream* rstream) { destroy_called++; destroyed_stream = rstream; + free(rstream); } static void reset_test_data() { @@ -57,6 +61,10 @@ TEST(StreamList, AddRemove) { struct cras_rstream* s1; struct cras_rstream_config s1_config; + s1_config.stream_id = 0x3003; + s1_config.direction = CRAS_STREAM_OUTPUT; + s1_config.format = NULL; + reset_test_data(); l = stream_list_create(added_cb, removed_cb, create_rstream_cb, destroy_rstream_cb, NULL); @@ -72,6 +80,55 @@ TEST(StreamList, AddRemove) { stream_list_destroy(l); } +TEST(StreamList, AddInDescendingOrderByChannels) { + struct stream_list* l; + struct cras_rstream* s1; + struct cras_rstream* s2; + struct cras_rstream* s3; + struct cras_audio_format s1_format, s2_format, s3_format; + struct cras_rstream_config s1_config, s2_config, s3_config; + + s1_config.stream_id = 0x4001; + s1_config.direction = CRAS_STREAM_INPUT; + s1_format.num_channels = 6; + s1_config.format = &s1_format; + + s2_config.stream_id = 0x4002; + s2_config.direction = CRAS_STREAM_OUTPUT; + s2_format.num_channels = 8; + s2_config.format = &s2_format; + + s3_config.stream_id = 0x4003; + s3_config.direction = CRAS_STREAM_OUTPUT; + s3_format.num_channels = 2; + s3_config.format = &s3_format; + + reset_test_data(); + l = stream_list_create(added_cb, removed_cb, create_rstream_cb, + destroy_rstream_cb, NULL); + stream_list_add(l, &s1_config, &s1); + EXPECT_EQ(1, add_called); + EXPECT_EQ(1, create_called); + EXPECT_EQ(6, stream_list_get(l)->format.num_channels); + + stream_list_add(l, &s2_config, &s2); + EXPECT_EQ(2, add_called); + EXPECT_EQ(2, create_called); + EXPECT_EQ(8, stream_list_get(l)->format.num_channels); + EXPECT_EQ(6, stream_list_get(l)->next->format.num_channels); + + stream_list_add(l, &s3_config, &s3); + EXPECT_EQ(3, add_called); + EXPECT_EQ(3, create_called); + EXPECT_EQ(8, stream_list_get(l)->format.num_channels); + EXPECT_EQ(6, stream_list_get(l)->next->format.num_channels); + EXPECT_EQ(2, stream_list_get(l)->next->next->format.num_channels); + EXPECT_EQ(0, stream_list_rm(l, 0x4001)); + EXPECT_EQ(0, stream_list_rm(l, 0x4002)); + EXPECT_EQ(0, stream_list_rm(l, 0x4003)); + stream_list_destroy(l); +} + extern "C" { struct cras_timer* cras_tm_create_timer(struct cras_tm* tm, -- cgit v1.2.3