diff options
-rw-r--r-- | lib/4a-hal-utilities/4a-hal-utilities-data.c | 195 | ||||
-rw-r--r-- | lib/4a-hal-utilities/4a-hal-utilities-data.h | 47 |
2 files changed, 242 insertions, 0 deletions
diff --git a/lib/4a-hal-utilities/4a-hal-utilities-data.c b/lib/4a-hal-utilities/4a-hal-utilities-data.c index 10fdf27..5bd6b27 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-data.c +++ b/lib/4a-hal-utilities/4a-hal-utilities-data.c @@ -28,6 +28,199 @@ #include "4a-hal-utilities-alsa-data.h" /******************************************************************************* + * Internal Hal - Probed devices structure handling functions * + ******************************************************************************/ + +enum ProbedDeviceClasses HalUtlGetProbedDeviceClassFromString(char *probedDeviceString) +{ + if(! probedDeviceString) + return INVALID_PROBED_DEVICE; + + if(! strcasecmp("static", probedDeviceString)) + return STATIC_PROBED_DEVICE; + + if(! strcasecmp("dynamic", probedDeviceString)) + return DYNAMIC_PROBED_DEVICE; + + if(! strcasecmp("mandatory", probedDeviceString)) + return MANDATORY_PROBED_DEVICE; + + return INVALID_PROBED_DEVICE; +} + +struct InternalHalProbedDevice *HalUtlAddProbedDeviceToProbedDeviceList(struct InternalHalProbedDevice **probedDevicesList) +{ + struct InternalHalProbedDevice *currentProbedDevice; + + if(! probedDevicesList) + return NULL; + + currentProbedDevice = *probedDevicesList; + if(! currentProbedDevice) { + currentProbedDevice = (struct InternalHalProbedDevice *) calloc(1, sizeof(struct InternalHalProbedDevice)); + if(! currentProbedDevice) + return NULL; + + *probedDevicesList = currentProbedDevice; + } + else { + while(currentProbedDevice->next) + currentProbedDevice = currentProbedDevice->next; + + currentProbedDevice->next = calloc(1, sizeof(struct InternalHalProbedDevice)); + if(! currentProbedDevice->next) + return NULL; + + currentProbedDevice = currentProbedDevice->next; + } + + return currentProbedDevice; +} + +int HalUtlRemoveSelectedProbedDeviceFromList(struct InternalHalProbedDevice **probedDevicesList, struct InternalHalProbedDevice *probedDeviceToRemove) +{ + struct InternalHalProbedDevice *currentProbedDevice, *matchingProbedDevice; + + if(! probedDevicesList || ! *probedDevicesList || ! probedDeviceToRemove) + return -1; + + currentProbedDevice = *probedDevicesList; + if(currentProbedDevice == probedDeviceToRemove) { + *probedDevicesList = currentProbedDevice->next; + matchingProbedDevice = currentProbedDevice; + } + else { + while(currentProbedDevice && currentProbedDevice->next != probedDeviceToRemove) + currentProbedDevice = currentProbedDevice->next; + + if(currentProbedDevice) { + matchingProbedDevice = currentProbedDevice->next; + currentProbedDevice->next = currentProbedDevice->next->next; + } + else { + return -2; + } + } + + free(matchingProbedDevice->uid); + + if(matchingProbedDevice->deviceData) { + free(matchingProbedDevice->deviceData->extendedCardNb); + free(matchingProbedDevice->deviceData->cardId); + free(matchingProbedDevice->deviceData->cardShortName); + free(matchingProbedDevice->deviceData->cardLongName); + free(matchingProbedDevice->deviceData->cardDriver); + free(matchingProbedDevice->deviceData->cardMixerName); + free(matchingProbedDevice->deviceData->cardComponents); + free(matchingProbedDevice->deviceData->playbackDeviceId); + free(matchingProbedDevice->deviceData->playbackDeviceName); + + free(matchingProbedDevice->deviceData); + } + + if(matchingProbedDevice->requestedDeviceJ) + json_object_put(matchingProbedDevice->requestedDeviceJ); + + free(matchingProbedDevice); + + return 0; +} + +int HalUtlRemoveAllProbedDevicesFromList(struct InternalHalProbedDevice **probedDevicesList) +{ + int probedDevicesRemoved = 0; + + if(! probedDevicesList) + return -1; + + if(! *probedDevicesList) + return 0; + + while(*probedDevicesList) { + if(HalUtlRemoveSelectedProbedDeviceFromList(probedDevicesList, *probedDevicesList)) + return -2; + + probedDevicesRemoved++; + } + + return probedDevicesRemoved; +} + +int HalUtlGetNumberOfProbedDevicesInList(struct InternalHalProbedDevice **probedDevicesList) +{ + int numberOfProbedDevices = 0; + struct InternalHalProbedDevice *currentProbedDevice; + + if(! probedDevicesList) + return -1; + + currentProbedDevice = *probedDevicesList; + while(currentProbedDevice) { + currentProbedDevice = currentProbedDevice->next; + numberOfProbedDevices++; + } + + return numberOfProbedDevices; +} + +struct InternalHalProbedDevice *HalUtlSearchProbedDeviceDataById(struct InternalHalProbedDevice **probedDevicesList, char *uid) +{ + struct InternalHalProbedDevice *currentProbedDevice; + + if(! probedDevicesList || ! *probedDevicesList || ! uid) + return NULL; + + currentProbedDevice = *probedDevicesList; + while(currentProbedDevice) { + if(! strcmp(uid, currentProbedDevice->uid)) + return currentProbedDevice; + + currentProbedDevice = currentProbedDevice->next; + } + + return NULL; +} + +struct InternalHalDeviceData *HalUtlAllocateAndFillProbedDeviceDataUsingInfoGetResponse(json_object *responseJ) +{ + struct InternalHalDeviceData *currentProbedDeviceData; + + if(! responseJ) + return NULL; + + currentProbedDeviceData = calloc(1, sizeof(struct InternalHalDeviceData)); + if(! currentProbedDeviceData) + return NULL; + + currentProbedDeviceData->cardNb = HAL_UNKNOWN_DEVICE; + currentProbedDeviceData->playbackDeviceNb = HAL_UNKNOWN_DEVICE; + + if(wrap_json_unpack(responseJ, "{s:i, s:s, s:s, s:s, s:s, s:s, s:s, s?:i, s?:s, s?:s !}", + "cardNb", ¤tProbedDeviceData->cardNb, + "cardId", ¤tProbedDeviceData->cardId, + "cardShortName", ¤tProbedDeviceData->cardShortName, + "cardLongName", ¤tProbedDeviceData->cardLongName, + "cardDriver", ¤tProbedDeviceData->cardDriver, + "cardMixerName", ¤tProbedDeviceData->cardMixerName, + "cardComponents", ¤tProbedDeviceData->cardComponents, + "playbackDeviceNb", ¤tProbedDeviceData->playbackDeviceNb, + "playbackDeviceId", ¤tProbedDeviceData->playbackDeviceId, + "playbackDeviceName", ¤tProbedDeviceData->playbackDeviceName) || + currentProbedDeviceData->cardNb == HAL_UNKNOWN_DEVICE || + (currentProbedDeviceData->playbackDeviceNb == HAL_UNKNOWN_DEVICE && + asprintf(¤tProbedDeviceData->extendedCardNb, "hw:%i", currentProbedDeviceData->cardNb) < 0) || + (currentProbedDeviceData->playbackDeviceNb != HAL_UNKNOWN_DEVICE && + asprintf(¤tProbedDeviceData->extendedCardNb, "hw:%i,%i", + currentProbedDeviceData->cardNb, + currentProbedDeviceData->playbackDeviceNb) < 0)) { + free(currentProbedDeviceData); + return NULL; + } + + return currentProbedDeviceData; +} + +/******************************************************************************* * Internal Hal - Streams data handling functions * ******************************************************************************/ @@ -217,6 +410,8 @@ int HalUtlRemoveSelectedHalFromList(struct HalData **halDataList, struct HalData if(matchingHal->internal) { free(matchingHal->internalHalData->mixerApiName); free(matchingHal->internalHalData->prefix); + + HalUtlRemoveAllProbedDevicesFromList(&matchingHal->internalHalData->probedDevicesList); HalUtlRemoveAllMixerData(&matchingHal->internalHalData->streamsData); diff --git a/lib/4a-hal-utilities/4a-hal-utilities-data.h b/lib/4a-hal-utilities/4a-hal-utilities-data.h index dd89078..c072650 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-data.h +++ b/lib/4a-hal-utilities/4a-hal-utilities-data.h @@ -28,6 +28,8 @@ #include "4a-hal-utilities-alsa-data.h" +#define HAL_UNKNOWN_DEVICE -1 + #define HAL_STREAM_UPDATES_EVENT_NAME "stream-updates" // Enum for hal status @@ -37,6 +39,40 @@ enum HalStatus { HAL_STATUS_READY=2 }; +// Enum for probed devices (dependencies) class +enum ProbedDeviceClasses { + INVALID_PROBED_DEVICE=0, + STATIC_PROBED_DEVICE=1, + DYNAMIC_PROBED_DEVICE=2, + MANDATORY_PROBED_DEVICE=3 +}; + +// Structure to store data for audio devices validated by dependencies +struct InternalHalDeviceData { + int cardNb; + char *cardId; + char *cardShortName; + char *cardLongName; + char *cardDriver; + char *cardMixerName; + char *cardComponents; + int playbackDeviceNb; + char *playbackDeviceId; + char *playbackDeviceName; + char *extendedCardNb; +}; + +// Structure to store one provided dependency +struct InternalHalProbedDevice { + char *uid; + enum ProbedDeviceClasses deviceClass; + json_object *requestedDeviceJ; + + struct InternalHalDeviceData *deviceData; + + struct InternalHalProbedDevice *next; +}; + // Structure to store stream data struct InternalHalMixerData { char *verb; @@ -53,6 +89,8 @@ struct InternalHalData { char *prefix; json_object *halMixerJ; + struct InternalHalProbedDevice *probedDevicesList; + struct InternalHalMixerData *streamsData; afb_event_t streamUpdates; @@ -92,6 +130,15 @@ struct HalMgrData { struct HalData *halDataList; }; +// Internal Hal - Probed devices structure handling functions +enum ProbedDeviceClasses HalUtlGetProbedDeviceClassFromString(char *probedDeviceString); +struct InternalHalProbedDevice *HalUtlAddProbedDeviceToProbedDeviceList(struct InternalHalProbedDevice **probedDevicesList); +int HalUtlRemoveSelectedProbedDeviceFromList(struct InternalHalProbedDevice **probedDevicesList, struct InternalHalProbedDevice *probedDeviceToRemove); +int HalUtlRemoveAllProbedDevicesFromList(struct InternalHalProbedDevice **probedDevicesList); +int HalUtlGetNumberOfProbedDevicesInList(struct InternalHalProbedDevice **probedDevicesList); +struct InternalHalProbedDevice *HalUtlSearchProbedDeviceDataById(struct InternalHalProbedDevice **probedDevicesList, char *uid); +struct InternalHalDeviceData *HalUtlAllocateAndFillProbedDeviceDataUsingInfoGetResponse(json_object *responseJ); + // Internal Hal - Streams data handling functions struct InternalHalMixerData *HalUtlAddMixerDataToMixerDataList(struct InternalHalMixerData **mixerDataList); int HalUtlRemoveSelectedMixerData(struct InternalHalMixerData **mixerDataList, struct InternalHalMixerData *mixerDataToRemove); |