summaryrefslogtreecommitdiff
path: root/cras/src/tests/stream_list_unittest.cc
diff options
context:
space:
mode:
authorPin-chih Lin <johnylin@google.com>2020-07-29 15:46:47 +0800
committerCommit Bot <commit-bot@chromium.org>2020-08-10 08:31:24 +0000
commit592625514061ca68630566b86dacbe47cd027a93 (patch)
treea5e49fc349925fe2b5ce5876218de23d24b1f971 /cras/src/tests/stream_list_unittest.cc
parent3418709c9ee544524a130228a6c4bba41089dcc4 (diff)
downloadadhd-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.cc63
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,