Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98186473 authored by Eric Laurent's avatar Eric Laurent Committed by Gerrit Code Review
Browse files

Merge "fix pfw criteria generator on S"

parents 1b8e0f7d 958be0d6
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -42,8 +42,8 @@ genrule_defaults {
    cmd: "cp $(locations :audio_policy_configuration_files) $(genDir)/. && " +
    cmd: "cp $(locations :audio_policy_configuration_files) $(genDir)/. && " +
         "cp $(location :audio_policy_configuration_top_file) $(genDir)/audio_policy_configuration.xml && " +
         "cp $(location :audio_policy_configuration_top_file) $(genDir)/audio_policy_configuration.xml && " +
         "$(location buildPolicyCriterionTypes.py) " +
         "$(location buildPolicyCriterionTypes.py) " +
         // @todo update if 1428659 is merged "--androidaudiobaseheader $(location :android_audio_base_header_file) " +
         " --androidaudiobaseheader $(location :libaudio_system_audio_base) " +
         " --androidaudiobaseheader system/media/audio/include/system/audio-base.h " +
         " --androidaudiocommonbaseheader $(location :libaudio_system_audio_common_base) " +
         "--audiopolicyconfigurationfile $(genDir)/audio_policy_configuration.xml " +
         "--audiopolicyconfigurationfile $(genDir)/audio_policy_configuration.xml " +
         "--criteriontypes $(location :audio_policy_engine_criterion_types_template) " +
         "--criteriontypes $(location :audio_policy_engine_criterion_types_template) " +
         "--outputfile $(out)",
         "--outputfile $(out)",
@@ -51,6 +51,8 @@ genrule_defaults {
        // The commented inputs must be provided to use this genrule_defaults
        // The commented inputs must be provided to use this genrule_defaults
        // @todo uncomment if 1428659 is merged":android_audio_base_header_file",
        // @todo uncomment if 1428659 is merged":android_audio_base_header_file",
        ":audio_policy_engine_criterion_types_template",
        ":audio_policy_engine_criterion_types_template",
        ":libaudio_system_audio_base",
        ":libaudio_system_audio_common_base",
        // ":audio_policy_configuration_top_file",
        // ":audio_policy_configuration_top_file",
        // ":audio_policy_configuration_files",
        // ":audio_policy_configuration_files",
    ],
    ],
