1/* Copyright (C) 2017 The Android Open Source Project 2 * 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16package [email protected]; 17 18/** Constants used by broadcast radio HAL. */ 19enum Constants : int32_t { 20 /** Invalid identifier for IBroadcastRadio::getImage. */ 21 INVALID_IMAGE = 0, 22 23 /** 24 * If the antenna is disconnected from the beginning, the 25 * onAntennaStateChange callback must be called within this time. 26 */ 27 ANTENNA_DISCONNECTED_TIMEOUT_MS = 100, 28 29 LIST_COMPLETE_TIMEOUT_MS = 300000, 30}; 31 32enum Result : int32_t { 33 OK, 34 UNKNOWN_ERROR, 35 INTERNAL_ERROR, 36 INVALID_ARGUMENTS, 37 INVALID_STATE, 38 NOT_SUPPORTED, 39 TIMEOUT, 40}; 41 42/** 43 * Configuration flags to be used with isConfigFlagSet and setConfigFlag methods 44 * of ITunerSession. 45 */ 46enum ConfigFlag : uint32_t { 47 /** 48 * Forces mono audio stream reception. 49 * 50 * Analog broadcasts can recover poor reception conditions by jointing 51 * stereo channels into one. Mainly for, but not limited to AM/FM. 52 */ 53 FORCE_MONO = 1, 54 55 /** 56 * Forces the analog playback for the supporting radio technology. 57 * 58 * User may disable digital playback for FM HD Radio or hybrid FM/DAB with 59 * this option. This is purely user choice, ie. does not reflect digital- 60 * analog handover state managed from the HAL implementation side. 61 * 62 * Some radio technologies may not support this, ie. DAB. 63 */ 64 FORCE_ANALOG, 65 66 /** 67 * Forces the digital playback for the supporting radio technology. 68 * 69 * User may disable digital-analog handover that happens with poor 70 * reception conditions. With digital forced, the radio will remain silent 71 * instead of switching to analog channel if it's available. This is purely 72 * user choice, it does not reflect the actual state of handover. 73 */ 74 FORCE_DIGITAL, 75 76 /** 77 * RDS Alternative Frequencies. 78 * 79 * If set and the currently tuned RDS station broadcasts on multiple 80 * channels, radio tuner automatically switches to the best available 81 * alternative. 82 */ 83 RDS_AF, 84 85 /** 86 * RDS region-specific program lock-down. 87 * 88 * Allows user to lock to the current region as they move into the 89 * other region. 90 */ 91 RDS_REG, 92 93 /** Enables DAB-DAB hard- and implicit-linking (the same content). */ 94 DAB_DAB_LINKING, 95 96 /** Enables DAB-FM hard- and implicit-linking (the same content). */ 97 DAB_FM_LINKING, 98 99 /** Enables DAB-DAB soft-linking (related content). */ 100 DAB_DAB_SOFT_LINKING, 101 102 /** Enables DAB-FM soft-linking (related content). */ 103 DAB_FM_SOFT_LINKING, 104}; 105 106/** 107 * A key-value pair for vendor-specific information to be passed as-is through 108 * Android framework to the front-end application. 109 */ 110struct VendorKeyValue { 111 /** 112 * Key must start with unique vendor Java-style namespace, 113 * eg. 'com.somecompany.parameter1'. 114 */ 115 string key; 116 117 /** 118 * Value must be passed through the framework without any changes. 119 * Format of this string can vary across vendors. 120 */ 121 string value; 122}; 123 124/** 125 * A supported or configured RDS variant. 126 * 127 * Both might be set for hardware capabilities check (with full=true when 128 * calling getAmFmRegionConfig), but only one (or none) for specific 129 * region settings. 130 */ 131enum Rds : uint8_t { 132 /** Standard variant, used everywhere except North America. */ 133 RDS = 1 << 0, 134 135 /** Variant used in North America. */ 136 RBDS = 1 << 1, 137}; 138 139/** 140 * FM de-emphasis filter supported or configured. 141 * 142 * Both might be set for hardware capabilities check (with full=true when 143 * calling getAmFmRegionConfig), but exactly one for specific region settings. 144 */ 145enum Deemphasis : uint8_t { 146 D50 = 1 << 0, 147 D75 = 1 << 1, 148}; 149 150/** 151 * Regional configuration for AM/FM. 152 * 153 * For hardware capabilities check (with full=true when calling 154 * getAmFmRegionConfig), HAL implementation fills entire supported range of 155 * frequencies and features. 156 * 157 * When checking current configuration, at most one bit in each bitfield 158 * can be set. 159 */ 160struct AmFmRegionConfig { 161 /** 162 * All supported or configured AM/FM bands. 163 * 164 * AM/FM bands are identified by frequency value 165 * (see IdentifierType::AMFM_FREQUENCY). 166 * 167 * With typical configuration, it's expected to have two frequency ranges 168 * for capabilities check (AM and FM) and four ranges for specific region 169 * configuration (AM LW, AM MW, AM SW, FM). 170 */ 171 vec<AmFmBandRange> ranges; 172 173 /** De-emphasis filter supported/configured. */ 174 bitfield<Deemphasis> fmDeemphasis; 175 176 /** RDS/RBDS variant supported/configured. */ 177 bitfield<Rds> fmRds; 178}; 179 180/** 181 * AM/FM band range for region configuration. 182 * 183 * Defines channel grid: each possible channel is set at 184 * lowerBound + channelNumber * spacing, up to upperBound. 185 */ 186struct AmFmBandRange { 187 /** The frequency (in kHz) of the first channel within the range. */ 188 uint32_t lowerBound; 189 190 /** The frequency (in kHz) of the last channel within the range. */ 191 uint32_t upperBound; 192 193 /** Channel grid resolution (in kHz), how far apart are the channels. */ 194 uint32_t spacing; 195 196 /** 197 * Channel spacing (in kHz) used to speed up seeking to the next station 198 * via the ITunerSession::scan() operation. 199 * 200 * It must be a multiple of channel grid resolution. 201 * 202 * Tuner may first quickly check every n-th channel and if it detects echo 203 * from a station, it fine-tunes to find the exact frequency. 204 * 205 * It's ignored for capabilities check (with full=true when calling 206 * getAmFmRegionConfig). 207 */ 208 uint32_t scanSpacing; 209}; 210 211/** 212 * An entry in regional configuration for DAB. 213 * 214 * Defines a frequency table row for ensembles. 215 */ 216struct DabTableEntry { 217 /** 218 * Channel name, i.e. 5A, 7B. 219 * 220 * It must match the following regular expression: 221 * /^[A-Z0-9][A-Z0-9 ]{0,5}[A-Z0-9]$/ (2-7 uppercase alphanumeric characters 222 * without spaces allowed at the beginning nor end). 223 */ 224 string label; 225 226 /** Frequency, in kHz. */ 227 uint32_t frequency; 228}; 229 230/** 231 * Properties of a given broadcast radio module. 232 */ 233struct Properties { 234 /** 235 * A company name who made the radio module. Must be a valid, registered 236 * name of the company itself. 237 * 238 * It must be opaque to the Android framework. 239 */ 240 string maker; 241 242 /** 243 * A product name. Must be unique within the company. 244 * 245 * It must be opaque to the Android framework. 246 */ 247 string product; 248 249 /** 250 * Version of the hardware module. 251 * 252 * It must be opaque to the Android framework. 253 */ 254 string version; 255 256 /** 257 * Hardware serial number (for subscription services). 258 * 259 * It must be opaque to the Android framework. 260 */ 261 string serial; 262 263 /** 264 * A list of supported IdentifierType values. 265 * 266 * If an identifier is supported by radio module, it means it can use it for 267 * tuning to ProgramSelector with either primary or secondary Identifier of 268 * a given type. 269 * 270 * Support for VENDOR identifier type does not guarantee compatibility, as 271 * other module properties (implementor, product, version) must be checked. 272 */ 273 vec<uint32_t> supportedIdentifierTypes; 274 275 /** 276 * Vendor-specific information. 277 * 278 * It may be used for extra features, not supported by the platform, 279 * for example: com.me.preset-slots=6; com.me.ultra-hd-capable=false. 280 */ 281 vec<VendorKeyValue> vendorInfo; 282}; 283 284/** 285 * Program (channel, station) information. 286 * 287 * Carries both user-visible information (like station name) and technical 288 * details (tuning selector). 289 */ 290struct ProgramInfo { 291 /** 292 * An identifier used to point at the program (primarily to tune to it). 293 * 294 * This field is required - its type field must not be set to 295 * IdentifierType::INVALID. 296 */ 297 ProgramSelector selector; 298 299 /** 300 * Identifier currently used for program selection. 301 * 302 * It allows to determine which technology is currently used for reception. 303 * 304 * Some program selectors contain tuning information for different radio 305 * technologies (i.e. FM RDS and DAB). For example, user may tune using 306 * a ProgramSelector with RDS_PI primary identifier, but the tuner hardware 307 * may choose to use DAB technology to make actual tuning. This identifier 308 * must reflect that. 309 * 310 * This field is required for currently tuned program only. 311 * For all other items on the program list, its type field must be 312 * initialized to IdentifierType::INVALID. 313 * 314 * Only primary identifiers for a given radio technology are valid: 315 * - AMFM_FREQUENCY for analog AM/FM; 316 * - RDS_PI for FM RDS; 317 * - HD_STATION_ID_EXT; 318 * - DAB_SID_EXT; 319 * - DRMO_SERVICE_ID; 320 * - SXM_SERVICE_ID; 321 * - VENDOR_*; 322 * - more might come in next minor versions of this HAL. 323 */ 324 ProgramIdentifier logicallyTunedTo; 325 326 /** 327 * Identifier currently used by hardware to physically tune to a channel. 328 * 329 * Some radio technologies broadcast the same program on multiple channels, 330 * i.e. with RDS AF the same program may be broadcasted on multiple 331 * alternative frequencies; the same DAB program may be broadcast on 332 * multiple ensembles. This identifier points to the channel to which the 333 * radio hardware is physically tuned to. 334 * 335 * This field is required for currently tuned program only. 336 * For all other items on the program list, its type field must be 337 * initialized to IdentifierType::INVALID. 338 * 339 * Only physical identifiers are valid: 340 * - AMFM_FREQUENCY; 341 * - DAB_ENSEMBLE; 342 * - DRMO_FREQUENCY; 343 * - SXM_CHANNEL; 344 * - VENDOR_*; 345 * - more might come in next minor versions of this HAL. 346 */ 347 ProgramIdentifier physicallyTunedTo; 348 349 /** 350 * Primary identifiers of related contents. 351 * 352 * Some radio technologies provide pointers to other programs that carry 353 * related content (i.e. DAB soft-links). This field is a list of pointers 354 * to other programs on the program list. 355 * 356 * This is not a list of programs that carry the same content (i.e. 357 * DAB hard-links, RDS AF). Switching to programs from this list usually 358 * require user action. 359 * 360 * Please note, that these identifiers do not have to exist on the program 361 * list - i.e. DAB tuner may provide information on FM RDS alternatives 362 * despite not supporting FM RDS. If the system has multiple tuners, another 363 * one may have it on its list. 364 * 365 * This field is optional (can be empty). 366 */ 367 vec<ProgramIdentifier> relatedContent; 368 369 bitfield<ProgramInfoFlags> infoFlags; 370 371 /** 372 * Signal quality measured in 0% to 100% range to be shown in the UI. 373 * 374 * The purpose of this field is primarily informative, must not be used to 375 * determine to which frequency should it tune to. 376 */ 377 uint32_t signalQuality; 378 379 /** 380 * Program metadata (station name, PTY, song title). 381 */ 382 vec<Metadata> metadata; 383 384 /** 385 * Vendor-specific information. 386 * 387 * It may be used for extra features, not supported by the platform, 388 * for example: paid-service=true; bitrate=320kbps. 389 */ 390 vec<VendorKeyValue> vendorInfo; 391}; 392 393enum ProgramInfoFlags : uint32_t { 394 /** 395 * Set when the program is currently playing live stream. 396 * This may result in a slightly altered reception parameters, 397 * usually targetted at reduced latency. 398 */ 399 LIVE = 1 << 0, 400 401 /** 402 * Radio stream is not playing, ie. due to bad reception conditions or 403 * buffering. In this state volume knob MAY be disabled to prevent user 404 * increasing volume too much. 405 */ 406 MUTED = 1 << 1, 407 408 /** 409 * Station broadcasts traffic information regularly, 410 * but not necessarily right now. 411 */ 412 TRAFFIC_PROGRAM = 1 << 2, 413 414 /** 415 * Station is broadcasting traffic information at the very moment. 416 */ 417 TRAFFIC_ANNOUNCEMENT = 1 << 3, 418 419 /** 420 * Tuned to a program (not playing static). 421 * 422 * It's the same condition that would stop a seek operation 423 * (ie: ITunerSession::scan()). 424 * 425 * By definition, this flag must be set for all items on the program list. 426 */ 427 TUNED = 1 << 4, 428 429 /** 430 * Audio stream is MONO if this bit is not set. 431 */ 432 STEREO = 1 << 5, 433}; 434 435/** 436 * Type of program identifier component. 437 * 438 * Each identifier type corresponds to exactly one radio technology, 439 * i.e. DAB_ENSEMBLE is specifically for DAB. 440 * 441 * VENDOR identifier types must be opaque to the framework. 442 * 443 * The value format for each (but VENDOR_*) identifier is strictly defined 444 * to maintain interoperability between devices made by different vendors. 445 * 446 * All other values are reserved for future use. 447 * Values not matching any enumerated constant must be ignored. 448 */ 449enum IdentifierType : uint32_t { 450 /** 451 * Primary/secondary identifier for vendor-specific radio technology. 452 * The value format is determined by a vendor. 453 * 454 * The vendor identifiers have limited serialization capabilities - see 455 * ProgramSelector description. 456 */ 457 VENDOR_START = 1000, 458 459 /** See VENDOR_START */ 460 VENDOR_END = 1999, 461 462 INVALID = 0, 463 464 /** 465 * Primary identifier for analogue (without RDS) AM/FM stations: 466 * frequency in kHz. 467 * 468 * This identifier also contains band information: 469 * - <500kHz: AM LW; 470 * - 500kHz - 1705kHz: AM MW; 471 * - 1.71MHz - 30MHz: AM SW; 472 * - >60MHz: FM. 473 */ 474 AMFM_FREQUENCY, 475 476 /** 477 * 16bit primary identifier for FM RDS station. 478 */ 479 RDS_PI, 480 481 /** 482 * 64bit compound primary identifier for HD Radio. 483 * 484 * Consists of (from the LSB): 485 * - 32bit: Station ID number; 486 * - 4bit: HD Radio subchannel; 487 * - 18bit: AMFM_FREQUENCY. 488 * 489 * While station ID number should be unique globally, it sometimes get 490 * abused by broadcasters (i.e. not being set at all). To ensure local 491 * uniqueness, AMFM_FREQUENCY was added here. Global uniqueness is 492 * a best-effort - see HD_STATION_NAME. 493 * 494 * HD Radio subchannel is a value in range 0-7. 495 * This index is 0-based (where 0 is MPS and 1..7 are SPS), 496 * as opposed to HD Radio standard (where it's 1-based). 497 * 498 * The remaining bits should be set to zeros when writing on the chip side 499 * and ignored when read. 500 */ 501 HD_STATION_ID_EXT, 502 503 /** 504 * 64bit additional identifier for HD Radio. 505 * 506 * Due to Station ID abuse, some HD_STATION_ID_EXT identifiers may be not 507 * globally unique. To provide a best-effort solution, a short version of 508 * station name may be carried as additional identifier and may be used 509 * by the tuner hardware to double-check tuning. 510 * 511 * The name is limited to the first 8 A-Z0-9 characters (lowercase letters 512 * must be converted to uppercase). Encoded in little-endian ASCII: 513 * the first character of the name is the LSB. 514 * 515 * For example: "Abc" is encoded as 0x434241. 516 */ 517 HD_STATION_NAME, 518 519 /** 520 * 28bit compound primary identifier for Digital Audio Broadcasting. 521 * 522 * Consists of (from the LSB): 523 * - 16bit: SId; 524 * - 8bit: ECC code; 525 * - 4bit: SCIdS. 526 * 527 * SCIdS (Service Component Identifier within the Service) value 528 * of 0 represents the main service, while 1 and above represents 529 * secondary services. 530 * 531 * The remaining bits should be set to zeros when writing on the chip side 532 * and ignored when read. 533 */ 534 DAB_SID_EXT, 535 536 /** 16bit */ 537 DAB_ENSEMBLE, 538 539 /** 12bit */ 540 DAB_SCID, 541 542 /** kHz (see AMFM_FREQUENCY) */ 543 DAB_FREQUENCY, 544 545 /** 546 * 24bit primary identifier for Digital Radio Mondiale. 547 */ 548 DRMO_SERVICE_ID, 549 550 /** kHz (see AMFM_FREQUENCY) */ 551 DRMO_FREQUENCY, 552 553 /** 554 * 32bit primary identifier for SiriusXM Satellite Radio. 555 */ 556 SXM_SERVICE_ID = DRMO_FREQUENCY + 2, 557 558 /** 0-999 range */ 559 SXM_CHANNEL, 560}; 561 562/** 563 * A single program identifier component, i.e. frequency or channel ID. 564 */ 565struct ProgramIdentifier { 566 /** 567 * Maps to IdentifierType enum. The enum may be extended in future versions 568 * of the HAL. Values out of the enum range must not be used when writing 569 * and ignored when reading. 570 */ 571 uint32_t type; 572 573 /** 574 * The uint64_t value field holds the value in format described in comments 575 * for IdentifierType enum. 576 */ 577 uint64_t value; 578}; 579 580/** 581 * A set of identifiers necessary to tune to a given station. 582 * 583 * This can hold a combination of various identifiers, like: 584 * - AM/FM frequency, 585 * - HD Radio subchannel, 586 * - DAB service ID. 587 * 588 * The type of radio technology is determined by the primary identifier - if the 589 * primary identifier is for DAB, the program is DAB. However, a program of a 590 * specific radio technology may have additional secondary identifiers for other 591 * technologies, i.e. a satellite program may have FM fallback frequency, 592 * if a station broadcasts both via satellite and FM. 593 * 594 * The identifiers from VENDOR_START..VENDOR_END range have limited 595 * serialization capabilities: they are serialized locally, but ignored by the 596 * cloud services. If a program has primary id from vendor range, it's not 597 * synchronized with other devices at all. 598 */ 599struct ProgramSelector { 600 /** 601 * Primary program identifier. 602 * 603 * This identifier uniquely identifies a station and can be used for 604 * equality check. 605 * 606 * It can hold only a subset of identifier types, one per each 607 * radio technology: 608 * - analogue AM/FM: AMFM_FREQUENCY; 609 * - FM RDS: RDS_PI; 610 * - HD Radio: HD_STATION_ID_EXT; 611 * - DAB: DAB_SID_EXT; 612 * - Digital Radio Mondiale: DRMO_SERVICE_ID; 613 * - SiriusXM: SXM_SERVICE_ID; 614 * - vendor-specific: VENDOR_START..VENDOR_END. 615 * 616 * The list may change in future versions, so the implementation must obey, 617 * but not rely on it. 618 */ 619 ProgramIdentifier primaryId; 620 621 /** 622 * Secondary program identifiers. 623 * 624 * These identifiers are supplementary and can speed up tuning process, 625 * but the primary ID must be sufficient (i.e. RDS PI is enough to select 626 * a station from the list after a full band scan). 627 * 628 * Two selectors with different secondary IDs, but the same primary ID are 629 * considered equal. In particular, secondary IDs vector may get updated for 630 * an entry on the program list (ie. when a better frequency for a given 631 * station is found). 632 */ 633 vec<ProgramIdentifier> secondaryIds; 634}; 635 636enum MetadataKey : int32_t { 637 /** RDS PS (string) */ 638 RDS_PS = 1, 639 640 /** RDS PTY (uint8_t) */ 641 RDS_PTY, 642 643 /** RBDS PTY (uint8_t) */ 644 RBDS_PTY, 645 646 /** RDS RT (string) */ 647 RDS_RT, 648 649 /** Song title (string) */ 650 SONG_TITLE, 651 652 /** Artist name (string) */ 653 SONG_ARTIST, 654 655 /** Album name (string) */ 656 SONG_ALBUM, 657 658 /** Station icon (uint32_t, see IBroadcastRadio::getImage) */ 659 STATION_ICON, 660 661 /** Album art (uint32_t, see IBroadcastRadio::getImage) */ 662 ALBUM_ART, 663 664 /** 665 * Station name. 666 * 667 * This is a generic field to cover any radio technology. 668 * 669 * If the PROGRAM_NAME has the same content as DAB_*_NAME or RDS_PS, 670 * it may not be present, to preserve space - framework must repopulate 671 * it on the client side. 672 */ 673 PROGRAM_NAME, 674 675 /** DAB ensemble name (string) */ 676 DAB_ENSEMBLE_NAME, 677 678 /** 679 * DAB ensemble name abbreviated (string). 680 * 681 * The string must be up to 8 characters long. 682 * 683 * If the short variant is present, the long (DAB_ENSEMBLE_NAME) one must be 684 * present as well. 685 */ 686 DAB_ENSEMBLE_NAME_SHORT, 687 688 /** DAB service name (string) */ 689 DAB_SERVICE_NAME, 690 691 /** DAB service name abbreviated (see DAB_ENSEMBLE_NAME_SHORT) (string) */ 692 DAB_SERVICE_NAME_SHORT, 693 694 /** DAB component name (string) */ 695 DAB_COMPONENT_NAME, 696 697 /** DAB component name abbreviated (see DAB_ENSEMBLE_NAME_SHORT) (string) */ 698 DAB_COMPONENT_NAME_SHORT, 699}; 700 701/** 702 * An element of metadata vector. 703 * 704 * Contains one of the entries explained in MetadataKey. 705 * 706 * Depending on a type described in the comment for a specific key, either the 707 * intValue or stringValue field must be populated. 708 */ 709struct Metadata { 710 /** 711 * Maps to MetadataKey enum. The enum may be extended in future versions 712 * of the HAL. Values out of the enum range must not be used when writing 713 * and ignored when reading. 714 */ 715 uint32_t key; 716 717 int64_t intValue; 718 string stringValue; 719}; 720 721/** 722 * An update packet of the program list. 723 * 724 * The order of entries in the vectors is unspecified. 725 */ 726struct ProgramListChunk { 727 /** 728 * Treats all previously added entries as removed. 729 * 730 * This is meant to save binder transaction bandwidth on 'removed' vector 731 * and provide a clear empty state. 732 * 733 * If set, 'removed' vector must be empty. 734 * 735 * The client may wait with taking action on this until it received the 736 * chunk with complete flag set (to avoid part of stations temporarily 737 * disappearing from the list). 738 */ 739 bool purge; 740 741 /** 742 * If false, it means there are still programs not transmitted, 743 * due for transmission in following updates. 744 * 745 * Used by UIs that wait for complete list instead of displaying 746 * programs while scanning. 747 * 748 * After the whole channel range was scanned and all discovered programs 749 * were transmitted, the last chunk must have set this flag to true. 750 * This must happen within Constants::LIST_COMPLETE_TIMEOUT_MS from the 751 * startProgramListUpdates call. If it doesn't, client may assume the tuner 752 * came into a bad state and display error message. 753 */ 754 bool complete; 755 756 /** 757 * Added or modified program list entries. 758 * 759 * Two entries with the same primaryId (ProgramSelector member) 760 * are considered the same. 761 */ 762 vec<ProgramInfo> modified; 763 764 /** 765 * Removed program list entries. 766 * 767 * Contains primaryId (ProgramSelector member) of a program to remove. 768 */ 769 vec<ProgramIdentifier> removed; 770}; 771 772/** 773 * Large-grain filter to the program list. 774 * 775 * This is meant to reduce binder transaction bandwidth, not for fine-grained 776 * filtering user might expect. 777 * 778 * The filter is designed as conjunctive normal form: the entry that passes the 779 * filter must satisfy all the clauses (members of this struct). Vector clauses 780 * are disjunctions of literals. In other words, there is AND between each 781 * high-level group and OR inside it. 782 */ 783struct ProgramFilter { 784 /** 785 * List of identifier types that satisfy the filter. 786 * 787 * If the program list entry contains at least one identifier of the type 788 * listed, it satisfies this condition. 789 * 790 * Empty list means no filtering on identifier type. 791 */ 792 vec<uint32_t> identifierTypes; 793 794 /** 795 * List of identifiers that satisfy the filter. 796 * 797 * If the program list entry contains at least one listed identifier, 798 * it satisfies this condition. 799 * 800 * Empty list means no filtering on identifier. 801 */ 802 vec<ProgramIdentifier> identifiers; 803 804 /** 805 * Includes non-tunable entries that define tree structure on the 806 * program list (i.e. DAB ensembles). 807 */ 808 bool includeCategories; 809 810 /** 811 * Disable updates on entry modifications. 812 * 813 * If true, 'modified' vector of ProgramListChunk must contain list 814 * additions only. Once the program is added to the list, it's not 815 * updated anymore. 816 */ 817 bool excludeModifications; 818}; 819 820/** 821 * Type of an announcement. 822 * 823 * It maps to different announcement types per each radio technology. 824 */ 825enum AnnouncementType : uint8_t { 826 /** DAB alarm, RDS emergency program type (PTY 31). */ 827 EMERGENCY = 1, 828 829 /** DAB warning. */ 830 WARNING, 831 832 /** DAB road traffic, RDS TA, HD Radio transportation. */ 833 TRAFFIC, 834 835 /** Weather. */ 836 WEATHER, 837 838 /** News. */ 839 NEWS, 840 841 /** DAB event, special event. */ 842 EVENT, 843 844 /** DAB sport report, RDS sports. */ 845 SPORT, 846 847 /** All others. */ 848 MISC, 849}; 850 851/** 852 * A pointer to a station broadcasting active announcement. 853 */ 854struct Announcement { 855 /** 856 * Program selector to tune to the announcement. 857 */ 858 ProgramSelector selector; 859 860 /** Announcement type. */ 861 AnnouncementType type; 862 863 /** 864 * Vendor-specific information. 865 * 866 * It may be used for extra features, not supported by the platform, 867 * for example: com.me.hdradio.urgency=100; com.me.hdradio.certainity=50. 868 */ 869 vec<VendorKeyValue> vendorInfo; 870}; 871