Loading CleanSpec.mk +1 −0 Original line number Diff line number Diff line Loading @@ -63,3 +63,4 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/android.hardware.au $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/android.hardware.tests*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/vndk/android.hardware.tests*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/vndk-sp/android.hardware.graphics.allocator*) $(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore\@1\.1*" -print0 | xargs -0 rm -f) broadcastradio/2.0/types.hal +23 −2 Original line number Diff line number Diff line Loading @@ -466,7 +466,12 @@ enum IdentifierType : uint32_t { * Consists of (from the LSB): * - 32bit: Station ID number; * - 4bit: HD Radio subchannel; * - 18bit: AMFM_FREQUENCY. // TODO(b/69958777): is it necessary? * - 18bit: AMFM_FREQUENCY. * * While station ID number should be unique globally, it sometimes get * abused by broadcasters (i.e. not being set at all). To ensure local * uniqueness, AMFM_FREQUENCY was added here. Global uniqueness is * a best-effort - see HD_STATION_NAME. * * HD Radio subchannel is a value in range 0-7. * This index is 0-based (where 0 is MPS and 1..7 are SPS), Loading @@ -477,6 +482,22 @@ enum IdentifierType : uint32_t { */ HD_STATION_ID_EXT, /** * 64bit additional identifier for HD Radio. * * Due to Station ID abuse, some HD_STATION_ID_EXT identifiers may be not * globally unique. To provide a best-effort solution, a short version of * station name may be carried as additional identifier and may be used * by the tuner hardware to double-check tuning. * * The name is limited to the first 8 A-Z0-9 characters (lowercase letters * must be converted to uppercase). Encoded in little-endian ASCII: * the first character of the name is the LSB. * * For example: "Abc" is encoded as 0x434241. */ HD_STATION_NAME, /** * 28bit compound primary identifier for Digital Audio Broadcasting. * Loading @@ -492,7 +513,7 @@ enum IdentifierType : uint32_t { * The remaining bits should be set to zeros when writing on the chip side * and ignored when read. */ DAB_SID_EXT = HD_STATION_ID_EXT + 2, DAB_SID_EXT, /** 16bit */ DAB_ENSEMBLE, Loading broadcastradio/2.0/vts/functional/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ cc_test { name: "VtsHalBroadcastradioV2_0TargetTest", defaults: ["VtsHalTargetTestDefaults"], cppflags: [ "-std=c++1z", ], srcs: ["VtsHalBroadcastradioV2_0TargetTest.cpp"], static_libs: [ "android.hardware.broadcastradio@2.0", Loading broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp +47 −10 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <gmock/gmock.h> #include <chrono> #include <optional> #include <regex> namespace android { Loading Loading @@ -100,6 +101,7 @@ class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase { bool openSession(); bool getAmFmRegionConfig(bool full, AmFmRegionConfig* config); std::optional<utils::ProgramInfoSet> getProgramList(); sp<IBroadcastRadio> mModule; Properties mProperties; Loading Loading @@ -182,6 +184,25 @@ bool BroadcastRadioHalTest::getAmFmRegionConfig(bool full, AmFmRegionConfig* con return halResult == Result::OK; } std::optional<utils::ProgramInfoSet> BroadcastRadioHalTest::getProgramList() { EXPECT_TIMEOUT_CALL(*mCallback, onProgramListReady).Times(AnyNumber()); auto startResult = mSession->startProgramListUpdates({}); if (startResult == Result::NOT_SUPPORTED) { printSkipped("Program list not supported"); return nullopt; } EXPECT_EQ(Result::OK, startResult); if (startResult != Result::OK) return nullopt; EXPECT_TIMEOUT_CALL_WAIT(*mCallback, onProgramListReady, timeout::programListScan); auto stopResult = mSession->stopProgramListUpdates(); EXPECT_TRUE(stopResult.isOk()); return mCallback->mProgramList; } /** * Test session opening. * Loading Loading @@ -649,19 +670,35 @@ TEST_F(BroadcastRadioHalTest, SetConfigFlags) { TEST_F(BroadcastRadioHalTest, GetProgramList) { ASSERT_TRUE(openSession()); EXPECT_TIMEOUT_CALL(*mCallback, onProgramListReady).Times(AnyNumber()); auto startResult = mSession->startProgramListUpdates({}); if (startResult == Result::NOT_SUPPORTED) { printSkipped("Program list not supported"); return; getProgramList(); } ASSERT_EQ(Result::OK, startResult); EXPECT_TIMEOUT_CALL_WAIT(*mCallback, onProgramListReady, timeout::programListScan); /** * Test HD_STATION_NAME correctness. * * Verifies that if a program on the list contains HD_STATION_NAME identifier: * - the program provides station name in its metadata; * - the identifier matches the name; * - there is only one identifier of that type. */ TEST_F(BroadcastRadioHalTest, HdRadioStationNameId) { ASSERT_TRUE(openSession()); auto stopResult = mSession->stopProgramListUpdates(); EXPECT_TRUE(stopResult.isOk()); auto list = getProgramList(); if (!list) return; for (auto&& program : *list) { auto nameIds = utils::getAllIds(program.selector, IdentifierType::HD_STATION_NAME); EXPECT_LE(nameIds.size(), 1u); if (nameIds.size() == 0) continue; auto name = utils::getMetadataString(program, MetadataKey::PROGRAM_NAME); if (!name) name = utils::getMetadataString(program, MetadataKey::RDS_PS); ASSERT_TRUE(name.has_value()); auto expectedId = utils::make_hdradio_station_name(*name); EXPECT_EQ(expectedId.value, nameIds[0]); } } /** Loading broadcastradio/common/tests/Android.bp +7 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ cc_test { "-Wextra", "-Werror", ], cppflags: [ "-std=c++1z", ], srcs: [ "CommonXX_test.cpp", ], Loading @@ -43,8 +46,12 @@ cc_test { "-Wextra", "-Werror", ], cppflags: [ "-std=c++1z", ], srcs: [ "IdentifierIterator_test.cpp", "ProgramIdentifier_test.cpp", ], static_libs: [ "android.hardware.broadcastradio@common-utils-2x-lib", Loading Loading
CleanSpec.mk +1 −0 Original line number Diff line number Diff line Loading @@ -63,3 +63,4 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/android.hardware.au $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/android.hardware.tests*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/vndk/android.hardware.tests*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/vndk-sp/android.hardware.graphics.allocator*) $(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore\@1\.1*" -print0 | xargs -0 rm -f)
broadcastradio/2.0/types.hal +23 −2 Original line number Diff line number Diff line Loading @@ -466,7 +466,12 @@ enum IdentifierType : uint32_t { * Consists of (from the LSB): * - 32bit: Station ID number; * - 4bit: HD Radio subchannel; * - 18bit: AMFM_FREQUENCY. // TODO(b/69958777): is it necessary? * - 18bit: AMFM_FREQUENCY. * * While station ID number should be unique globally, it sometimes get * abused by broadcasters (i.e. not being set at all). To ensure local * uniqueness, AMFM_FREQUENCY was added here. Global uniqueness is * a best-effort - see HD_STATION_NAME. * * HD Radio subchannel is a value in range 0-7. * This index is 0-based (where 0 is MPS and 1..7 are SPS), Loading @@ -477,6 +482,22 @@ enum IdentifierType : uint32_t { */ HD_STATION_ID_EXT, /** * 64bit additional identifier for HD Radio. * * Due to Station ID abuse, some HD_STATION_ID_EXT identifiers may be not * globally unique. To provide a best-effort solution, a short version of * station name may be carried as additional identifier and may be used * by the tuner hardware to double-check tuning. * * The name is limited to the first 8 A-Z0-9 characters (lowercase letters * must be converted to uppercase). Encoded in little-endian ASCII: * the first character of the name is the LSB. * * For example: "Abc" is encoded as 0x434241. */ HD_STATION_NAME, /** * 28bit compound primary identifier for Digital Audio Broadcasting. * Loading @@ -492,7 +513,7 @@ enum IdentifierType : uint32_t { * The remaining bits should be set to zeros when writing on the chip side * and ignored when read. */ DAB_SID_EXT = HD_STATION_ID_EXT + 2, DAB_SID_EXT, /** 16bit */ DAB_ENSEMBLE, Loading
broadcastradio/2.0/vts/functional/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ cc_test { name: "VtsHalBroadcastradioV2_0TargetTest", defaults: ["VtsHalTargetTestDefaults"], cppflags: [ "-std=c++1z", ], srcs: ["VtsHalBroadcastradioV2_0TargetTest.cpp"], static_libs: [ "android.hardware.broadcastradio@2.0", Loading
broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp +47 −10 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <gmock/gmock.h> #include <chrono> #include <optional> #include <regex> namespace android { Loading Loading @@ -100,6 +101,7 @@ class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase { bool openSession(); bool getAmFmRegionConfig(bool full, AmFmRegionConfig* config); std::optional<utils::ProgramInfoSet> getProgramList(); sp<IBroadcastRadio> mModule; Properties mProperties; Loading Loading @@ -182,6 +184,25 @@ bool BroadcastRadioHalTest::getAmFmRegionConfig(bool full, AmFmRegionConfig* con return halResult == Result::OK; } std::optional<utils::ProgramInfoSet> BroadcastRadioHalTest::getProgramList() { EXPECT_TIMEOUT_CALL(*mCallback, onProgramListReady).Times(AnyNumber()); auto startResult = mSession->startProgramListUpdates({}); if (startResult == Result::NOT_SUPPORTED) { printSkipped("Program list not supported"); return nullopt; } EXPECT_EQ(Result::OK, startResult); if (startResult != Result::OK) return nullopt; EXPECT_TIMEOUT_CALL_WAIT(*mCallback, onProgramListReady, timeout::programListScan); auto stopResult = mSession->stopProgramListUpdates(); EXPECT_TRUE(stopResult.isOk()); return mCallback->mProgramList; } /** * Test session opening. * Loading Loading @@ -649,19 +670,35 @@ TEST_F(BroadcastRadioHalTest, SetConfigFlags) { TEST_F(BroadcastRadioHalTest, GetProgramList) { ASSERT_TRUE(openSession()); EXPECT_TIMEOUT_CALL(*mCallback, onProgramListReady).Times(AnyNumber()); auto startResult = mSession->startProgramListUpdates({}); if (startResult == Result::NOT_SUPPORTED) { printSkipped("Program list not supported"); return; getProgramList(); } ASSERT_EQ(Result::OK, startResult); EXPECT_TIMEOUT_CALL_WAIT(*mCallback, onProgramListReady, timeout::programListScan); /** * Test HD_STATION_NAME correctness. * * Verifies that if a program on the list contains HD_STATION_NAME identifier: * - the program provides station name in its metadata; * - the identifier matches the name; * - there is only one identifier of that type. */ TEST_F(BroadcastRadioHalTest, HdRadioStationNameId) { ASSERT_TRUE(openSession()); auto stopResult = mSession->stopProgramListUpdates(); EXPECT_TRUE(stopResult.isOk()); auto list = getProgramList(); if (!list) return; for (auto&& program : *list) { auto nameIds = utils::getAllIds(program.selector, IdentifierType::HD_STATION_NAME); EXPECT_LE(nameIds.size(), 1u); if (nameIds.size() == 0) continue; auto name = utils::getMetadataString(program, MetadataKey::PROGRAM_NAME); if (!name) name = utils::getMetadataString(program, MetadataKey::RDS_PS); ASSERT_TRUE(name.has_value()); auto expectedId = utils::make_hdradio_station_name(*name); EXPECT_EQ(expectedId.value, nameIds[0]); } } /** Loading
broadcastradio/common/tests/Android.bp +7 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ cc_test { "-Wextra", "-Werror", ], cppflags: [ "-std=c++1z", ], srcs: [ "CommonXX_test.cpp", ], Loading @@ -43,8 +46,12 @@ cc_test { "-Wextra", "-Werror", ], cppflags: [ "-std=c++1z", ], srcs: [ "IdentifierIterator_test.cpp", "ProgramIdentifier_test.cpp", ], static_libs: [ "android.hardware.broadcastradio@common-utils-2x-lib", Loading