+86 −16
Original line number Original line Diff line number Diff line
@@ -55,6 +55,11 @@ def parseArgs():
                           metavar="ANDROID_AUDIO_BASE_HEADER",
                           metavar="ANDROID_AUDIO_BASE_HEADER",
                           type=argparse.FileType('r'),
                           type=argparse.FileType('r'),
                           required=True)
                           required=True)
    argparser.add_argument('--androidaudiocommonbaseheader',
                           help="Android Audio CommonBase C header file, Mandatory.",
                           metavar="ANDROID_AUDIO_COMMON_BASE_HEADER",
                           type=argparse.FileType('r'),
                           required=True)
    argparser.add_argument('--audiopolicyconfigurationfile',
    argparser.add_argument('--audiopolicyconfigurationfile',
                           help="Android Audio Policy Configuration file, Mandatory.",
                           help="Android Audio Policy Configuration file, Mandatory.",
                           metavar="(AUDIO_POLICY_CONFIGURATION_FILE)",
                           metavar="(AUDIO_POLICY_CONFIGURATION_FILE)",
@@ -176,12 +181,12 @@ def parseAndroidAudioPolicyConfigurationFile(audiopolicyconfigurationfile):
#   -Output devices type
#   -Output devices type
#   -Input devices type
#   -Input devices type
#
#
def parseAndroidAudioFile(androidaudiobaseheaderFile):
def parseAndroidAudioFile(androidaudiobaseheaderFile, androidaudiocommonbaseheaderFile):
    #
    #
    # Adaptation table between Android Enumeration prefix and Audio PFW Criterion type names
    # Adaptation table between Android Enumeration prefix and Audio PFW Criterion type names
    #
    #
    criterion_mapping_table = {
    criterion_mapping_table = {
        'AUDIO_MODE' : "AndroidModeType",
        'HAL_AUDIO_MODE' : "AndroidModeType",
        'AUDIO_DEVICE_OUT' : "OutputDevicesMaskType",
        'AUDIO_DEVICE_OUT' : "OutputDevicesMaskType",
        'AUDIO_DEVICE_IN' : "InputDevicesMaskType"}
        'AUDIO_DEVICE_IN' : "InputDevicesMaskType"}


@@ -196,9 +201,9 @@ def parseAndroidAudioFile(androidaudiobaseheaderFile):
    ignored_values = ['CNT', 'MAX', 'ALL', 'NONE']
    ignored_values = ['CNT', 'MAX', 'ALL', 'NONE']


    criteria_pattern = re.compile(
    criteria_pattern = re.compile(
        r"\s*(?P<type>(?:"+'|'.join(criterion_mapping_table.keys()) + "))_" \
        r"\s*V\((?P<type>(?:"+'|'.join(criterion_mapping_table.keys()) + "))_" \
        r"(?P<literal>(?!" + '|'.join(ignored_values) + ")\w*)\s*=\s*" \
        r"(?P<literal>(?!" + '|'.join(ignored_values) + ")\w*)\s*,\s*" \
        r"(?P<values>(?:0[xX])?[0-9a-fA-F]+)")
        r"(?:AUDIO_DEVICE_BIT_IN \| )?(?P<values>(?:0[xX])?[0-9a-fA-F]+|[0-9]+)")


    logging.info("Checking Android Header file {}".format(androidaudiobaseheaderFile))
    logging.info("Checking Android Header file {}".format(androidaudiobaseheaderFile))


@@ -209,27 +214,91 @@ def parseAndroidAudioFile(androidaudiobaseheaderFile):
                androidaudiobaseheaderFile.name, line_number, line))
                androidaudiobaseheaderFile.name, line_number, line))


            criterion_name = criterion_mapping_table[match.groupdict()['type']]
            criterion_name = criterion_mapping_table[match.groupdict()['type']]
            literal = ''.join((w.capitalize() for w in match.groupdict()['literal'].split('_')))
            criterion_literal = \
            numerical_value = match.groupdict()['values']
                ''.join((w.capitalize() for w in match.groupdict()['literal'].split('_')))
            criterion_numerical_value = match.groupdict()['values']


            # for AUDIO_DEVICE_IN: need to remove sign bit
            # for AUDIO_DEVICE_IN: need to remove sign bit / rename default to stub
            if criterion_name == "InputDevicesMaskType":
            if criterion_name == "InputDevicesMaskType":
                numerical_value = str(int(numerical_value, 0) & ~2147483648)
                if criterion_literal == "Default":
                    criterion_numerical_value = str(int("0x40000000", 0))
                else:
                    try:
                        string_int = int(criterion_numerical_value, 0)
                    except ValueError:
                        # Handle the exception
                        logging.info("value {}:{} for criterion {} is not a number, ignoring"
                            .format(criterion_numerical_value, criterion_literal, criterion_name))
                        continue
                    criterion_numerical_value = str(int(criterion_numerical_value, 0) & ~2147483648)

            if criterion_name == "OutputDevicesMaskType":
                if criterion_literal == "Default":
                    criterion_numerical_value = str(int("0x40000000", 0))

            try:
                string_int = int(criterion_numerical_value, 0)
            except ValueError:
                # Handle the exception
                logging.info("The value {}:{} is for criterion {} is not a number, ignoring"
                    .format(criterion_numerical_value, criterion_literal, criterion_name))
                continue

            # Remove duplicated numerical values
            if int(criterion_numerical_value, 0) in all_criteria[criterion_name].values():
                logging.info("criterion {} duplicated values:".format(criterion_name))
                logging.info("{}:{}".format(criterion_numerical_value, criterion_literal))
                logging.info("KEEPING LATEST")
                for key in list(all_criteria[criterion_name]):
                    if all_criteria[criterion_name][key] == int(criterion_numerical_value, 0):
                        del all_criteria[criterion_name][key]

            all_criteria[criterion_name][criterion_literal] = int(criterion_numerical_value, 0)

            logging.debug("type:{},".format(criterion_name))
            logging.debug("iteral:{},".format(criterion_literal))
            logging.debug("values:{}.".format(criterion_numerical_value))

    logging.info("Checking Android Common Header file {}".format(androidaudiocommonbaseheaderFile))

    criteria_pattern = re.compile(
        r"\s*(?P<type>(?:"+'|'.join(criterion_mapping_table.keys()) + "))_" \
        r"(?P<literal>(?!" + '|'.join(ignored_values) + ")\w*)\s*=\s*" \
        r"(?:AUDIO_DEVICE_BIT_IN \| )?(?P<values>(?:0[xX])?[0-9a-fA-F]+|[0-9]+)")

    for line_number, line in enumerate(androidaudiocommonbaseheaderFile):
        match = criteria_pattern.match(line)
        if match:
            logging.debug("The following line is VALID: {}:{}\n{}".format(
                androidaudiocommonbaseheaderFile.name, line_number, line))

            criterion_name = criterion_mapping_table[match.groupdict()['type']]
            criterion_literal = \
                ''.join((w.capitalize() for w in match.groupdict()['literal'].split('_')))
            criterion_numerical_value = match.groupdict()['values']

            try:
                string_int = int(criterion_numerical_value, 0)
            except ValueError:
                # Handle the exception
                logging.info("The value {}:{} is for criterion {} is not a number, ignoring"
                    .format(criterion_numerical_value, criterion_literal, criterion_name))
                continue


            # Remove duplicated numerical values
            # Remove duplicated numerical values
            if int(numerical_value, 0) in all_criteria[criterion_name].values():
            if int(criterion_numerical_value, 0) in all_criteria[criterion_name].values():
                logging.info("criterion {} duplicated values:".format(criterion_name))
                logging.info("criterion {} duplicated values:".format(criterion_name))
                logging.info("{}:{}".format(numerical_value, literal))
                logging.info("{}:{}".format(criterion_numerical_value, criterion_literal))
                logging.info("KEEPING LATEST")
                logging.info("KEEPING LATEST")
                for key in list(all_criteria[criterion_name]):
                for key in list(all_criteria[criterion_name]):
                    if all_criteria[criterion_name][key] == int(numerical_value, 0):
                    if all_criteria[criterion_name][key] == int(criterion_numerical_value, 0):
                        del all_criteria[criterion_name][key]
                        del all_criteria[criterion_name][key]


            all_criteria[criterion_name][literal] = int(numerical_value, 0)
            all_criteria[criterion_name][criterion_literal] = int(criterion_numerical_value, 0)


            logging.debug("type:{},".format(criterion_name))
            logging.debug("type:{},".format(criterion_name))
            logging.debug("iteral:{},".format(literal))
            logging.debug("iteral:{},".format(criterion_literal))
            logging.debug("values:{}.".format(numerical_value))
            logging.debug("values:{}.".format(criterion_numerical_value))


    return all_criteria
    return all_criteria


@@ -238,7 +307,8 @@ def main():
    logging.root.setLevel(logging.INFO)
    logging.root.setLevel(logging.INFO)
    args = parseArgs()
    args = parseArgs()


    all_criteria = parseAndroidAudioFile(args.androidaudiobaseheader)
    all_criteria = parseAndroidAudioFile(args.androidaudiobaseheader,
                                         args.androidaudiocommonbaseheader)


    address_criteria = parseAndroidAudioPolicyConfigurationFile(args.audiopolicyconfigurationfile)
    address_criteria = parseAndroidAudioPolicyConfigurationFile(args.audiopolicyconfigurationfile)