Allow secondary ids missing for DAB selector
Sometimes DAB program selector used in tuning does not have secondary identifiers such as ensemble and frequency, and HAL will automatically selector a DAB station with specified ensemble and frequency. Thus, secondary ids in DAB program selector are not mandatory in HAL. Also updated broadcast radio AIDL HAL documentation. Bug: 273804622 Test: atest VtsHalBroadcastradioAidlTargetTest Change-Id: If05b7eeb79e299667c3a64bf8b931bb6396f9045
This commit is contained in:
parent
2da977681b
commit
64cb963141
6 changed files with 49 additions and 39 deletions
|
@ -73,14 +73,15 @@ parcelable AmFmRegionConfig {
|
|||
/**
|
||||
* De-emphasis filter supported/configured.
|
||||
*
|
||||
* It is a bitset of de-emphasis values (DEEMPHASIS_D50 and DEEMPHASIS_D75).
|
||||
* It can be a combination of de-emphasis values ({@link #DEEMPHASIS_D50} and
|
||||
* {@link #DEEMPHASIS_D75}).
|
||||
*/
|
||||
int fmDeemphasis;
|
||||
|
||||
/**
|
||||
* RDS/RBDS variant supported/configured.
|
||||
*
|
||||
* It is a bitset of RDS values (RDS and RBDS).
|
||||
* It can be a combination of RDS values ({@link #RDS} and {@link #RBDS}).
|
||||
*/
|
||||
int fmRds;
|
||||
}
|
||||
|
|
|
@ -150,6 +150,10 @@ parcelable ProgramInfo {
|
|||
|
||||
/**
|
||||
* Program flags.
|
||||
*
|
||||
* It can be a combination of {@link #FLAG_LIVE}, {@link #FLAG_MUTED},
|
||||
* {@link #FLAG_TRAFFIC_PROGRAM}, {@link #FLAG_TRAFFIC_ANNOUNCEMENT},
|
||||
* {@link #FLAG_TUNABLE}, and {@link #FLAG_STEREO}.
|
||||
*/
|
||||
int infoFlags;
|
||||
|
||||
|
|
|
@ -51,8 +51,7 @@ parcelable ProgramSelector {
|
|||
* - analogue AM/FM: AMFM_FREQUENCY_KHZ;
|
||||
* - FM RDS: RDS_PI;
|
||||
* - HD Radio: HD_STATION_ID_EXT;
|
||||
* - DAB/DMB: DAB_SID_EXT (when used, DAB_ENSEMBLE and DAB_FREQUENCY_KHZ
|
||||
* must present in secondaryIds);
|
||||
* - DAB/DMB: DAB_SID_EXT;
|
||||
* - Digital Radio Mondiale: DRMO_SERVICE_ID;
|
||||
* - SiriusXM: SXM_SERVICE_ID;
|
||||
* - vendor-specific: VENDOR_START..VENDOR_END.
|
||||
|
@ -63,13 +62,16 @@ parcelable ProgramSelector {
|
|||
* Secondary program identifiers.
|
||||
*
|
||||
* These identifiers are supplementary and can speed up tuning process,
|
||||
* but the primary ID must be sufficient (i.e. RDS PI is enough to select
|
||||
* but the primary ID should be sufficient (i.e. RDS PI is enough to select
|
||||
* a station from the list after a full band scan).
|
||||
*
|
||||
* Two selectors with different secondary IDs, but the same primary ID are
|
||||
* considered equal. In particular, secondary IDs array may get updated for
|
||||
* an entry on the program list (ie. when a better frequency for a given
|
||||
* station is found).
|
||||
*
|
||||
* If DAB_SID_EXT is used as primaryId, using DAB_ENSEMBLE or DAB_FREQUENCY_KHZ
|
||||
* as secondray identifiers can uniquely identify the DAB station.
|
||||
*/
|
||||
ProgramIdentifier[] secondaryIds;
|
||||
}
|
||||
|
|
|
@ -589,10 +589,11 @@ binder_status_t BroadcastRadio::cmdTune(int fd, const char** args, uint32_t numA
|
|||
}
|
||||
ProgramSelector sel = {};
|
||||
if (isDab) {
|
||||
if (numArgs != 5) {
|
||||
if (numArgs != 5 && numArgs != 3) {
|
||||
dprintf(fd,
|
||||
"Invalid number of arguments: please provide "
|
||||
"--tune dab <SID> <ENSEMBLE> <FREQUENCY>\n");
|
||||
"--tune dab <SID> <ENSEMBLE> <FREQUENCY> or "
|
||||
"--tune dab <SID>\n");
|
||||
return STATUS_BAD_VALUE;
|
||||
}
|
||||
int sid;
|
||||
|
@ -600,17 +601,21 @@ binder_status_t BroadcastRadio::cmdTune(int fd, const char** args, uint32_t numA
|
|||
dprintf(fd, "Non-integer sid provided with tune: %s\n", args[2]);
|
||||
return STATUS_BAD_VALUE;
|
||||
}
|
||||
int ensemble;
|
||||
if (!utils::parseArgInt(string(args[3]), &ensemble)) {
|
||||
dprintf(fd, "Non-integer ensemble provided with tune: %s\n", args[3]);
|
||||
return STATUS_BAD_VALUE;
|
||||
if (numArgs == 3) {
|
||||
sel = utils::makeSelectorDab(sid);
|
||||
} else {
|
||||
int ensemble;
|
||||
if (!utils::parseArgInt(string(args[3]), &ensemble)) {
|
||||
dprintf(fd, "Non-integer ensemble provided with tune: %s\n", args[3]);
|
||||
return STATUS_BAD_VALUE;
|
||||
}
|
||||
int freq;
|
||||
if (!utils::parseArgInt(string(args[4]), &freq)) {
|
||||
dprintf(fd, "Non-integer frequency provided with tune: %s\n", args[4]);
|
||||
return STATUS_BAD_VALUE;
|
||||
}
|
||||
sel = utils::makeSelectorDab(sid, ensemble, freq);
|
||||
}
|
||||
int freq;
|
||||
if (!utils::parseArgInt(string(args[4]), &freq)) {
|
||||
dprintf(fd, "Non-integer frequency provided with tune: %s\n", args[4]);
|
||||
return STATUS_BAD_VALUE;
|
||||
}
|
||||
sel = utils::makeSelectorDab(sid, ensemble, freq);
|
||||
} else {
|
||||
if (numArgs != 3) {
|
||||
dprintf(fd, "Invalid number of arguments: please provide --tune amfm <FREQUENCY>\n");
|
||||
|
|
|
@ -136,9 +136,18 @@ bool tunesTo(const ProgramSelector& a, const ProgramSelector& b) {
|
|||
return getHdSubchannel(b) == 0 &&
|
||||
haveEqualIds(a, b, IdentifierType::AMFM_FREQUENCY_KHZ);
|
||||
case IdentifierType::DAB_SID_EXT:
|
||||
return haveEqualIds(a, b, IdentifierType::DAB_SID_EXT) &&
|
||||
haveEqualIds(a, b, IdentifierType::DAB_ENSEMBLE) &&
|
||||
haveEqualIds(a, b, IdentifierType::DAB_FREQUENCY_KHZ);
|
||||
if (!haveEqualIds(a, b, IdentifierType::DAB_SID_EXT)) {
|
||||
return false;
|
||||
}
|
||||
if (hasId(a, IdentifierType::DAB_ENSEMBLE) &&
|
||||
!haveEqualIds(a, b, IdentifierType::DAB_ENSEMBLE)) {
|
||||
return false;
|
||||
}
|
||||
if (hasId(a, IdentifierType::DAB_FREQUENCY_KHZ) &&
|
||||
!haveEqualIds(a, b, IdentifierType::DAB_FREQUENCY_KHZ)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
case IdentifierType::DRMO_SERVICE_ID:
|
||||
return haveEqualIds(a, b, IdentifierType::DRMO_SERVICE_ID);
|
||||
case IdentifierType::SXM_SERVICE_ID:
|
||||
|
@ -289,25 +298,7 @@ bool isValid(const ProgramSelector& sel) {
|
|||
sel.primaryId.type > IdentifierType::VENDOR_END)) {
|
||||
return false;
|
||||
}
|
||||
if (!isValid(sel.primaryId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isDab = sel.primaryId.type == IdentifierType::DAB_SID_EXT;
|
||||
bool hasDabEnsemble = false;
|
||||
bool hasDabFrequency = false;
|
||||
for (auto it = sel.secondaryIds.begin(); it != sel.secondaryIds.end(); it++) {
|
||||
if (!isValid(*it)) {
|
||||
return false;
|
||||
}
|
||||
if (isDab && it->type == IdentifierType::DAB_ENSEMBLE) {
|
||||
hasDabEnsemble = true;
|
||||
}
|
||||
if (isDab && it->type == IdentifierType::DAB_FREQUENCY_KHZ) {
|
||||
hasDabFrequency = true;
|
||||
}
|
||||
}
|
||||
return !isDab || (hasDabEnsemble && hasDabFrequency);
|
||||
return isValid(sel.primaryId);
|
||||
}
|
||||
|
||||
ProgramIdentifier makeIdentifier(IdentifierType type, int64_t value) {
|
||||
|
@ -320,6 +311,12 @@ ProgramSelector makeSelectorAmfm(int32_t frequency) {
|
|||
return sel;
|
||||
}
|
||||
|
||||
ProgramSelector makeSelectorDab(int64_t sidExt) {
|
||||
ProgramSelector sel = {};
|
||||
sel.primaryId = makeIdentifier(IdentifierType::DAB_SID_EXT, sidExt);
|
||||
return sel;
|
||||
}
|
||||
|
||||
ProgramSelector makeSelectorDab(int64_t sidExt, int32_t ensemble, int64_t freq) {
|
||||
ProgramSelector sel = {};
|
||||
sel.primaryId = makeIdentifier(IdentifierType::DAB_SID_EXT, sidExt);
|
||||
|
|
|
@ -138,6 +138,7 @@ bool isValid(const ProgramSelector& sel);
|
|||
|
||||
ProgramIdentifier makeIdentifier(IdentifierType type, int64_t value);
|
||||
ProgramSelector makeSelectorAmfm(int32_t frequency);
|
||||
ProgramSelector makeSelectorDab(int64_t sidExt);
|
||||
ProgramSelector makeSelectorDab(int64_t sidExt, int32_t ensemble, int64_t freq);
|
||||
|
||||
bool satisfies(const ProgramFilter& filter, const ProgramSelector& sel);
|
||||
|
|
Loading…
Reference in a new issue