blob: 53b9612147416dedb375cb21e92e352a3c9fd5aa [file] [log] [blame]
#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, &paramData, &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;
}