diff options
author | Pin-chih Lin <johnylin@google.com> | 2020-07-29 15:46:47 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-08-10 08:31:24 +0000 |
commit | 592625514061ca68630566b86dacbe47cd027a93 (patch) | |
tree | a5e49fc349925fe2b5ce5876218de23d24b1f971 /cras/src/tests/stream_list_unittest.cc | |
parent | 3418709c9ee544524a130228a6c4bba41089dcc4 (diff) | |
download | adhd-592625514061ca68630566b86dacbe47cd027a93.tar.gz |
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 <johnylin@chromium.org>
Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
Commit-Queue: Pin-chih Lin <johnylin@chromium.org>
Auto-Submit: Pin-chih Lin <johnylin@chromium.org>
Diffstat (limited to 'cras/src/tests/stream_list_unittest.cc')
-rw-r--r-- | cras/src/tests/stream_list_unittest.cc | 63 |
1 files changed, 60 insertions, 3 deletions
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, |