xref: /aosp_15_r20/hardware/interfaces/broadcastradio/common/utilsaidl/src/UtilsV2.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "BcRadioAidlDef.utilsV2"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include "broadcastradio-utils-aidl/UtilsV2.h"
20*4d7e907cSAndroid Build Coastguard Worker #include "broadcastradio-utils-aidl/Utils.h"
21*4d7e907cSAndroid Build Coastguard Worker 
22*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <android-base/strings.h>
24*4d7e907cSAndroid Build Coastguard Worker 
25*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::broadcastradio {
26*4d7e907cSAndroid Build Coastguard Worker 
27*4d7e907cSAndroid Build Coastguard Worker namespace utils {
28*4d7e907cSAndroid Build Coastguard Worker 
isValidV2(const ProgramIdentifier & id)29*4d7e907cSAndroid Build Coastguard Worker bool isValidV2(const ProgramIdentifier& id) {
30*4d7e907cSAndroid Build Coastguard Worker     uint64_t val = static_cast<uint64_t>(id.value);
31*4d7e907cSAndroid Build Coastguard Worker     bool valid = true;
32*4d7e907cSAndroid Build Coastguard Worker 
33*4d7e907cSAndroid Build Coastguard Worker     auto expect = [&valid](bool condition, const std::string& message) {
34*4d7e907cSAndroid Build Coastguard Worker         if (!condition) {
35*4d7e907cSAndroid Build Coastguard Worker             valid = false;
36*4d7e907cSAndroid Build Coastguard Worker             LOG(ERROR) << "identifier not valid, expected " << message;
37*4d7e907cSAndroid Build Coastguard Worker         }
38*4d7e907cSAndroid Build Coastguard Worker     };
39*4d7e907cSAndroid Build Coastguard Worker 
40*4d7e907cSAndroid Build Coastguard Worker     switch (id.type) {
41*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::INVALID:
42*4d7e907cSAndroid Build Coastguard Worker             expect(false, "IdentifierType::INVALID");
43*4d7e907cSAndroid Build Coastguard Worker             break;
44*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::DAB_FREQUENCY_KHZ:
45*4d7e907cSAndroid Build Coastguard Worker             expect(val > 100000u, "f > 100MHz");
46*4d7e907cSAndroid Build Coastguard Worker             [[fallthrough]];
47*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::AMFM_FREQUENCY_KHZ:
48*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::DRMO_FREQUENCY_KHZ:
49*4d7e907cSAndroid Build Coastguard Worker             expect(val > 100u, "f > 100kHz");
50*4d7e907cSAndroid Build Coastguard Worker             expect(val < 10000000u, "f < 10GHz");
51*4d7e907cSAndroid Build Coastguard Worker             break;
52*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::RDS_PI:
53*4d7e907cSAndroid Build Coastguard Worker             expect(val != 0u, "RDS PI != 0");
54*4d7e907cSAndroid Build Coastguard Worker             expect(val <= 0xFFFFu, "16bit id");
55*4d7e907cSAndroid Build Coastguard Worker             break;
56*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::HD_STATION_ID_EXT: {
57*4d7e907cSAndroid Build Coastguard Worker             uint64_t stationId = val & 0xFFFFFFFF;  // 32bit
58*4d7e907cSAndroid Build Coastguard Worker             val >>= 32;
59*4d7e907cSAndroid Build Coastguard Worker             uint64_t subchannel = val & 0xF;  // 4bit
60*4d7e907cSAndroid Build Coastguard Worker             val >>= 4;
61*4d7e907cSAndroid Build Coastguard Worker             uint64_t freq = val & 0x3FFFF;  // 18bit
62*4d7e907cSAndroid Build Coastguard Worker             expect(stationId != 0u, "HD station id != 0");
63*4d7e907cSAndroid Build Coastguard Worker             expect(subchannel < 8u, "HD subch < 8");
64*4d7e907cSAndroid Build Coastguard Worker             expect(freq > 100u, "f > 100kHz");
65*4d7e907cSAndroid Build Coastguard Worker             expect(freq < 10000000u, "f < 10GHz");
66*4d7e907cSAndroid Build Coastguard Worker             break;
67*4d7e907cSAndroid Build Coastguard Worker         }
68*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::HD_STATION_NAME: {
69*4d7e907cSAndroid Build Coastguard Worker             while (val > 0) {
70*4d7e907cSAndroid Build Coastguard Worker                 char ch = static_cast<char>(val & 0xFF);
71*4d7e907cSAndroid Build Coastguard Worker                 val >>= 8;
72*4d7e907cSAndroid Build Coastguard Worker                 expect((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'),
73*4d7e907cSAndroid Build Coastguard Worker                        "HD_STATION_NAME does not match [A-Z0-9]+");
74*4d7e907cSAndroid Build Coastguard Worker             }
75*4d7e907cSAndroid Build Coastguard Worker             break;
76*4d7e907cSAndroid Build Coastguard Worker         }
77*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::DAB_SID_EXT: {
78*4d7e907cSAndroid Build Coastguard Worker             uint64_t sid = val & 0xFFFFFFFF;  // 32bit
79*4d7e907cSAndroid Build Coastguard Worker             val >>= 32;
80*4d7e907cSAndroid Build Coastguard Worker             uint64_t ecc = val & 0xFF;  // 8bit
81*4d7e907cSAndroid Build Coastguard Worker             expect(sid != 0u, "DAB SId != 0");
82*4d7e907cSAndroid Build Coastguard Worker             expect(ecc >= 0xA0u && ecc <= 0xF6u, "Invalid ECC, see ETSI TS 101 756 V2.1.1");
83*4d7e907cSAndroid Build Coastguard Worker             break;
84*4d7e907cSAndroid Build Coastguard Worker         }
85*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::DAB_ENSEMBLE:
86*4d7e907cSAndroid Build Coastguard Worker             expect(val != 0u, "DAB ensemble != 0");
87*4d7e907cSAndroid Build Coastguard Worker             expect(val <= 0xFFFFu, "16bit id");
88*4d7e907cSAndroid Build Coastguard Worker             break;
89*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::DAB_SCID:
90*4d7e907cSAndroid Build Coastguard Worker             expect(val > 0xFu, "12bit SCId (not 4bit SCIdS)");
91*4d7e907cSAndroid Build Coastguard Worker             expect(val <= 0xFFFu, "12bit id");
92*4d7e907cSAndroid Build Coastguard Worker             break;
93*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::DRMO_SERVICE_ID:
94*4d7e907cSAndroid Build Coastguard Worker             expect(val != 0u, "DRM SId != 0");
95*4d7e907cSAndroid Build Coastguard Worker             expect(val <= 0xFFFFFFu, "24bit id");
96*4d7e907cSAndroid Build Coastguard Worker             break;
97*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::SXM_SERVICE_ID:
98*4d7e907cSAndroid Build Coastguard Worker             expect(val != 0u, "SXM SId != 0");
99*4d7e907cSAndroid Build Coastguard Worker             expect(val <= 0xFFFFFFFFu, "32bit id");
100*4d7e907cSAndroid Build Coastguard Worker             break;
101*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::SXM_CHANNEL:
102*4d7e907cSAndroid Build Coastguard Worker             expect(val < 1000u, "SXM channel < 1000");
103*4d7e907cSAndroid Build Coastguard Worker             break;
104*4d7e907cSAndroid Build Coastguard Worker         case IdentifierType::HD_STATION_LOCATION: {
105*4d7e907cSAndroid Build Coastguard Worker             val >>= 26;
106*4d7e907cSAndroid Build Coastguard Worker             uint64_t latitudeBit = val & 0x1;
107*4d7e907cSAndroid Build Coastguard Worker             expect(latitudeBit == 0u, "Longitude comes first");
108*4d7e907cSAndroid Build Coastguard Worker             val >>= 1;
109*4d7e907cSAndroid Build Coastguard Worker             uint64_t latitudePad = val & 0x1Fu;
110*4d7e907cSAndroid Build Coastguard Worker             expect(latitudePad == 0u, "Longitude padding");
111*4d7e907cSAndroid Build Coastguard Worker             val >>= 31;
112*4d7e907cSAndroid Build Coastguard Worker             uint64_t longitudeBit = val & 0x1;
113*4d7e907cSAndroid Build Coastguard Worker             expect(longitudeBit == 1u, "Latitude comes next");
114*4d7e907cSAndroid Build Coastguard Worker             val >>= 1;
115*4d7e907cSAndroid Build Coastguard Worker             uint64_t longitudePad = val & 0x1Fu;
116*4d7e907cSAndroid Build Coastguard Worker             expect(longitudePad == 0u, "Latitude padding");
117*4d7e907cSAndroid Build Coastguard Worker             break;
118*4d7e907cSAndroid Build Coastguard Worker         }
119*4d7e907cSAndroid Build Coastguard Worker         default:
120*4d7e907cSAndroid Build Coastguard Worker             expect(id.type >= IdentifierType::VENDOR_START && id.type <= IdentifierType::VENDOR_END,
121*4d7e907cSAndroid Build Coastguard Worker                    "Undefined identifier type");
122*4d7e907cSAndroid Build Coastguard Worker             break;
123*4d7e907cSAndroid Build Coastguard Worker     }
124*4d7e907cSAndroid Build Coastguard Worker 
125*4d7e907cSAndroid Build Coastguard Worker     return valid;
126*4d7e907cSAndroid Build Coastguard Worker }
127*4d7e907cSAndroid Build Coastguard Worker 
isValidV2(const ProgramSelector & sel)128*4d7e907cSAndroid Build Coastguard Worker bool isValidV2(const ProgramSelector& sel) {
129*4d7e907cSAndroid Build Coastguard Worker     if (sel.primaryId.type != IdentifierType::AMFM_FREQUENCY_KHZ &&
130*4d7e907cSAndroid Build Coastguard Worker         sel.primaryId.type != IdentifierType::RDS_PI &&
131*4d7e907cSAndroid Build Coastguard Worker         sel.primaryId.type != IdentifierType::HD_STATION_ID_EXT &&
132*4d7e907cSAndroid Build Coastguard Worker         sel.primaryId.type != IdentifierType::DAB_SID_EXT &&
133*4d7e907cSAndroid Build Coastguard Worker         sel.primaryId.type != IdentifierType::DRMO_SERVICE_ID &&
134*4d7e907cSAndroid Build Coastguard Worker         sel.primaryId.type != IdentifierType::SXM_SERVICE_ID &&
135*4d7e907cSAndroid Build Coastguard Worker         (sel.primaryId.type < IdentifierType::VENDOR_START ||
136*4d7e907cSAndroid Build Coastguard Worker          sel.primaryId.type > IdentifierType::VENDOR_END)) {
137*4d7e907cSAndroid Build Coastguard Worker         return false;
138*4d7e907cSAndroid Build Coastguard Worker     }
139*4d7e907cSAndroid Build Coastguard Worker     for (auto it = begin(sel); it != end(sel); it++) {
140*4d7e907cSAndroid Build Coastguard Worker         if (!isValidV2(*it)) {
141*4d7e907cSAndroid Build Coastguard Worker             return false;
142*4d7e907cSAndroid Build Coastguard Worker         }
143*4d7e907cSAndroid Build Coastguard Worker     }
144*4d7e907cSAndroid Build Coastguard Worker     return true;
145*4d7e907cSAndroid Build Coastguard Worker }
146*4d7e907cSAndroid Build Coastguard Worker 
isValidMetadataV2(const Metadata & metadata)147*4d7e907cSAndroid Build Coastguard Worker bool isValidMetadataV2(const Metadata& metadata) {
148*4d7e907cSAndroid Build Coastguard Worker     if (!isValidMetadata(metadata)) {
149*4d7e907cSAndroid Build Coastguard Worker         return false;
150*4d7e907cSAndroid Build Coastguard Worker     }
151*4d7e907cSAndroid Build Coastguard Worker 
152*4d7e907cSAndroid Build Coastguard Worker     if (metadata.getTag() == Metadata::hdStationNameShort) {
153*4d7e907cSAndroid Build Coastguard Worker         if (metadata.get<Metadata::hdStationNameShort>().size() > 12) {
154*4d7e907cSAndroid Build Coastguard Worker             LOG(ERROR) << "metadata not valid, expected HD short name length <= 12";
155*4d7e907cSAndroid Build Coastguard Worker             return false;
156*4d7e907cSAndroid Build Coastguard Worker         }
157*4d7e907cSAndroid Build Coastguard Worker     } else if (metadata.getTag() == Metadata::hdSubChannelsAvailable) {
158*4d7e907cSAndroid Build Coastguard Worker         if (metadata.get<Metadata::hdSubChannelsAvailable>() < 0) {
159*4d7e907cSAndroid Build Coastguard Worker             LOG(ERROR) << "metadata not valid, expected HD subchannels available >= 0";
160*4d7e907cSAndroid Build Coastguard Worker             return false;
161*4d7e907cSAndroid Build Coastguard Worker         } else if (metadata.get<Metadata::hdSubChannelsAvailable>() >
162*4d7e907cSAndroid Build Coastguard Worker                    std::numeric_limits<uint8_t>::max()) {
163*4d7e907cSAndroid Build Coastguard Worker             LOG(ERROR) << "metadata not valid, expected 8bit HD subchannels available";
164*4d7e907cSAndroid Build Coastguard Worker             return false;
165*4d7e907cSAndroid Build Coastguard Worker         }
166*4d7e907cSAndroid Build Coastguard Worker     }
167*4d7e907cSAndroid Build Coastguard Worker     return true;
168*4d7e907cSAndroid Build Coastguard Worker }
169*4d7e907cSAndroid Build Coastguard Worker 
getMetadataStringV2(const ProgramInfo & info,const Metadata::Tag & tag)170*4d7e907cSAndroid Build Coastguard Worker std::optional<std::string> getMetadataStringV2(const ProgramInfo& info, const Metadata::Tag& tag) {
171*4d7e907cSAndroid Build Coastguard Worker     auto hasMetadataType = [tag](const Metadata& item) { return item.getTag() == tag; };
172*4d7e907cSAndroid Build Coastguard Worker 
173*4d7e907cSAndroid Build Coastguard Worker     auto it = std::find_if(info.metadata.begin(), info.metadata.end(), hasMetadataType);
174*4d7e907cSAndroid Build Coastguard Worker     if (it == info.metadata.end()) {
175*4d7e907cSAndroid Build Coastguard Worker         return std::nullopt;
176*4d7e907cSAndroid Build Coastguard Worker     }
177*4d7e907cSAndroid Build Coastguard Worker 
178*4d7e907cSAndroid Build Coastguard Worker     std::string metadataString;
179*4d7e907cSAndroid Build Coastguard Worker     switch (it->getTag()) {
180*4d7e907cSAndroid Build Coastguard Worker         case Metadata::rdsPs:
181*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::rdsPs>();
182*4d7e907cSAndroid Build Coastguard Worker             break;
183*4d7e907cSAndroid Build Coastguard Worker         case Metadata::rdsPty:
184*4d7e907cSAndroid Build Coastguard Worker             metadataString = std::to_string(it->get<Metadata::rdsPty>());
185*4d7e907cSAndroid Build Coastguard Worker             break;
186*4d7e907cSAndroid Build Coastguard Worker         case Metadata::rbdsPty:
187*4d7e907cSAndroid Build Coastguard Worker             metadataString = std::to_string(it->get<Metadata::rbdsPty>());
188*4d7e907cSAndroid Build Coastguard Worker             break;
189*4d7e907cSAndroid Build Coastguard Worker         case Metadata::rdsRt:
190*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::rdsRt>();
191*4d7e907cSAndroid Build Coastguard Worker             break;
192*4d7e907cSAndroid Build Coastguard Worker         case Metadata::songTitle:
193*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::songTitle>();
194*4d7e907cSAndroid Build Coastguard Worker             break;
195*4d7e907cSAndroid Build Coastguard Worker         case Metadata::songArtist:
196*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::songArtist>();
197*4d7e907cSAndroid Build Coastguard Worker             break;
198*4d7e907cSAndroid Build Coastguard Worker         case Metadata::songAlbum:
199*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::songAlbum>();
200*4d7e907cSAndroid Build Coastguard Worker             break;
201*4d7e907cSAndroid Build Coastguard Worker         case Metadata::stationIcon:
202*4d7e907cSAndroid Build Coastguard Worker             metadataString = std::to_string(it->get<Metadata::stationIcon>());
203*4d7e907cSAndroid Build Coastguard Worker             break;
204*4d7e907cSAndroid Build Coastguard Worker         case Metadata::albumArt:
205*4d7e907cSAndroid Build Coastguard Worker             metadataString = std::to_string(it->get<Metadata::albumArt>());
206*4d7e907cSAndroid Build Coastguard Worker             break;
207*4d7e907cSAndroid Build Coastguard Worker         case Metadata::programName:
208*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::programName>();
209*4d7e907cSAndroid Build Coastguard Worker             break;
210*4d7e907cSAndroid Build Coastguard Worker         case Metadata::dabEnsembleName:
211*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::dabEnsembleName>();
212*4d7e907cSAndroid Build Coastguard Worker             break;
213*4d7e907cSAndroid Build Coastguard Worker         case Metadata::dabEnsembleNameShort:
214*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::dabEnsembleNameShort>();
215*4d7e907cSAndroid Build Coastguard Worker             break;
216*4d7e907cSAndroid Build Coastguard Worker         case Metadata::dabServiceName:
217*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::dabServiceName>();
218*4d7e907cSAndroid Build Coastguard Worker             break;
219*4d7e907cSAndroid Build Coastguard Worker         case Metadata::dabServiceNameShort:
220*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::dabServiceNameShort>();
221*4d7e907cSAndroid Build Coastguard Worker             break;
222*4d7e907cSAndroid Build Coastguard Worker         case Metadata::dabComponentName:
223*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::dabComponentName>();
224*4d7e907cSAndroid Build Coastguard Worker             break;
225*4d7e907cSAndroid Build Coastguard Worker         case Metadata::dabComponentNameShort:
226*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::dabComponentNameShort>();
227*4d7e907cSAndroid Build Coastguard Worker             break;
228*4d7e907cSAndroid Build Coastguard Worker         case Metadata::genre:
229*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::genre>();
230*4d7e907cSAndroid Build Coastguard Worker             break;
231*4d7e907cSAndroid Build Coastguard Worker         case Metadata::commentShortDescription:
232*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::commentShortDescription>();
233*4d7e907cSAndroid Build Coastguard Worker             break;
234*4d7e907cSAndroid Build Coastguard Worker         case Metadata::commentActualText:
235*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::commentActualText>();
236*4d7e907cSAndroid Build Coastguard Worker             break;
237*4d7e907cSAndroid Build Coastguard Worker         case Metadata::commercial:
238*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::commercial>();
239*4d7e907cSAndroid Build Coastguard Worker             break;
240*4d7e907cSAndroid Build Coastguard Worker         case Metadata::ufids: {
241*4d7e907cSAndroid Build Coastguard Worker             auto& ufids = it->get<Metadata::ufids>();
242*4d7e907cSAndroid Build Coastguard Worker             metadataString = "[";
243*4d7e907cSAndroid Build Coastguard Worker             for (const auto& ufid : ufids) {
244*4d7e907cSAndroid Build Coastguard Worker                 metadataString += std::string(ufid) + ",";
245*4d7e907cSAndroid Build Coastguard Worker             }
246*4d7e907cSAndroid Build Coastguard Worker             if (ufids.empty()) {
247*4d7e907cSAndroid Build Coastguard Worker                 metadataString += "]";
248*4d7e907cSAndroid Build Coastguard Worker             } else {
249*4d7e907cSAndroid Build Coastguard Worker                 metadataString[metadataString.size() - 1] = ']';
250*4d7e907cSAndroid Build Coastguard Worker             }
251*4d7e907cSAndroid Build Coastguard Worker         } break;
252*4d7e907cSAndroid Build Coastguard Worker         case Metadata::hdStationNameShort:
253*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::hdStationNameShort>();
254*4d7e907cSAndroid Build Coastguard Worker             break;
255*4d7e907cSAndroid Build Coastguard Worker         case Metadata::hdStationNameLong:
256*4d7e907cSAndroid Build Coastguard Worker             metadataString = it->get<Metadata::hdStationNameLong>();
257*4d7e907cSAndroid Build Coastguard Worker             break;
258*4d7e907cSAndroid Build Coastguard Worker         case Metadata::hdSubChannelsAvailable:
259*4d7e907cSAndroid Build Coastguard Worker             metadataString = std::to_string(it->get<Metadata::hdSubChannelsAvailable>());
260*4d7e907cSAndroid Build Coastguard Worker             break;
261*4d7e907cSAndroid Build Coastguard Worker         default:
262*4d7e907cSAndroid Build Coastguard Worker             LOG(ERROR) << "Metadata " << it->toString() << " is not converted.";
263*4d7e907cSAndroid Build Coastguard Worker             return std::nullopt;
264*4d7e907cSAndroid Build Coastguard Worker     }
265*4d7e907cSAndroid Build Coastguard Worker     return metadataString;
266*4d7e907cSAndroid Build Coastguard Worker }
267*4d7e907cSAndroid Build Coastguard Worker 
268*4d7e907cSAndroid Build Coastguard Worker }  // namespace utils
269*4d7e907cSAndroid Build Coastguard Worker 
270*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::broadcastradio
271