Loading media/libaudiousecasevalidation/UsecaseValidator.cpp +26 −7 Original line number Diff line number Diff line Loading @@ -99,10 +99,8 @@ class UsecaseValidatorImpl : public UsecaseValidator { audio_attributes_t attrRet = attributes; // Check if attribute usage media or unknown has been set. bool isUsageValid = this->isUsageValid(attributes); if (isUsageValid && m_lookup.isGameStream(streamId)) { if (isUsageValid(attributes.usage) && isContentTypeValid(attributes.content_type) && areFlagsValid(attributes.flags) && m_lookup.isGameStream(streamId)) { ALOGI("%s update usage: %d to AUDIO_USAGE_GAME for output: %d pid: %d package: %s", __func__, attributes.usage, streamId, attributionSource.pid, attributionSource.packageName.value_or("").c_str()); Loading @@ -117,9 +115,9 @@ class UsecaseValidatorImpl : public UsecaseValidator { /** * Check if attribute usage valid. */ bool isUsageValid(const audio_attributes_t& attr) { ALOGV("isUsageValid attr.usage: %d", attr.usage); switch (attr.usage) { bool isUsageValid(audio_usage_t usage) { ALOGV("isUsageValid usage: %d", usage); switch (usage) { case AUDIO_USAGE_MEDIA: case AUDIO_USAGE_UNKNOWN: return true; Loading @@ -129,6 +127,27 @@ class UsecaseValidatorImpl : public UsecaseValidator { return false; } bool isContentTypeValid(audio_content_type_t contentType) { ALOGV("isContentTypeValid contentType: %d", contentType); switch (contentType) { case AUDIO_CONTENT_TYPE_MUSIC: case AUDIO_CONTENT_TYPE_MOVIE: case AUDIO_CONTENT_TYPE_UNKNOWN: return true; default: break; } return false; } bool areFlagsValid(audio_flags_mask_t flags) { ALOGV("areFlagsValid flags: %#x", flags); if ((flags & AUDIO_FLAG_LOW_LATENCY) != 0) { return true; } return false; } protected: UsecaseLookup m_lookup; }; Loading media/libaudiousecasevalidation/tests/UsecaseValidator-test.cpp +80 −11 Original line number Diff line number Diff line Loading @@ -52,10 +52,8 @@ audio_port_handle_t UsecaseValidatorTest::testCreatePortId(audio_io_handle_t str */ error::Result<audio_attributes_t> UsecaseValidatorTest::testStartClient(audio_io_handle_t streamId, audio_port_handle_t portId, audio_usage_t usage) { audio_attributes_t attributes) { content::AttributionSourceState attributionSource; audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; attributes.usage = usage; return m_validator->startClient(streamId, portId, attributionSource, attributes, NULL); } Loading Loading @@ -141,11 +139,14 @@ TEST_F(UsecaseValidatorTest, testHangingClient) { mediaPortId = testCreatePortId(mediaStreamId); EXPECT_NE(mediaPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; attributes.usage = AUDIO_USAGE_GAME; // Start client on game stream. testStartClient(gameStreamId, gamePortId, AUDIO_USAGE_GAME); testStartClient(gameStreamId, gamePortId, attributes); attributes.usage = AUDIO_USAGE_MEDIA; // Start client on media stream. testStartClient(mediaStreamId, mediaPortId, AUDIO_USAGE_MEDIA); testStartClient(mediaStreamId, mediaPortId, attributes); // Unregister media stream before stopClient. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); Loading Loading @@ -175,18 +176,23 @@ TEST_F(UsecaseValidatorTest, testAttributesUsageUnchanged) { voiceCommPortId = testCreatePortId(gameStreamId); EXPECT_NE(voiceCommPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; // Verify attributes on game stream. auto attr = testStartClient(gameStreamId, gamePortId, AUDIO_USAGE_GAME); attributes.usage = AUDIO_USAGE_GAME; auto attr = testStartClient(gameStreamId, gamePortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME); attr = testStartClient(gameStreamId, voiceCommPortId, AUDIO_USAGE_VOICE_COMMUNICATION); attributes.usage = AUDIO_USAGE_VOICE_COMMUNICATION; attr = testStartClient(gameStreamId, voiceCommPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_VOICE_COMMUNICATION); // Verify attributes on media stream. attr = testStartClient(mediaStreamId, mediaPortId, AUDIO_USAGE_MEDIA); attributes.usage = AUDIO_USAGE_MEDIA; attr = testStartClient(mediaStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA); attr = testStartClient(mediaStreamId, unknownPortId, AUDIO_USAGE_UNKNOWN); attributes.usage = AUDIO_USAGE_UNKNOWN; attr = testStartClient(mediaStreamId, unknownPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_UNKNOWN); // Stop client on game and media stream. Loading Loading @@ -215,16 +221,79 @@ TEST_F(UsecaseValidatorTest, testAttributesUsageChanged) { unknownPortId = testCreatePortId(gameStreamId); EXPECT_NE(unknownPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; attributes.flags = AUDIO_FLAG_LOW_LATENCY; // Verify attributes on game stream. auto attr = testStartClient(gameStreamId, mediaPortId, AUDIO_USAGE_MEDIA); attributes.usage = AUDIO_USAGE_MEDIA; auto attr = testStartClient(gameStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME); attr = testStartClient(gameStreamId, unknownPortId, AUDIO_USAGE_UNKNOWN); attributes.usage = AUDIO_USAGE_UNKNOWN; attr = testStartClient(gameStreamId, unknownPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME); // Unregister game stream. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); } /** * Verify attributes usage does not change for non low latency clients. */ TEST_F(UsecaseValidatorTest, testAttributesUsageUnChangedIfNotLowLatency) { audio_io_handle_t gameStreamId; audio_port_handle_t mediaPortId, unknownPortId; // Register game and media stream. gameStreamId = testRegisterStream(true); EXPECT_NE(gameStreamId, 0); // Assign portId. mediaPortId = testCreatePortId(gameStreamId); EXPECT_NE(mediaPortId, 0); unknownPortId = testCreatePortId(gameStreamId); EXPECT_NE(unknownPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; // Verify attributes on game stream. attributes.usage = AUDIO_USAGE_MEDIA; auto attr = testStartClient(gameStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA); attributes.usage = AUDIO_USAGE_UNKNOWN; attr = testStartClient(gameStreamId, unknownPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_UNKNOWN); // Unregister game stream. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); } /** * Verify attributes usage does not change for content type speech. */ TEST_F(UsecaseValidatorTest, testAttributesUsageUnChangedIfSpeech) { audio_io_handle_t gameStreamId; audio_port_handle_t mediaPortId, unknownPortId; // Register game and media stream. gameStreamId = testRegisterStream(true); EXPECT_NE(gameStreamId, 0); // Assign portId. mediaPortId = testCreatePortId(gameStreamId); EXPECT_NE(mediaPortId, 0); unknownPortId = testCreatePortId(gameStreamId); EXPECT_NE(unknownPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; // Verify attributes on game stream. attributes.usage = AUDIO_USAGE_MEDIA; attributes.content_type = AUDIO_CONTENT_TYPE_SPEECH; auto attr = testStartClient(gameStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA); // Unregister game stream. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); } } // namespace media } // namespace android media/libaudiousecasevalidation/tests/UsecaseValidator-test.h +1 −1 Original line number Diff line number Diff line Loading @@ -69,7 +69,7 @@ class UsecaseValidatorTest : public ::testing::Test { audio_port_handle_t testCreatePortId(audio_io_handle_t streamId); error::Result<audio_attributes_t> testStartClient(audio_io_handle_t streamId, audio_port_handle_t portId, audio_usage_t usage); audio_attributes_t attributes); error::Result<audio_attributes_t> testVerifyAudioAttributes(audio_io_handle_t streamId, audio_usage_t usage); Loading Loading
media/libaudiousecasevalidation/UsecaseValidator.cpp +26 −7 Original line number Diff line number Diff line Loading @@ -99,10 +99,8 @@ class UsecaseValidatorImpl : public UsecaseValidator { audio_attributes_t attrRet = attributes; // Check if attribute usage media or unknown has been set. bool isUsageValid = this->isUsageValid(attributes); if (isUsageValid && m_lookup.isGameStream(streamId)) { if (isUsageValid(attributes.usage) && isContentTypeValid(attributes.content_type) && areFlagsValid(attributes.flags) && m_lookup.isGameStream(streamId)) { ALOGI("%s update usage: %d to AUDIO_USAGE_GAME for output: %d pid: %d package: %s", __func__, attributes.usage, streamId, attributionSource.pid, attributionSource.packageName.value_or("").c_str()); Loading @@ -117,9 +115,9 @@ class UsecaseValidatorImpl : public UsecaseValidator { /** * Check if attribute usage valid. */ bool isUsageValid(const audio_attributes_t& attr) { ALOGV("isUsageValid attr.usage: %d", attr.usage); switch (attr.usage) { bool isUsageValid(audio_usage_t usage) { ALOGV("isUsageValid usage: %d", usage); switch (usage) { case AUDIO_USAGE_MEDIA: case AUDIO_USAGE_UNKNOWN: return true; Loading @@ -129,6 +127,27 @@ class UsecaseValidatorImpl : public UsecaseValidator { return false; } bool isContentTypeValid(audio_content_type_t contentType) { ALOGV("isContentTypeValid contentType: %d", contentType); switch (contentType) { case AUDIO_CONTENT_TYPE_MUSIC: case AUDIO_CONTENT_TYPE_MOVIE: case AUDIO_CONTENT_TYPE_UNKNOWN: return true; default: break; } return false; } bool areFlagsValid(audio_flags_mask_t flags) { ALOGV("areFlagsValid flags: %#x", flags); if ((flags & AUDIO_FLAG_LOW_LATENCY) != 0) { return true; } return false; } protected: UsecaseLookup m_lookup; }; Loading
media/libaudiousecasevalidation/tests/UsecaseValidator-test.cpp +80 −11 Original line number Diff line number Diff line Loading @@ -52,10 +52,8 @@ audio_port_handle_t UsecaseValidatorTest::testCreatePortId(audio_io_handle_t str */ error::Result<audio_attributes_t> UsecaseValidatorTest::testStartClient(audio_io_handle_t streamId, audio_port_handle_t portId, audio_usage_t usage) { audio_attributes_t attributes) { content::AttributionSourceState attributionSource; audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; attributes.usage = usage; return m_validator->startClient(streamId, portId, attributionSource, attributes, NULL); } Loading Loading @@ -141,11 +139,14 @@ TEST_F(UsecaseValidatorTest, testHangingClient) { mediaPortId = testCreatePortId(mediaStreamId); EXPECT_NE(mediaPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; attributes.usage = AUDIO_USAGE_GAME; // Start client on game stream. testStartClient(gameStreamId, gamePortId, AUDIO_USAGE_GAME); testStartClient(gameStreamId, gamePortId, attributes); attributes.usage = AUDIO_USAGE_MEDIA; // Start client on media stream. testStartClient(mediaStreamId, mediaPortId, AUDIO_USAGE_MEDIA); testStartClient(mediaStreamId, mediaPortId, attributes); // Unregister media stream before stopClient. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); Loading Loading @@ -175,18 +176,23 @@ TEST_F(UsecaseValidatorTest, testAttributesUsageUnchanged) { voiceCommPortId = testCreatePortId(gameStreamId); EXPECT_NE(voiceCommPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; // Verify attributes on game stream. auto attr = testStartClient(gameStreamId, gamePortId, AUDIO_USAGE_GAME); attributes.usage = AUDIO_USAGE_GAME; auto attr = testStartClient(gameStreamId, gamePortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME); attr = testStartClient(gameStreamId, voiceCommPortId, AUDIO_USAGE_VOICE_COMMUNICATION); attributes.usage = AUDIO_USAGE_VOICE_COMMUNICATION; attr = testStartClient(gameStreamId, voiceCommPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_VOICE_COMMUNICATION); // Verify attributes on media stream. attr = testStartClient(mediaStreamId, mediaPortId, AUDIO_USAGE_MEDIA); attributes.usage = AUDIO_USAGE_MEDIA; attr = testStartClient(mediaStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA); attr = testStartClient(mediaStreamId, unknownPortId, AUDIO_USAGE_UNKNOWN); attributes.usage = AUDIO_USAGE_UNKNOWN; attr = testStartClient(mediaStreamId, unknownPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_UNKNOWN); // Stop client on game and media stream. Loading Loading @@ -215,16 +221,79 @@ TEST_F(UsecaseValidatorTest, testAttributesUsageChanged) { unknownPortId = testCreatePortId(gameStreamId); EXPECT_NE(unknownPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; attributes.flags = AUDIO_FLAG_LOW_LATENCY; // Verify attributes on game stream. auto attr = testStartClient(gameStreamId, mediaPortId, AUDIO_USAGE_MEDIA); attributes.usage = AUDIO_USAGE_MEDIA; auto attr = testStartClient(gameStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME); attr = testStartClient(gameStreamId, unknownPortId, AUDIO_USAGE_UNKNOWN); attributes.usage = AUDIO_USAGE_UNKNOWN; attr = testStartClient(gameStreamId, unknownPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME); // Unregister game stream. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); } /** * Verify attributes usage does not change for non low latency clients. */ TEST_F(UsecaseValidatorTest, testAttributesUsageUnChangedIfNotLowLatency) { audio_io_handle_t gameStreamId; audio_port_handle_t mediaPortId, unknownPortId; // Register game and media stream. gameStreamId = testRegisterStream(true); EXPECT_NE(gameStreamId, 0); // Assign portId. mediaPortId = testCreatePortId(gameStreamId); EXPECT_NE(mediaPortId, 0); unknownPortId = testCreatePortId(gameStreamId); EXPECT_NE(unknownPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; // Verify attributes on game stream. attributes.usage = AUDIO_USAGE_MEDIA; auto attr = testStartClient(gameStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA); attributes.usage = AUDIO_USAGE_UNKNOWN; attr = testStartClient(gameStreamId, unknownPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_UNKNOWN); // Unregister game stream. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); } /** * Verify attributes usage does not change for content type speech. */ TEST_F(UsecaseValidatorTest, testAttributesUsageUnChangedIfSpeech) { audio_io_handle_t gameStreamId; audio_port_handle_t mediaPortId, unknownPortId; // Register game and media stream. gameStreamId = testRegisterStream(true); EXPECT_NE(gameStreamId, 0); // Assign portId. mediaPortId = testCreatePortId(gameStreamId); EXPECT_NE(mediaPortId, 0); unknownPortId = testCreatePortId(gameStreamId); EXPECT_NE(unknownPortId, 0); audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER; // Verify attributes on game stream. attributes.usage = AUDIO_USAGE_MEDIA; attributes.content_type = AUDIO_CONTENT_TYPE_SPEECH; auto attr = testStartClient(gameStreamId, mediaPortId, attributes); EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA); // Unregister game stream. EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0); } } // namespace media } // namespace android
media/libaudiousecasevalidation/tests/UsecaseValidator-test.h +1 −1 Original line number Diff line number Diff line Loading @@ -69,7 +69,7 @@ class UsecaseValidatorTest : public ::testing::Test { audio_port_handle_t testCreatePortId(audio_io_handle_t streamId); error::Result<audio_attributes_t> testStartClient(audio_io_handle_t streamId, audio_port_handle_t portId, audio_usage_t usage); audio_attributes_t attributes); error::Result<audio_attributes_t> testVerifyAudioAttributes(audio_io_handle_t streamId, audio_usage_t usage); Loading