| #include "AudioParamParser.h" | 
 | #include "AudioParamParserPriv.h" | 
 |  | 
 | #include <stdio.h> | 
 | #include <string.h> | 
 |  | 
 | #define BUF_SIZE 1024 | 
 |  | 
 | void showParamValue(Param *param) | 
 | { | 
 |     switch (param->paramInfo->dataType) | 
 |     { | 
 |         case TYPE_STR: | 
 |         { | 
 |             char *value = (char *)param->data; | 
 |             printf("param name = %s, value = %s (type = %s)\n", param->name, value, paramDataTypeToStr(param->paramInfo->dataType)); | 
 |             break; | 
 |         } | 
 |         case TYPE_INT: | 
 |         { | 
 |             int value = *(int *) param->data; | 
 |             printf("param name = %s, value = %d (type = %s)\n", param->name, value, paramDataTypeToStr(param->paramInfo->dataType)); | 
 |             break; | 
 |         } | 
 |         case TYPE_UINT: | 
 |         { | 
 |             unsigned int value = *(unsigned int *) param->data; | 
 |             printf("param name = %s, value = %d (type = %s)\n", param->name, value, paramDataTypeToStr(param->paramInfo->dataType)); | 
 |             break; | 
 |         } | 
 |         case TYPE_FLOAT: | 
 |         { | 
 |             float value = *(float *) param->data; | 
 |             /* JH's platform cannot show the float type, wei chiu could show the value by %f*/ | 
 |             printf("param name = %s, value = %d (type = %s)\n", param->name, (int)value, paramDataTypeToStr(param->paramInfo->dataType)); | 
 |             break; | 
 |         } | 
 |         case TYPE_BYTE_ARRAY: | 
 |         { | 
 |             char *byteArray = (char *)param->data; | 
 |             int arraySize = param->arraySize; | 
 |             int i = 0; | 
 |             printf("param name = %s (type = %s, size = %d)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType), arraySize); | 
 |             for (i = 0; i < arraySize; i++) | 
 |             { | 
 |                 printf("\tarray[%d] %d\n", i, byteArray[i]); | 
 |             } | 
 |             break; | 
 |         } | 
 |         case TYPE_UBYTE_ARRAY: | 
 |         { | 
 |             unsigned char *ubyteArray = (unsigned char *)param->data; | 
 |             int arraySize = param->arraySize; | 
 |             int i = 0; | 
 |             printf("param name = %s (type = %s, size = %d)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType), arraySize); | 
 |             for (i = 0; i < arraySize; i++) | 
 |             { | 
 |                 printf("\tarray[%d] 0x%x\n", i, ubyteArray[i]); | 
 |             } | 
 |             break; | 
 |         } | 
 |         case TYPE_SHORT_ARRAY: | 
 |         { | 
 |             short *shortArray = (short *)param->data; | 
 |             int arraySize = param->arraySize; | 
 |             int i = 0; | 
 |             printf("param name = %s (type = %s, size = %d)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType), arraySize); | 
 |             for (i = 0; i < arraySize; i++) | 
 |             { | 
 |                 printf("\tarray[%d] %d\n", i, shortArray[i]); | 
 |             } | 
 |             break; | 
 |         } | 
 |         case TYPE_USHORT_ARRAY: | 
 |         { | 
 |             unsigned short *ushortArray = (unsigned short *)param->data; | 
 |             int arraySize = param->arraySize; | 
 |             int i = 0; | 
 |             printf("param name = %s (type = %s, size = %d)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType), arraySize); | 
 |             for (i = 0; i < arraySize; i++) | 
 |             { | 
 |                 printf("\tarray[%d] 0x%x\n", i, ushortArray[i]); | 
 |             } | 
 |             break; | 
 |         } | 
 |         case TYPE_INT_ARRAY: | 
 |         { | 
 |             int *intArray = (int *)param->data; | 
 |             int arraySize = param->arraySize; | 
 |             int i = 0; | 
 |             printf("param name = %s (type = %s, size = %d)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType), arraySize); | 
 |             for (i = 0; i < arraySize; i++) | 
 |             { | 
 |                 printf("\tarray[%d] %d\n", i, intArray[i]); | 
 |             } | 
 |             break; | 
 |         } | 
 |         case TYPE_UINT_ARRAY: | 
 |         { | 
 |             unsigned int *uintArray = (unsigned int *)param->data; | 
 |             int arraySize = param->arraySize; | 
 |             int i = 0; | 
 |             printf("param name = %s (type = %s, size = %d)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType), arraySize); | 
 |             for (i = 0; i < arraySize; i++) | 
 |             { | 
 |                 printf("\tarray[%d] 0x%x\n", i, uintArray[i]); | 
 |             } | 
 |             break; | 
 |         } | 
 |         case TYPE_DOUBLE_ARRAY: | 
 |         { | 
 |             double *doubleArray = (double *)param->data; | 
 |             int arraySize = param->arraySize; | 
 |             int i = 0; | 
 |             printf("param name = %s (type = %s, size = %d)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType), arraySize); | 
 |             for (i = 0; i < arraySize; i++) | 
 |             { | 
 |                 printf("\tarray[%d] %f\n", i, doubleArray[i]); | 
 |             } | 
 |             break; | 
 |         } | 
 |         default: | 
 |             printf("param name = %s, value = 0x%p (type = %s)\n", param->name, param->data, paramDataTypeToStr(param->paramInfo->dataType)); | 
 |     } | 
 | } | 
 |  | 
 | void showFieldValueOfParam(Param *param) | 
 | { | 
 |     // Enum all field value | 
 |     size_t i; | 
 |     ParamInfo *paramInfo = audioTypeGetParamInfoByName(param->paramUnit->audioType, param->name); | 
 |     unsigned int val; | 
 |     size_t numOfFieldInfo; | 
 |  | 
 |     printf("\t---------------------\n"); | 
 |     numOfFieldInfo = paramInfoGetNumOfFieldInfo(paramInfo); | 
 |     for (i = 0; i < numOfFieldInfo; i++) | 
 |     { | 
 |  | 
 |         FieldInfo *fieldInfo = paramInfoGetFieldInfoByIndex(paramInfo, i); | 
 |         if (paramGetFieldVal(param, fieldInfo, &val) == APP_ERROR) | 
 |         { | 
 |             printf("Cannot get field value. (param name=%s, field name=%s)\n", param->name, fieldInfo->name); | 
 |             continue; | 
 |         } | 
 |  | 
 |         printf("\tfield[%lu] name = %s, value = 0x%u.\n", i, fieldInfo->name, val); | 
 |     } | 
 | } | 
 |  | 
 | void showFieldInfo(FieldInfo *fieldInfo) | 
 | { | 
 |     if (!fieldInfo) | 
 |     { | 
 |         return; | 
 |     } | 
 |  | 
 |     printf("FieldInfo name = %s, array_index = %lu, bit[%d,%d], check_list = %s\n", fieldInfo->name, fieldInfo->arrayIndex, fieldInfo->startBit, fieldInfo->endBit, fieldInfo->checkListStr); | 
 | } | 
 |  | 
 | void showParamInfo(ParamInfo *paramInfo) | 
 | { | 
 |     size_t i; | 
 |     size_t numOfFieldInfo = paramInfoGetNumOfFieldInfo(paramInfo); | 
 |  | 
 |     printf("ParamInfo name = %s, type = %s\n", paramInfo->name, paramDataTypeToStr(paramInfo->dataType)); | 
 |     for (i = 0; i < numOfFieldInfo; i++) | 
 |     { | 
 |         FieldInfo *fieldInfo = paramInfoGetFieldInfoByIndex(paramInfo, i); | 
 |         if (fieldInfo) | 
 |         { | 
 |             printf("\t[%lu] ", i); | 
 |             showFieldInfo(fieldInfo); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | #if 0 | 
 | void showCategoryTypeList(AudioType *audioType) | 
 | { | 
 |     xmlNode *categoryTypeListNode, *categoryTypeNode, *categoryNode, *subCategoryNode; | 
 |  | 
 |     printf("\n====Dump \"%s\" AudioType CategoryList Info====\n", audioType->name); | 
 |     categoryTypeListNode = audioTypeGetCategoryTypeListNode(audioType); | 
 |     if (!categoryTypeListNode) | 
 |     { | 
 |         printf("No category type list node!\n"); | 
 |         return; | 
 |     } | 
 |  | 
 |     categoryTypeNode = categoryTypeListNode->children; | 
 |  | 
 |     while ((categoryTypeNode = findXmlNodeByElemName(categoryTypeNode->next, ELEM_CATEGORY_TYPE))) | 
 |     { | 
 |         printf("CategoryType, wording = %s, name = %s\n", xmlNodeGetWording(categoryTypeNode), xmlNodeGetProp(categoryTypeNode, ATTRI_NAME)); | 
 |  | 
 |         categoryNode = categoryTypeNode->children; | 
 |         for (categoryNode = categoryTypeNode->children; categoryNode; categoryNode = categoryNode->next) | 
 |         { | 
 |             if (!strcmp((char *)categoryNode->name, ELEM_CATEGORY)) | 
 |             { | 
 |                 // Show Category | 
 |                 printf("\t%s wording = %s (name = %s)\n", categoryNode->name, xmlNodeGetWording(categoryNode), xmlNodeGetProp(categoryNode, ATTRI_NAME)); | 
 |             } | 
 |             else if (!strcmp((char *)categoryNode->name, ELEM_CATEGORY_GROUP)) | 
 |             { | 
 |                 // Show CategoryGroup | 
 |                 printf("\t%s wording = %s (name = %s)\n", categoryNode->name, xmlNodeGetWording(categoryNode), xmlNodeGetProp(categoryNode, ATTRI_NAME)); | 
 |  | 
 |                 // Show Category's sub category | 
 |                 for (subCategoryNode = categoryNode->children; subCategoryNode; subCategoryNode = subCategoryNode->next) | 
 |                 { | 
 |                     if (!strcmp((char *)subCategoryNode->name, ELEM_CATEGORY)) | 
 |                     { | 
 |                         printf("\t\t%s wording = %s (name = %s)\n", subCategoryNode->name, xmlNodeGetWording(subCategoryNode), xmlNodeGetProp(subCategoryNode, ATTRI_NAME)); | 
 |                     } | 
 |                 } | 
 |             } | 
 |         } | 
 |     } | 
 | } | 
 | #else | 
 | void showCategoryTypeList(AudioType *audioType) | 
 | { | 
 |     size_t i, j, k; | 
 |     size_t numOfCategory; | 
 |     size_t numOfCategoryType = audioTypeGetNumOfCategoryType(audioType); | 
 |  | 
 |     printf("\n====%s AudioType's Category====\n\n", audioType->name); | 
 |     for (i = 0; i < numOfCategoryType; i++) | 
 |     { | 
 |         CategoryType *categoryType = audioTypeGetCategoryTypeByIndex(audioType, i); | 
 |  | 
 |         /* Show CategoryGroup part */ | 
 |         size_t numOfCategoryGroup = categoryTypeGetNumOfCategoryGroup(categoryType); | 
 |         printf("CategoryType[%zu] name = %s wording = %s %s\n", i, categoryType->name, categoryType->wording, categoryType->visible ? "" : "visible = 0"); | 
 |         for (j = 0; j < numOfCategoryGroup; j++) | 
 |         { | 
 |             /* Show CategoryGroup's category */ | 
 |             CategoryGroup *categoryGroup = categoryTypeGetCategoryGroupByIndex(categoryType, j); | 
 |             size_t numOfCategory = categoryGroupGetNumOfCategory(categoryGroup); | 
 |             printf("\tCategoryGroup[%zu] name = %s wording = %s %s\n", j, categoryGroup->name, categoryGroup->wording, categoryGroup->visible ? "" : "visible = 0"); | 
 |             for (k = 0; k < numOfCategory; k++) | 
 |             { | 
 |                 Category *category = categoryGroupGetCategoryByIndex(categoryGroup, k); | 
 |                 printf("\t\tCategory[%zu] name = %s wording = %s %s\n", k , category->name, category->wording, category->visible ? "" : "visible = 0"); | 
 |             } | 
 |         } | 
 |  | 
 |         /* Show CategoryType's category */ | 
 |         numOfCategory = categoryTypeGetNumOfCategory(categoryType); | 
 |         for (k = 0; k < numOfCategory; k++) | 
 |         { | 
 |             Category *category = categoryTypeGetCategoryByIndex(categoryType, k); | 
 |             printf("\tCategory[%zu] name = %s wording = %s %s\n", k , category->name, category->wording, category->visible ? "" : "visible = 0"); | 
 |         } | 
 |     } | 
 | } | 
 | #endif | 
 |  | 
 | void showParamFieldInfo(AudioType *audioType) | 
 | { | 
 |     int i; | 
 |     int numOfParamInfo; | 
 |     ParamInfo *paramInfo; | 
 |  | 
 |     /* Enum all param & it's field information */ | 
 |     numOfParamInfo = audioTypeGetNumOfParamInfo(audioType); | 
 |     printf("\n====%s AudioType's param field info====\n\n", audioType->name); | 
 |     for (i = 0; i < numOfParamInfo; i++) | 
 |     { | 
 |         paramInfo = audioTypeGetParamInfoByIndex(audioType, i); | 
 |         printf("[%d] ", i); | 
 |         showParamInfo(paramInfo); | 
 |     } | 
 | } | 
 |  | 
 | void showParamTreeViewInfo(AudioType *audioType) | 
 | { | 
 |     printf("\n====%s AudioType's param tree view info====\n\n", audioType->name); | 
 |     if (!audioType->paramTreeView) | 
 |     { | 
 |         printf("No definition!\n"); | 
 |         return; | 
 |     } | 
 |  | 
 |     printf("ParamTreeView version(%d.%d)\n", audioType->paramTreeView->verMaj, audioType->paramTreeView->verMin); | 
 |     if (audioType->paramTreeView->treeRootHash) | 
 |     { | 
 |         TreeRoot *treeRoot; | 
 |         Feature *feature; | 
 |         FeatureField *featureField; | 
 |         CategoryPath *categoryPath; | 
 |         size_t i = 0; | 
 |         /* Enum all TreeRoot */ | 
 |         for (treeRoot = audioType->paramTreeView->treeRootHash; treeRoot ; treeRoot = treeRoot->hh.next) | 
 |         { | 
 |  | 
 |             printf("+TreeRoot[%d] name = %s\n", i++, treeRoot->name); | 
 |             if (treeRoot->switchFieldInfo) | 
 |             { | 
 |                 printf("  +switch (audio_type = %s, param = %s, field = %s)\n", | 
 |                        treeRoot->switchFieldInfo ? treeRoot->switchFieldInfo->paramInfo->audioType->name : "", | 
 |                        treeRoot->switchFieldInfo ? treeRoot->switchFieldInfo->paramInfo->name : "", | 
 |                        treeRoot->switchFieldInfo ? treeRoot->switchFieldInfo->name : ""); | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("  +no switch\n"); | 
 |             } | 
 |  | 
 |             /* Enum all Feature */ | 
 |             for (feature = treeRoot->featureHash; feature ; feature = feature->hh.next) | 
 |             { | 
 |                 printf("  +Feature name = %s, feature_option = %s(val = %s), switch (audio_type = %s, param = %s, field = %s)\n", feature->name, | 
 |                        feature->featureOption, | 
 |                        appHandleGetFeatureOptionValue(audioType->appHandle, feature->featureOption), | 
 |                        feature->switchFieldInfo ? feature->switchFieldInfo->paramInfo->audioType->name : "null", | 
 |                        feature->switchFieldInfo ? feature->switchFieldInfo->paramInfo->name : "null", | 
 |                        feature->switchFieldInfo ? feature->switchFieldInfo->name : "null"); | 
 |  | 
 |                 /* Enum all field */ | 
 |                 for (featureField = feature->featureFieldHash; featureField ; featureField = featureField->hh.next) | 
 |                 { | 
 |                     printf("    +Field audio_type = %s, param = %s, name = %s\n", | 
 |                            featureField->fieldInfo->paramInfo->audioType->name, | 
 |                            featureField->fieldInfo->paramInfo->name, | 
 |                            featureField->fieldInfo->name); | 
 |                 } | 
 |  | 
 |                 /* Enum all category path */ | 
 |                 for (categoryPath = feature->categoryPathHash; categoryPath ; categoryPath = categoryPath->hh.next) | 
 |                 { | 
 |                     printf("    +CategoryPath path = %s\n", categoryPath->path); | 
 |                 } | 
 |             } | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | void showParamUnit(AudioType *audioType, const char *categoryPath) | 
 | { | 
 |     int i; | 
 |     int numOfParam; | 
 |     Param *param; | 
 |     ParamUnit *paramUnit = audioTypeGetParamUnit(audioType, categoryPath); | 
 |     if (paramUnit == NULL) | 
 |     { | 
 |         printf("Cannot find ParamUnit.\n"); | 
 |         return; | 
 |     } | 
 |  | 
 |  | 
 |     /* Example: provide retrieve all param ways */ | 
 |     numOfParam = paramUnitGetNumOfParam(paramUnit); | 
 |     printf("\n\n====Query all param unit's param (param unit id = %d)====\n", paramUnit->paramId); | 
 |     for (i = 0; i < numOfParam; i++) | 
 |     { | 
 |         /* Show param info */ | 
 |         param = paramUnitGetParamByIndex(paramUnit, i); | 
 |         printf("[%d] ", i); | 
 |         showParamValue(param); | 
 |  | 
 |         /* Show field info */ | 
 |         showFieldValueOfParam(param); | 
 |     } | 
 |  | 
 |     /* Example: retrieve param by name */ | 
 |     printf("\n\n====Query specific param (name = %s)====\n", "speech_mode_para"); | 
 |     param = paramUnitGetParamByName(paramUnit, "speech_mode_para"); | 
 |     if (param) | 
 |     { | 
 |         showParamValue(param); | 
 |     } | 
 | } | 
 |  | 
 | void showAllAudioType(AppHandle *appHandle) | 
 | { | 
 |     size_t i; | 
 |     printf("\n==== List All Audio Type ===\n\n"); | 
 |     for (i = 0; i < appHandleGetNumOfAudioType(appHandle); i++) | 
 |     { | 
 |         AudioType *audioType = appHandleGetAudioTypeByIndex(appHandle, i); | 
 |  | 
 |         /* XML Version check for AudioTuningTool */ | 
 |         if (!audioTypeIsTuningToolSupportedXmlVer(audioType)) | 
 |         { | 
 |             printf("Error: %s AudioType's XML version is newer than tuning tool supported ver. (ParamUnitDesc ver (%d,%d), AudioParam ver (%d,%d))\n", audioType->name, audioType->paramUnitDescVerMaj, audioType->paramUnitDescVerMin, audioType->audioParamVerMaj, audioType->audioParamVerMin); | 
 |             continue; | 
 |         } | 
 |  | 
 |         // Tuning tool support backward compatible, need to know the XML version | 
 |         printf("AudioType[%lu] : %s (tab name = %s, ParamUnitDesc ver = %d.%d, AudioParam ver = %d.%d)\n", i, audioType->name, audioType->tabName, audioType->paramUnitDescVerMaj, audioType->paramUnitDescVerMin, audioType->audioParamVerMaj, audioType->audioParamVerMin); | 
 |     } | 
 | } | 
 |  | 
 | void showAllCategoryInformation(AppHandle *appHandle) | 
 | { | 
 |     size_t i; | 
 |     for (i = 0; i < appHandleGetNumOfAudioType(appHandle); i++) | 
 |     { | 
 |         AudioType *audioType = appHandleGetAudioTypeByIndex(appHandle, i); | 
 |  | 
 |         /* Example to retrieve category info */ | 
 |         showCategoryTypeList(audioType); | 
 |     } | 
 | } | 
 |  | 
 | void showAllParamFieldInformation(AppHandle *appHandle) | 
 | { | 
 |     size_t i; | 
 |     for (i = 0; i < appHandleGetNumOfAudioType(appHandle); i++) | 
 |     { | 
 |         AudioType *audioType = appHandleGetAudioTypeByIndex(appHandle, i); | 
 |  | 
 |         /* Example to retrieve ParamInfo */ | 
 |         showParamFieldInfo(audioType); | 
 |     } | 
 | } | 
 |  | 
 | void showAllParamTreeInformation(AppHandle *appHandle) | 
 | { | 
 |     size_t i; | 
 |     for (i = 0; i < appHandleGetNumOfAudioType(appHandle); i++) | 
 |     { | 
 |         AudioType *audioType = appHandleGetAudioTypeByIndex(appHandle, i); | 
 |  | 
 |         /* Example to retrieve ParamInfo */ | 
 |         showParamTreeViewInfo(audioType); | 
 |     } | 
 | } | 
 |  | 
 | void showFeatureOptions(AppHandle *appHandle) | 
 | { | 
 |     size_t i; | 
 |     printf("\n===== Feature Option =====\n"); | 
 |     for (i = 0; i < appHandleGetNumOfFeatureOption(appHandle); i++) | 
 |     { | 
 |         FeatureOption *featureOption = appHandleGetFeatureOptionByIndex(appHandle, i); | 
 |         printf("[%lu] %s = \"%s\" (enabled = %d)\n", i, featureOption->name, featureOption->value, appHandleIsFeatureOptionEnabled(appHandle, featureOption->name)); | 
 |     } | 
 |     printf("============================\n"); | 
 | } | 
 |  | 
 | void processTreeRootNode(xmlNode *node, int level, TreeRoot *treeRoot, const char *categoryPath) | 
 | { | 
 |     int isFeatureNode = 0; | 
 |  | 
 |     if (!node) | 
 |     { | 
 |         return; | 
 |     } | 
 |  | 
 |     if (node->type == XML_ELEMENT_NODE) | 
 |     { | 
 |         /* Show indent first */ | 
 |         int i = 0; | 
 |         for (i = 0; i < level; i++) | 
 |         { | 
 |             printf("  "); | 
 |         } | 
 |  | 
 |         /* Process each element */ | 
 |         if (!strcmp(node->name, ELEM_TREE_ROOT)) | 
 |         { | 
 |             printf("+<TreeRoot name = %s>\n", xmlNodeGetProp(node, ATTRI_NAME)); | 
 |         } | 
 |         else if (!strcmp(node->name, ELEM_SHEET)) | 
 |         { | 
 |             /* Show sheet node */ | 
 |             if (treeRoot->switchFieldInfo) | 
 |             { | 
 |                 int fieldVal = 0; | 
 |                 int onVal = 0; | 
 |  | 
 |                 ParamUnit *paramUnit = audioTypeGetParamUnit(treeRoot->paramTreeView->audioType, categoryPath); | 
 |                 paramUnitGetFieldVal(paramUnit, treeRoot->switchFieldInfo->paramInfo->name, treeRoot->switchFieldInfo->name, &fieldVal); | 
 |  | 
 |                 if ((fieldInfoGetCheckListValue(treeRoot->switchFieldInfo, "on", &onVal) == APP_NO_ERROR) | 
 |                     && onVal == fieldVal) | 
 |                 { | 
 |                     printf("+<\"check\" Sheet %s>\n", categoryPath);    // checkbox checked | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     printf("+<\"uncheck\" Sheet %s>\n", categoryPath);  // checkbox unchecked | 
 |                 } | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("+<Sheet %s>\n", categoryPath);  // no checkbox | 
 |             } | 
 |         } | 
 |         else if (!strcmp(node->name, ELEM_FEATURE)) | 
 |         { | 
 |             /* Get Feature obj by name */ | 
 |             FeatureField *featureField; | 
 |             int ignore = 0; | 
 |             Feature *feature = treeRootGetFeatureByName(treeRoot, xmlNodeGetProp(node, ATTRI_NAME)); | 
 |             isFeatureNode = 1; | 
 |  | 
 |             /* Check feature option */ | 
 |             if (feature->featureOption && !appHandleIsFeatureOptionEnabled(treeRoot->paramTreeView->audioType->appHandle, feature->featureOption)) | 
 |             { | 
 |                 //printf ("Feature %s unsupport (%s is disabled)\n", feature->name, feature->featureOption); | 
 |                 ignore = 1; | 
 |             } | 
 |  | 
 |             /* Check category path */ | 
 |             if (!ignore && !featureIsCategoryPathSupport(feature, categoryPath)) | 
 |             { | 
 |                 //printf ("Feature %s unsupport (%s is not valid category path)\n", feature->name, categoryPath); | 
 |                 ignore = 1; | 
 |             } | 
 |  | 
 |             if (ignore == 0) | 
 |             { | 
 |                 ParamUnit *paramUnit = audioTypeGetParamUnit(treeRoot->paramTreeView->audioType, categoryPath); | 
 |  | 
 |                 if (feature->switchFieldInfo) | 
 |                 { | 
 |                     int fieldVal = 0; | 
 |                     int onVal = 0; | 
 |  | 
 |                     ParamUnit *switchParamUnit = audioTypeGetParamUnit(feature->switchFieldInfo->paramInfo->audioType, categoryPath); | 
 |                     paramUnitGetFieldVal(switchParamUnit, feature->switchFieldInfo->paramInfo->name, feature->switchFieldInfo->name, &fieldVal); | 
 |  | 
 |                     if ((fieldInfoGetCheckListValue(feature->switchFieldInfo, "on", &onVal) == APP_NO_ERROR) | 
 |                         && onVal == fieldVal) | 
 |                     { | 
 |                         printf("+<\"check\" Feature name = %s>\n", feature->name);  // checkbox checked | 
 |                     } | 
 |                     else | 
 |                     { | 
 |                         printf("+<\"uncheck\" Feature name = %s>\n", feature->name);    // checkbox unchecked | 
 |                     } | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     printf("+<Feature name = %s>\n", feature->name);    // no checkbox | 
 |                 } | 
 |  | 
 |                 for (featureField = feature->featureFieldHash; featureField; featureField = featureField->hh.next) | 
 |                 { | 
 |                     unsigned int fieldVal = 0; | 
 |                     paramUnitGetFieldVal(paramUnit, | 
 |                                          featureField->fieldInfo->paramInfo->name, | 
 |                                          featureField->fieldInfo->name, | 
 |                                          &fieldVal); | 
 |  | 
 |                     printf("      <Field name = %s, val = %d, check_list=%s>\n", | 
 |                            featureField->fieldInfo->name, | 
 |                            fieldVal, | 
 |                            featureField->fieldInfo->checkListStr); | 
 |                 } | 
 |             } | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("+<%s>\n", node->name); | 
 |         } | 
 |     } | 
 |  | 
 |     if (level && node->next) | 
 |     { | 
 |         processTreeRootNode(node->next, level, treeRoot, categoryPath); | 
 |     } | 
 |  | 
 |     if (!isFeatureNode && node->children) | 
 |     { | 
 |         processTreeRootNode(node->children, level + 1, treeRoot, categoryPath); | 
 |     } | 
 | } | 
 |  | 
 | /* Notice: it's just example, the num of categoryType may be 4, 5... you have to get the category path more flexible */ | 
 | char *queryCategoryPathByWording(AppHandle *appHandle, const char *audioTypeName, const char *categoryType1Wording, const char *category1Wording, const char *categoryType2Wording, const char *categoryGroup2Wording, const char *category2Wording, const char *categoryType3Wording, const char *categoryGroup3Wording, const char *category3Wording) | 
 | { | 
 |     char *result; | 
 |     UT_string *searchPath = NULL; | 
 |     CategoryType *categoryType = NULL; | 
 |     CategoryGroup *categoryGroup = NULL; | 
 |     Category *category = NULL; | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, audioTypeName); | 
 |  | 
 |     /* If user select a category path, just like "NarrowBand / Normal of Handset / Level0" */ | 
 |     utstring_new(searchPath); | 
 |  | 
 |     /* Query first category type name & category name */ | 
 |     if (audioType) | 
 |     { | 
 |         categoryType = audioTypeGetCategoryTypeByName(audioType, categoryType1Wording); | 
 |     } | 
 |     if (categoryType) | 
 |     { | 
 |         category = categoryTypeGetCategoryByWording(categoryType, category1Wording); | 
 |         utstring_printf(searchPath, "%s,%s,", categoryType->name, category->name); | 
 |     } | 
 |  | 
 |     /* Query 2nd category type name & category name (include category group)*/ | 
 |     categoryGroup = NULL; | 
 |     categoryGroup = NULL; | 
 |  | 
 |     if (audioType) | 
 |     { | 
 |         categoryType = audioTypeGetCategoryTypeByName(audioType, categoryType2Wording); | 
 |     } | 
 |     if (audioType) | 
 |     { | 
 |         categoryGroup = categoryTypeGetCategoryGroupByWording(categoryType, categoryGroup2Wording); | 
 |     } | 
 |     if (categoryGroup) | 
 |     { | 
 |         category = categoryGroupGetCategoryByWording(categoryGroup, category2Wording); | 
 |         if (category) | 
 |         { | 
 |             utstring_printf(searchPath, "%s,%s,", categoryType->name, category->name); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: Cannot find \"%s\" category from \"%s\" category group.\n", category2Wording, categoryGroup->name); | 
 |             utstring_free(searchPath); | 
 |             return NULL; | 
 |         } | 
 |     } | 
 |  | 
 |     /* Query 3nd category type name & category name */ | 
 |     categoryGroup = NULL; | 
 |     categoryGroup = NULL; | 
 |  | 
 |     if (audioType) | 
 |     { | 
 |         categoryType = audioTypeGetCategoryTypeByWording(audioType, categoryType3Wording); | 
 |     } | 
 |     if (categoryType) | 
 |     { | 
 |         categoryGroup = categoryTypeGetCategoryGroupByWording(categoryType, categoryGroup3Wording); | 
 |     } | 
 |     if (categoryGroup) | 
 |     { | 
 |         category = categoryGroupGetCategoryByWording(categoryGroup, category3Wording); | 
 |         utstring_printf(searchPath, "%s,%s", categoryType->name, category->name); | 
 |     } | 
 |  | 
 |     if (searchPath) | 
 |     { | 
 |         result = strdup(utstring_body(searchPath)); | 
 |         //printf("==> The param unit search path = %s\n", result); | 
 |     } | 
 |     else | 
 |     { | 
 |         printf("Error: cannot get the category path\n"); | 
 |     } | 
 |  | 
 |     utstring_free(searchPath); | 
 |  | 
 |     return result; | 
 | } | 
 |  | 
 | void queryFieldValue(AppHandle *appHandle, const char *targetAudioTypeName, const char *categoryPath, const char *paramName, const char *fieldName) | 
 | { | 
 |     unsigned int fieldValue; | 
 |     ParamUnit *paramUnit; | 
 |  | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, targetAudioTypeName); | 
 |  | 
 |     /* Query the ParamUnit */ | 
 |     paramUnit = audioTypeGetParamUnit(audioType, categoryPath); | 
 |  | 
 |     /* Query the field value */ | 
 |     if (paramUnitGetFieldVal(paramUnit, paramName, fieldName, &fieldValue) == APP_ERROR) | 
 |     { | 
 |         printf("Error: Cannot query field value successfully!!\n"); | 
 |     } | 
 |     else | 
 |     { | 
 |         printf("Field value = 0x%x (%s/%s)\n", fieldValue, paramName, fieldName); | 
 |     } | 
 | } | 
 |  | 
 | void simpleFieldQuery(AppHandle *appHandle) | 
 | { | 
 |     unsigned int fieldValue; | 
 |     ParamUnit *paramUnit; | 
 |     Param *param; | 
 |     FieldInfo *fieldInfo; | 
 |  | 
 |     const char *targetAudioTypeName = "Speech"; | 
 |     const char *targetParamName = "speech_mode_para"; | 
 |     const char *targetFieldName = "DL Digital Gain"; | 
 |  | 
 |     /* Example of category combination */ | 
 |     const char *categoryType1Wording = "Bandwidth"; | 
 |     const char *category1Wording = "Narrow Band"; | 
 |  | 
 |     const char *categoryType2Wording = "Profile"; | 
 |     const char *categoryGroup2Wording = "Handset"; | 
 |     const char *category2Wording = "Handset"; | 
 |  | 
 |     const char *categoryType3Wording = "Volume"; | 
 |     const char *categoryGroup3Wording = "Index"; | 
 |     const char *category3Wording = "Level0"; | 
 |  | 
 |     /* Query category path */ | 
 |     char *categoryPath = queryCategoryPathByWording(appHandle, targetAudioTypeName, categoryType1Wording, category1Wording, categoryType2Wording, categoryGroup2Wording, category2Wording, categoryType3Wording, categoryGroup3Wording, category3Wording); | 
 |  | 
 |     /* Query AudioType */ | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, targetAudioTypeName); | 
 |     if (!audioType) | 
 |     { | 
 |         free(categoryPath); | 
 |         return; | 
 |     } | 
 |  | 
 |     /* Read lock */ | 
 |     audioTypeReadLock(audioType, __FUNCTION__); | 
 |  | 
 |     /* Query the ParamUnit */ | 
 |     paramUnit = audioTypeGetParamUnit(audioType, categoryPath); | 
 |     if (!paramUnit) | 
 |     { | 
 |         free(categoryPath); | 
 |         audioTypeUnlock(audioType); | 
 |         return; | 
 |     } | 
 |  | 
 |     printf("\n\n==== Simple Test Query ====\n"); | 
 |     printf("AudioType/Param/Field = %s / %s / %s\n", targetAudioTypeName, targetParamName, targetFieldName); | 
 |     printf("Category path = %s\n", categoryPath); | 
 |  | 
 |     /* Query the param value */ | 
 |     param = paramUnitGetParamByName(paramUnit, "speech_mode_para"); | 
 |     if (!param) | 
 |     { | 
 |         printf("Error: Cannot query param value!\n"); | 
 |         free(categoryPath); | 
 |         audioTypeUnlock(audioType); | 
 |         return; | 
 |     } | 
 |     showParamValue(param); | 
 |  | 
 |     /* Query the field value */ | 
 |     if (paramUnitGetFieldVal(paramUnit, targetParamName, targetFieldName, &fieldValue) == APP_ERROR) | 
 |     { | 
 |         printf("Error: Cannot query field value!!\n"); | 
 |         free(categoryPath); | 
 |         audioTypeUnlock(audioType); | 
 |         return; | 
 |     } | 
 |  | 
 |     /* Query the field's check list */ | 
 |     fieldInfo = paramInfoGetFieldInfoByName(param->paramInfo, targetFieldName); | 
 |     if (fieldInfo) | 
 |     { | 
 |         printf("==> Field val = %x (check_list = %s)\n", fieldValue, fieldInfo->checkListStr); | 
 |     } | 
 |     else | 
 |     { | 
 |         printf("Error: Cannot find the fieldInfo!\n"); | 
 |     } | 
 |  | 
 |     free(categoryPath); | 
 |  | 
 |     /* Unlock */ | 
 |     audioTypeUnlock(audioType); | 
 | } | 
 |  | 
 | void simpleParamQuery(AppHandle *appHandle) | 
 | { | 
 |     /* Query category path */ | 
 |     char *audioTypeName = "Speech"; | 
 |     char *categoryPath = "Band,NB,Profile,4_pole_Headset,VolIndex,3"; | 
 |     char *paramName = "speech_mode_para"; | 
 |     ParamUnit *paramUnit; | 
 |     Param *param; | 
 |  | 
 |     /* Query AudioType */ | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, audioTypeName); | 
 |     if (!audioType) | 
 |     { | 
 |         return; | 
 |     } | 
 |  | 
 |     /* Read Lock */ | 
 |     audioTypeReadLock(audioType, __FUNCTION__); | 
 |  | 
 |     /* Query the ParamUnit */ | 
 |     paramUnit = audioTypeGetParamUnit(audioType, categoryPath); | 
 |     if (!paramUnit) | 
 |     { | 
 |         return; | 
 |     } | 
 |  | 
 |     printf("\n\n==== Simple Test Query ====\n"); | 
 |     printf("AudioType/Param/Field = %s / %s\n", audioTypeName, paramName); | 
 |     printf("Category path = %s\n", categoryPath); | 
 |  | 
 |     /* Query the param value */ | 
 |     param = paramUnitGetParamByName(paramUnit, paramName); | 
 |     if (!param) | 
 |     { | 
 |         printf("Error: Cannot query param value!\n"); | 
 |         return; | 
 |     } | 
 |     showParamValue(param); | 
 |  | 
 |     /* Read unlock */ | 
 |     audioTypeUnlock(audioType); | 
 | } | 
 |  | 
 | void simpleParamUpdate(AppHandle *appHandle) | 
 | { | 
 |     unsigned short shortArray[] = {0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999, 0x0000}; | 
 |     int arraySize = 10; | 
 |  | 
 |     /* You should cache follow object in somewhere without query again */ | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, "Speech"); | 
 |     ParamInfo *paramInfo = audioTypeGetParamInfoByName(audioType, "sph_in_fir"); | 
 |  | 
 |     /* The sph_in_fir param is short array type */ | 
 |     if (audioTypeSetParamData(audioType, "Band,NB,Profile,HAC,VolIndex,3,Network,GSM", paramInfo, (void *)shortArray, arraySize) == APP_ERROR) | 
 |     { | 
 |         printf("Cannot update the param data!!\n"); | 
 |     } | 
 | } | 
 |  | 
 | void simpleFieldUpdate(AppHandle *appHandle) | 
 | { | 
 |     unsigned int fieldVal = 0xff; | 
 |  | 
 |     /* You should cache follow object in somewhere without query again */ | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, "Speech"); | 
 |     ParamInfo *paramInfo = audioTypeGetParamInfoByName(audioType, "speech_mode_para"); | 
 |     FieldInfo *fieldInfo = paramInfoGetFieldInfoByName(paramInfo, "DL Digital Gain"); | 
 |  | 
 |     /* Update the fieldInfo for specific categoryPath */ | 
 |     if (audioTypeSetFieldData(audioType, "Band,NB,Profile,HAC,VolIndex,3,Network,GSM", fieldInfo, fieldVal) == APP_ERROR) | 
 |     { | 
 |         printf("Cannot update the field data!!\n"); | 
 |     } | 
 | } | 
 |  | 
 | void applyParamUnitToCategory(AppHandle *appHandle) | 
 | { | 
 |     const char *srcCategoryPath = "Band,NB,Profile,HAC,VolIndex,3,Network,GSM"; | 
 |     const char *dstCategoryPath = "Band,NB,Profile,HAC,VolIndex,4,Network,GSM"; | 
 |  | 
 |     /* Query AudioType */ | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, "Speech"); | 
 |  | 
 |     /* Apply the ParamUnit */ | 
 |     audioTypeParamUnitCopy(audioType, srcCategoryPath, dstCategoryPath); | 
 | } | 
 |  | 
 | void saveModifiedAudioParamXml(AppHandle *appHandle, const char *folder) | 
 | { | 
 |     size_t i; | 
 |     for (i = 0; i < appHandleGetNumOfAudioType(appHandle); i++) | 
 |     { | 
 |         AudioType *audioType = appHandleGetAudioTypeByIndex(appHandle, i); | 
 |  | 
 |         /* Read lock */ | 
 |         audioTypeReadLock(audioType, __FUNCTION__); | 
 |  | 
 |         if (audioType->dirty && audioTypeSaveAudioParamXml(audioType, folder, 1) == APP_ERROR) | 
 |         { | 
 |             printf("Error: cannot save audio param XML to %s dir\n", folder); | 
 |         } | 
 |  | 
 |         /* Unlock */ | 
 |         audioTypeUnlock(audioType); | 
 |     } | 
 | } | 
 |  | 
 | void xmlChangedCallback(AppHandle *appHandle, const char *audioTypeName) | 
 | { | 
 |     printf("XML file changed. (cus folder = %s, audioType = %s)\n", appHandle->xmlCusDir, audioTypeName); | 
 |  | 
 |     // reload XML file | 
 |     if (appHandleReloadAudioType(appHandle, audioTypeName) == APP_ERROR) | 
 |     { | 
 |         printf("Reload xml fail! (audioType = %s)\n", audioTypeName); | 
 |     } | 
 |     else | 
 |     { | 
 | #if 0 | 
 |         AudioType *audioType; | 
 |         ParamUnit *paramUnit; | 
 |         Param *param; | 
 |  | 
 |         printf("Reload XML done. (audioType = %s)\n", audioTypeName); | 
 |  | 
 |         /* Query AudioType */ | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, audioTypeName); | 
 |         if (!audioType) | 
 |         { | 
 |             printf("Cannot find %s audio type\n", audioTypeName); | 
 |             return; | 
 |         } | 
 |  | 
 |         /* Query the ParamUnit */ | 
 |         paramUnit = audioTypeGetParamUnit(audioType, "Band,NB,Profile,Normal,VolIndex,0,Network,GSM"); | 
 |         if (!paramUnit) | 
 |         { | 
 |             printf("Cannot find paramUnit\n"); | 
 |             return; | 
 |         } | 
 |  | 
 |         /* Query the param value */ | 
 |         param = paramUnitGetParamByName(paramUnit, "speech_mode_para"); | 
 |         if (!param) | 
 |         { | 
 |             printf("Error: Cannot query param value!\n"); | 
 |             return; | 
 |         } | 
 |         showParamValue(param); | 
 | #else | 
 |         printf("Reload XML done. (audioType = %s)\n", audioTypeName); | 
 |         utilUsleep(2000000); | 
 |         printf("Sleep 2 sec done...\n"); | 
 | #endif | 
 |     } | 
 | } | 
 |  | 
 | int showDynamicTest(AppHandle *appHandle) | 
 | { | 
 |     AudioType *audioType = NULL; | 
 |     char *categoryPath = NULL; | 
 |     char *paramName = NULL; | 
 |     ParamUnit *paramUnit = NULL; | 
 |     ParamInfo *paramInfo = NULL; | 
 |     FieldInfo *fieldInfo = NULL; | 
 |     Param *param = NULL; | 
 |     void *paramData = NULL; | 
 |     size_t arraySize = 0; | 
 |     char tmp[BUF_SIZE]; | 
 |     char *input; | 
 |     unsigned int fieldValue = 0; | 
 |  | 
 |     printf("\n\n====== Dynamic Test =====\n"); | 
 |     printf("[0] Back to main menu\n"); | 
 |     printf("[1] Get param value\n"); | 
 |     printf("[2] Set param value\n"); | 
 |     printf("[3] Get field value\n"); | 
 |     printf("[4] Set field value\n"); | 
 |     printf("[5] ParamUnit copy\n"); | 
 |     printf("[6] Save xml\n"); | 
 |     printf("[7] Show param tree view\n"); | 
 |     printf("[8] Set switchField on/off \n"); | 
 |     printf("[9] Compress files\n"); | 
 |     printf("[10] UnCompress file\n"); | 
 |     printf("==========================\n"); | 
 |     printf("Please enter the selection: "); | 
 |     input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |     if (!strcmp(input, "0")) | 
 |     { | 
 |         return 0; | 
 |     } | 
 |     else if (!strcmp(input, "1")) | 
 |     { | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |             printf("Enter category path (eg. Band,NB,Profile,4_pole_Headset,VolIndex,3,Network,GSM):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |             /* Read lock */ | 
 |             audioTypeReadLock(audioType, __FUNCTION__); | 
 |  | 
 |             paramUnit = audioTypeGetParamUnit(audioType, input); | 
 |             if (paramUnit) | 
 |             { | 
 |                 printf("Enter param name (eg. speech_mode_para):"); | 
 |                 input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                 param = paramUnitGetParamByName(paramUnit, input); | 
 |                 if (param) | 
 |                 { | 
 |                     showParamValue(param); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     printf("Error: Cannot find the param!\n"); | 
 |                 } | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("Error: Cannot find the param unit!\n"); | 
 |             } | 
 |  | 
 |             /* Unlock */ | 
 |             audioTypeUnlock(audioType); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: no such audio type\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "2")) | 
 |     { | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |             printf("Enter param name (eg. speech_mode_para):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |             paramInfo = audioTypeGetParamInfoByName(audioType, input); | 
 |             if (paramInfo) | 
 |             { | 
 |                 printf("Enter category path (eg. Band,NB,Profile,4_pole_Headset,VolIndex,3,Network,GSM):"); | 
 |                 input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                 categoryPath = strdup(input); | 
 |  | 
 |                 printf("Enter param value (type:%s):", paramDataTypeToStr(paramInfo->dataType)); | 
 |                 input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                 if (utilConvDataStringToNative(paramInfo->dataType, input, ¶mData, &arraySize) == APP_NO_ERROR) | 
 |                 { | 
 |                     /* The sph_in_fir param is short array type */ | 
 |                     if (audioTypeSetParamData(audioType, categoryPath, paramInfo, (void *)paramData, arraySize) == APP_ERROR) | 
 |                     { | 
 |                         printf("Cannot update the param data!!\n"); | 
 |                     } | 
 |                 } | 
 |  | 
 |                 free(categoryPath); | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("Error: cannot find the param!\n"); | 
 |             } | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: no such audio type\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "3")) | 
 |     { | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |             printf("Enter category path (eg. Band,NB,Profile,4_pole_Headset,VolIndex,3,Network,GSM):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |             /* Read lock */ | 
 |             audioTypeReadLock(audioType, __FUNCTION__); | 
 |  | 
 |             paramUnit = audioTypeGetParamUnit(audioType, input); | 
 |             if (paramUnit) | 
 |             { | 
 |                 printf("Enter param name (eg. speech_mode_para):"); | 
 |                 input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                 paramInfo = audioTypeGetParamInfoByName(audioType, input); | 
 |                 if (paramInfo) | 
 |                 { | 
 |                     printf("Enter field name (eg. DL Digital Gain):"); | 
 |                     input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                     if (paramUnitGetFieldVal(paramUnit, paramInfo->name, input, &fieldValue) == APP_ERROR) | 
 |                     { | 
 |                         printf("Error: Cannot query field value!\n"); | 
 |                     } | 
 |                     else | 
 |                     { | 
 |                         printf("Field value = 0x%x\n", fieldValue); | 
 |                     } | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     printf("Error: Cannot find the param!\n"); | 
 |                 } | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("Error: Cannot find the param unit!\n"); | 
 |             } | 
 |  | 
 |             /* Unlock */ | 
 |             audioTypeUnlock(audioType); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: no such audio type\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "4")) | 
 |     { | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |             printf("Enter category path (eg. Band,NB,Profile,4_pole_Headset,VolIndex,3,Network,GSM):"); | 
 |             categoryPath = strdup(utilGetStdin(tmp, BUF_SIZE)); | 
 |  | 
 |             printf("Enter param name (eg. speech_mode_para):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |             paramInfo = audioTypeGetParamInfoByName(audioType, input); | 
 |             if (paramInfo) | 
 |             { | 
 |                 printf("Enter field name (eg. DL Digital Gain):"); | 
 |                 input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                 fieldInfo = paramInfoGetFieldInfoByName(paramInfo, input); | 
 |                 if (fieldInfo) | 
 |                 { | 
 |                     printf("Enter field value:"); | 
 |                     input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                     if (audioTypeSetFieldData(audioType, categoryPath, fieldInfo, strtoul(input, NULL, 0)) == APP_NO_ERROR) | 
 |                     { | 
 |                         printf("Set field value = 0x%zx\n", strtoul(input, NULL, 0)); | 
 |                     } | 
 |                     else | 
 |                     { | 
 |                         printf("Error: Cannot set field value!\n"); | 
 |                     } | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     printf("Error: Cannot find the field!\n"); | 
 |                 } | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("Error: Cannot find the param!\n"); | 
 |             } | 
 |  | 
 |             free(categoryPath); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: no such audio type\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "5")) | 
 |     { | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |             char *src = NULL; | 
 |             printf("Enter src category path (eg. Band,NB,Profile,HAC,VolIndex,3,Network,GSM):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |             src = strdup(input); | 
 |  | 
 |             printf("Enter dst category path (eg. Band,NB,Profile,HAC,VolIndex,4,Network,GSM):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |             if (audioTypeParamUnitCopy(audioType, src, input)) | 
 |             { | 
 |                 printf("ParamUnit copied\n"); | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("Error: Cannot copy paramUnit!\n"); | 
 |             } | 
 |  | 
 |             free(src); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: no such audio type\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "6")) | 
 |     { | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |  | 
 | #ifdef WIN32 | 
 |             printf("Enter folder to save XML (eg. .\\cus):"); | 
 | #else | 
 |             printf("Enter folder to save XML (eg. /sdcard/.audio_param/):"); | 
 | #endif | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |             /* Read lock */ | 
 |             audioTypeReadLock(audioType, __FUNCTION__); | 
 |  | 
 |             /* Save changed AudioType to XML */ | 
 |             audioTypeSaveAudioParamXml(audioType, input, 1); | 
 |  | 
 |             /* Unlock */ | 
 |             audioTypeUnlock(audioType); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: no such audio type\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "7")) | 
 |     { | 
 |         char *treeRootName; | 
 |         AudioType *audioType; | 
 |  | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |             TreeRoot *treeRoot; | 
 |             printf("Enter tree root name (eg. NREC):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |             treeRootName = strdup(input); | 
 |             treeRoot = audioTypeGetTreeRoot(audioType, treeRootName); | 
 |             if (treeRoot) | 
 |             { | 
 |                 printf("Enter category path (eg. Band,NB,Profile,HAC,VolIndex,3,Network,GSM):"); | 
 |                 input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                 /* Show tree root */ | 
 |                 processTreeRootNode(treeRoot->treeRootNode, 0, treeRoot, input); | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("Error: Cannot find the %s tree root!\n", treeRootName); | 
 |             } | 
 |             free(treeRootName); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: Cannot find %s audio type!\n", input); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "8")) | 
 |     { | 
 |         printf("Enter audio type name (eg. Speech):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         audioType = appHandleGetAudioTypeByName(appHandle, input); | 
 |         if (audioType) | 
 |         { | 
 |             printf("Enter category path (eg. Band,NB,Profile,4_pole_Headset,VolIndex,3,Network,GSM):"); | 
 |             categoryPath = strdup(utilGetStdin(tmp, BUF_SIZE)); | 
 |  | 
 |             printf("Enter param name (eg. speech_mode_para):"); | 
 |             input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |             paramInfo = audioTypeGetParamInfoByName(audioType, input); | 
 |             if (paramInfo) | 
 |             { | 
 |                 FieldInfo *switchFieldInfo; | 
 |                 printf("Enter field name (eg. switch):"); | 
 |                 input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                 switchFieldInfo = paramInfoGetFieldInfoByName(paramInfo, input); | 
 |  | 
 |                 /* For parameter tree, you can get the fieldInfo by treeRoot->switchFieldInfo & feature-> switchFieldInfo*/ | 
 |                 if (switchFieldInfo) | 
 |                 { | 
 |                     printf("Enter switch on/off (1/0):"); | 
 |                     input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |                     if (!strcmp(input, "1")) | 
 |                     { | 
 |                         /* Get the check list on's value */ | 
 |                         unsigned int onValue; | 
 |                         if (fieldInfoGetCheckListValue(switchFieldInfo, "on", &onValue) == APP_ERROR) | 
 |                         { | 
 |                             printf("Error: Cannot get the check list's on value! (XML should define the on's value)\n"); | 
 |                         } | 
 |                         else | 
 |                         { | 
 |                             /* Set the field with on's value */ | 
 |                             if (audioTypeSetFieldData(switchFieldInfo->paramInfo->audioType, categoryPath, switchFieldInfo, onValue) == APP_ERROR) | 
 |                             { | 
 |                                 printf("Cannot set the filed data successfully!\n"); | 
 |                             } | 
 |                             else | 
 |                             { | 
 |                                 printf("Set the field data successfully!\n"); | 
 |                             } | 
 |                         } | 
 |                     } | 
 |                     else | 
 |                     { | 
 |                         /* Get the check list off's value */ | 
 |                         unsigned int offValue; | 
 |                         if (fieldInfoGetCheckListValue(switchFieldInfo, "off", &offValue) == APP_ERROR) | 
 |                         { | 
 |                             printf("Error: Cannot get the check list's off value! (XML should define the off's value)\n"); | 
 |                         } | 
 |                         else | 
 |                         { | 
 |                             /* Set the field with off's value */ | 
 |                             if (audioTypeSetFieldData(switchFieldInfo->paramInfo->audioType, categoryPath, switchFieldInfo, offValue) == APP_ERROR) | 
 |                             { | 
 |                                 printf("Cannot set the filed data successfully!\n"); | 
 |                             } | 
 |                             else | 
 |                             { | 
 |                                 printf("Set the field data successfully!\n"); | 
 |                             } | 
 |                         } | 
 |                     } | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     printf("Error: Cannot find the field!\n"); | 
 |                 } | 
 |             } | 
 |             else | 
 |             { | 
 |                 printf("Error: No fieldInfo found!\n"); | 
 |             } | 
 |  | 
 |             free(categoryPath); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Error: no such audio type\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "9")) | 
 |     { | 
 |         char* srcDir; | 
 |         char* dstFile; | 
 |         printf("Enter compress folder full path: "); | 
 |         srcDir = strdup(utilGetStdin(tmp, BUF_SIZE)); | 
 |  | 
 |         printf("Enter target file full path: "); | 
 |         dstFile = strdup(utilGetStdin(tmp, BUF_SIZE)); | 
 |  | 
 |         if (appHandleCompressFiles(srcDir, dstFile) == APP_ERROR) | 
 |         { | 
 |             printf("File compress fail\n"); | 
 |         } else { | 
 |             printf("File compress done\n"); | 
 |         } | 
 |         free(srcDir); | 
 |         free(dstFile); | 
 |     } | 
 |     else if (!strcmp(input, "10")) | 
 |     { | 
 |         char* srcFile; | 
 |         char* dstDir; | 
 |         printf("Enter src file full path: "); | 
 |         srcFile = strdup(utilGetStdin(tmp, BUF_SIZE)); | 
 |  | 
 |         printf("Enter target dir full path: "); | 
 |         dstDir = strdup(utilGetStdin(tmp, BUF_SIZE)); | 
 |  | 
 |         if (appHandleUncompressFile(srcFile, dstDir) == APP_ERROR) | 
 |         { | 
 |             printf("File uncompress fail\n"); | 
 |         } else { | 
 |             printf("File uncompress done\n"); | 
 |         } | 
 |         free(srcFile); | 
 |         free(dstDir); | 
 |     } | 
 |     return 1; | 
 | } | 
 |  | 
 | void testAppLibAPIs() | 
 | { | 
 |     AppHandle *appHandle = appHandleGetInstance(); | 
 |     int oldDebugLevel = appGetDebugLevel(); | 
 |     AudioType *audioType = appHandleGetAudioTypeByName(appHandle, "Speech"); | 
 |     ParamInfo *paramInfo = audioTypeGetParamInfoByName(audioType, "speech_mode_para"); | 
 |     FieldInfo *fieldInfo = paramInfoGetFieldInfoByName(paramInfo, "AEC"); | 
 |  | 
 |     /* Change level to debug */ | 
 |     appSetDebugLevel(DEBUG_LEVEL); | 
 |  | 
 |     /* Set AEC field */ | 
 |     audioTypeSetFieldData(audioType, "Band,NB,Profile,Normal,VolIndex,3,Network,GSM", fieldInfo, 0xbd); | 
 |  | 
 |     /* Copy ParamUnit src = dst */ | 
 |     audioTypeParamUnitCopy(audioType, "Band,NB,Profile,Normal,VolIndex,3,Network,GSM", "Band,NB,Profile,Normal,VolIndex,3,Network,GSM"); | 
 |  | 
 |     /* Copy ParamUnit src != dst */ | 
 |     audioTypeParamUnitCopy(audioType, "Band,NB,Profile,Normal,VolIndex,3,Network,GSM", "Band,NB,Profile,HAC,VolIndex,3,Network,GSM"); | 
 |  | 
 |     /* Query param */ | 
 |     simpleParamQuery(appHandle); | 
 |  | 
 |     /* Retrieve specific audio type's param & field information */ | 
 |     simpleFieldQuery(appHandle); | 
 |  | 
 |     /* Query non-exist ParamUnit, it shouldn't crash */ | 
 |     audioTypeGetParamUnit(audioType, "aaa,bbb"); | 
 |  | 
 |     /* Update param value */ | 
 |     simpleParamUpdate(appHandle); | 
 |  | 
 |     /* Update field value */ | 
 |     simpleFieldUpdate(appHandle); | 
 |  | 
 |     /* Apply param to other category */ | 
 |     applyParamUnitToCategory(appHandle); | 
 |  | 
 | #ifndef WIN32 | 
 |     /* Save changed AudioType to XML */ | 
 |     saveModifiedAudioParamXml(appHandle, XML_CUS_FOLDER_ON_DEVICE); | 
 | #else | 
 |     /* Save changed AudioType to XML */ | 
 |     saveModifiedAudioParamXml(appHandle, XML_CUS_FOLDER_ON_TUNING_TOOL); | 
 | #endif | 
 |     appSetDebugLevel(oldDebugLevel); | 
 | } | 
 |  | 
 | void testUtilNativeAPIs() | 
 | { | 
 |     APP_STATUS status; | 
 |     unsigned int fieldResult = 0; | 
 |     char *strResult; | 
 |  | 
 |     /* Get category string */ | 
 |     strResult = utilNativeGetCategory("Speech", "Band"); | 
 |     printf("Category result = %s\n", strResult); | 
 | #ifndef WIN32 | 
 |     free(strResult); | 
 | #else | 
 |     printf("Cannot free the memory allocated by APP on WIN32, just for testing\n"); | 
 | #endif | 
 |  | 
 |     /* Set param */ | 
 |     status = utilNativeSetParam("SpeechGeneral", "CategoryLayer,Common", "speech_common_para", "0x1,0xDABD,0x7918,0x2A00,0x8001,0x0,0x0,0x0,0x0,0x0,0x0,0x0"); | 
 |     if (status == APP_ERROR) | 
 |     { | 
 |         printf("utilNativeSetParam fail!\n"); | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     /* Get param */ | 
 |     strResult = utilNativeGetParam("SpeechGeneral", "CategoryLayer,Common", "speech_common_para"); | 
 |     printf("Param = %s\n", strResult); | 
 | #ifndef WIN32 | 
 |     free(strResult); | 
 | #else | 
 |     printf("Cannot free the memory allocated by APP on WIN32, just for testing\n"); | 
 | #endif | 
 |  | 
 |     /* Set field */ | 
 |     status = utilNativeSetField("Speech", "Band,NB,Profile,Normal", "speech_mode_para", "AEC", "252"); | 
 |     if (status == APP_ERROR) | 
 |     { | 
 |         printf("utilNativeSetField fail!\n"); | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     /* Get field */ | 
 |     fieldResult = utilNativeGetField("Speech", "Band,NB,Profile,Normal", "speech_mode_para", "AEC"); | 
 |     printf("Field = 0x%x\n", fieldResult); | 
 |  | 
 |     /* Get check list */ | 
 |     strResult = utilNativeGetChecklist("Speech", "speech_mode_para", "AEC"); | 
 |     printf("Check list = %s\n", strResult); | 
 |  | 
 |     /* Save parameter */ | 
 |     status = utilNativeSaveXml("Speech"); | 
 |     if (status == APP_ERROR) | 
 |     { | 
 |         printf("utilNativeSaveXml fail!\n"); | 
 |         exit(1); | 
 |     } | 
 | } | 
 |  | 
 | int showXmlInfo(AppHandle *appHandle) | 
 | { | 
 |     AudioType *audioType = NULL; | 
 |     char *categoryPath = NULL; | 
 |     char *paramName = NULL; | 
 |     ParamUnit *paramUnit = NULL; | 
 |     ParamInfo *paramInfo = NULL; | 
 |     FieldInfo *fieldInfo = NULL; | 
 |     Param *param = NULL; | 
 |     void *paramData = NULL; | 
 |     size_t arraySize = 0; | 
 |     char tmp[BUF_SIZE]; | 
 |     char *input; | 
 |     unsigned int fieldValue = 0; | 
 |  | 
 |     printf("\n\n====== Show XML Information =====\n"); | 
 |     printf("[0] Back to main menu\n"); | 
 |     printf("[1] Show all audio type info\n"); | 
 |     printf("[2] Show all category info\n"); | 
 |     printf("[3] Show all param/field info\n"); | 
 |     printf("[4] Show all param tree view info\n"); | 
 |     printf("[5] Show feature options\n"); | 
 |     printf("==========================\n"); | 
 |     printf("Please enter the selection: "); | 
 |     input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |     if (!strcmp(input, "0")) | 
 |     { | 
 |         return 0; | 
 |     } | 
 |     else if (!strcmp(input, "1")) | 
 |     { | 
 |         showAllAudioType(appHandle); | 
 |     } | 
 |     else if (!strcmp(input, "2")) | 
 |     { | 
 |         showAllCategoryInformation(appHandle); | 
 |     } | 
 |     else if (!strcmp(input, "3")) | 
 |     { | 
 |         showAllParamFieldInformation(appHandle); | 
 |     } | 
 |     else if (!strcmp(input, "4")) | 
 |     { | 
 |         showAllParamTreeInformation(appHandle); | 
 |     } | 
 |     else if (!strcmp(input, "5")) | 
 |     { | 
 |         showFeatureOptions(appHandle); | 
 |     } | 
 |     return 1; | 
 | } | 
 |  | 
 | int showMainMenu(AppHandle *appHandle) | 
 | { | 
 |     char tmp[BUF_SIZE]; | 
 |     char *input; | 
 |     printf("\n\n======= Main Menu =======\n"); | 
 |     printf("[0] Exit\n"); | 
 |     printf("[1] Unit test\n"); | 
 |     printf("[2] Show XML information (AudioType/Category/ParamInfo/FieldInfo)\n"); | 
 |     printf("[3] Test formal Speech audio type xml. (Fixed test pattern)\n"); | 
 |     printf("[4] File changed callback test (only support on android version)\n"); | 
 |     printf("[5] Dynamic operation test\n"); | 
 |     printf("[6] Set debug level\n"); | 
 |     printf("[7] Show log to console\n"); | 
 |     printf("[8] Show app lib build timestamp\n"); | 
 |     printf("==========================\n"); | 
 |     printf("Please enter the selection: "); | 
 |     input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |     if (!strcmp(input, "0")) | 
 |     { | 
 |         return 0; | 
 |     } | 
 |     else if (!strcmp(input, "1")) | 
 |     { | 
 |         /* APP Parser internal unit test */ | 
 |         if (unitTest(appHandle) == APP_ERROR) | 
 |         { | 
 |             printf("Unit test failure!\n"); | 
 |         } | 
 |         else | 
 |         { | 
 |             printf("Unit test pass!\n"); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "2")) | 
 |     { | 
 |         while (1) | 
 |         { | 
 |             if (showXmlInfo(appHandle) == 0) | 
 |             { | 
 |                 break; | 
 |             } | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "3")) | 
 |     { | 
 |         testAppLibAPIs(); | 
 |  | 
 |         printf("Press enter to continuous next test:"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         /* Test 2 */ | 
 |         testUtilNativeAPIs(); | 
 |     } | 
 |     else if (!strcmp(input, "4")) | 
 |     { | 
 | #ifndef WIN32 | 
 |         /* XML changed callback process example for audio driver */ | 
 |         appHandleRegXmlChangedCb(appHandle, xmlChangedCallback); | 
 |         printf("Please push AudioParam xml to %s folder to test the xml changed callback\n", XML_CUS_FOLDER_ON_DEVICE); | 
 |         printf("You can press any key to continue!\n");; | 
 |         getchar();  // waiting inotify thead loop | 
 | #else | 
 |         printf("Not support windows version\n"); | 
 | #endif | 
 |     } | 
 |     else if (!strcmp(input, "5")) | 
 |     { | 
 |         while (1) | 
 |         { | 
 |             if (showDynamicTest(appHandle) == 0) | 
 |             { | 
 |                 break; | 
 |             } | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "6")) | 
 |     { | 
 |         int level; | 
 |         printf("Enter debug level (eg. 0:DEBUG, 1:INFO, 2:WARN, 3:ERR):"); | 
 |         input = utilGetStdin(tmp, BUF_SIZE); | 
 |  | 
 |         level = (int)strtoul(input, NULL, 0); | 
 |         if (level < 0 || level > ERR_LEVEL) | 
 |         { | 
 |             printf("Invalid level value. (%d)\n", level); | 
 |         } | 
 |         else | 
 |         { | 
 |             appSetDebugLevel(level); | 
 |             printf("Set debug level = %d\n", level); | 
 |         } | 
 |     } | 
 |     else if (!strcmp(input, "7")) | 
 |     { | 
 |         appHandleRedirectIOToConsole(); | 
 |     } | 
 |     else if (!strcmp(input, "8")) | 
 |     { | 
 |         printf("APP lib building time stamp: %s\n", appHandleGetBuildTimeStamp()); | 
 |     } | 
 |     return 1; | 
 | } | 
 |  | 
 | int main() | 
 | { | 
 |  | 
 |     AppHandle *appHandle = NULL; | 
 |  | 
 | #ifdef WIN32 | 
 |     AppHandle Handle; | 
 |     /* For Tuning Tool debug usage, used to show the APP lib message to the console */ | 
 |     appHandleRedirectIOToConsole(); | 
 |  | 
 |     /* Init app handle */ | 
 |     appHandleInit(&Handle); | 
 |     appHandle = &Handle; | 
 |  | 
 |     /* Parse the xml in default and cus folder, | 
 |       if cus folder has the same name of XML file, | 
 |       parser will load the cus folder xml instead of default xml folder */ | 
 |     appHandleParseXml(appHandle, XML_FOLDER_ON_TUNING_TOOL, XML_CUS_FOLDER_ON_TUNING_TOOL); | 
 | #else | 
 |     /* Get AppHandle global instance, this API will parse xml automatically */ | 
 |     appHandle = appHandleGetInstance(); | 
 | #endif | 
 |  | 
 |     /* Set the debug level, default is INFO_LEVEL */ | 
 |     appSetDebugLevel(WARN_LEVEL); | 
 |  | 
 |     while (1) | 
 |     { | 
 |         if (showMainMenu(appHandle) == 0) | 
 |         { | 
 |             break; | 
 |         } | 
 |     } | 
 |  | 
 |     /* Release appHandle resources */ | 
 |     appHandleUninit(appHandle); | 
 |  | 
 |     return 0; | 
 | } | 
 |  |