From 4f44ee8f17789ac27cd1e29a451ac450c7dbeb06 Mon Sep 17 00:00:00 2001 From: Jonathan Aillet Date: Mon, 7 Jan 2019 11:30:12 +0100 Subject: Turn '4a-hal-utilities' into an internal library That way, includes will be cleaner and '4a-hal-utilities' functions will be usable in plugin. Change-Id: I8a2146bd4e5dd5ef449b9ba7f2b1eed4d59045d3 Signed-off-by: Jonathan Aillet --- 4a-hal-utilities/4a-hal-utilities-data.c | 243 +++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 4a-hal-utilities/4a-hal-utilities-data.c (limited to '4a-hal-utilities/4a-hal-utilities-data.c') diff --git a/4a-hal-utilities/4a-hal-utilities-data.c b/4a-hal-utilities/4a-hal-utilities-data.c new file mode 100644 index 0000000..4bb19a8 --- /dev/null +++ b/4a-hal-utilities/4a-hal-utilities-data.c @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2018 "IoT.bzh" + * Author Jonathan Aillet + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define _GNU_SOURCE + +#include +#include + +#include + +#include "4a-hal-utilities-data.h" +#include "4a-hal-utilities-alsa-data.h" + +/******************************************************************************* + * Specfic Hal controller streams data handling functions * + ******************************************************************************/ + +uint8_t HalUtlRemoveAllCtlHalStreamsData(struct CtlHalMixerDataT *ctlHalStreamsData) +{ + unsigned int cpt; + + if(! ctlHalStreamsData) + return -1; + + if(! ctlHalStreamsData->count) + return -2; + + for(cpt = 0; cpt < ctlHalStreamsData->count; cpt++) { + free(ctlHalStreamsData->data[cpt].verb); + free(ctlHalStreamsData->data[cpt].verbToCall); + free(ctlHalStreamsData->data[cpt].streamCardId); + } + + free(ctlHalStreamsData->data); + + return 0; +} + +/******************************************************************************* + * Specfic Hal data handling functions * + ******************************************************************************/ + +struct SpecificHalData *HalUtlAddHalApiToHalList(struct SpecificHalData **firstHalData) +{ + struct SpecificHalData *currentApi; + + if(! firstHalData) + return NULL; + + currentApi = *firstHalData; + + if(! currentApi) { + currentApi = (struct SpecificHalData *) calloc(1, sizeof(struct SpecificHalData)); + if(! currentApi) + return NULL; + + *firstHalData = currentApi; + } + else { + while(currentApi->next) + currentApi = currentApi->next; + + currentApi->next = calloc(1, sizeof(struct SpecificHalData)); + if(! currentApi) + return NULL; + + currentApi = currentApi->next; + } + + memset(currentApi, 0, sizeof(struct SpecificHalData)); + + return currentApi; +} + +int8_t HalUtlRemoveSelectedHalFromList(struct SpecificHalData **firstHalData, struct SpecificHalData *apiToRemove) +{ + struct SpecificHalData *currentApi, *matchingApi; + + if(! firstHalData || ! apiToRemove) + return -1; + + currentApi = *firstHalData; + + if(currentApi == apiToRemove) { + *firstHalData = currentApi->next; + matchingApi = currentApi; + } + else { + while(currentApi && currentApi->next != apiToRemove) + currentApi = currentApi->next; + + if(currentApi) { + matchingApi = currentApi->next; + currentApi->next = currentApi->next->next; + } + else { + return -2; + } + } + + if(! matchingApi->internal) { + free(matchingApi->apiName); + free(matchingApi->sndCardPath); + free(matchingApi->info); + free(matchingApi->author); + free(matchingApi->version); + free(matchingApi->date); + } + else { + HalUtlRemoveAllCtlHalStreamsData(&matchingApi->ctlHalSpecificData->ctlHalStreamsData); + + HalUtlFreeAlsaCtlsMap(matchingApi->ctlHalSpecificData->ctlHalAlsaMapT); + + free(matchingApi->ctlHalSpecificData); + } + + free(matchingApi); + + return 0; +} + +int64_t HalUtlRemoveAllHalFromList(struct SpecificHalData **firstHalData) +{ + int8_t ret; + int64_t CtlHalApiRemoved = 0; + + while(*firstHalData) { + ret = HalUtlRemoveSelectedHalFromList(firstHalData, *firstHalData); + if(ret) + return (int64_t) ret; + + CtlHalApiRemoved++; + } + + return CtlHalApiRemoved; +} + +int64_t HalUtlGetNumberOfHalInList(struct SpecificHalData **firstHalData) +{ + int64_t numberOfCtlHal = 0; + struct SpecificHalData *currentApi; + + if(! firstHalData) + return -1; + + currentApi = *firstHalData; + + while(currentApi) { + currentApi = currentApi->next; + numberOfCtlHal++; + } + + return numberOfCtlHal; +} + +struct SpecificHalData *HalUtlSearchHalDataByApiName(struct SpecificHalData **firstHalData, char *apiName) +{ + struct SpecificHalData *currentApi; + + if(! firstHalData || ! apiName) + return NULL; + + currentApi = *firstHalData; + + while(currentApi) { + if(! strcmp(apiName, currentApi->apiName)) + return currentApi; + + currentApi = currentApi->next; + } + + return NULL; +} + + +struct SpecificHalData *HalUtlSearchReadyHalDataByCarId(struct SpecificHalData **firstHalData, int cardId) +{ + struct SpecificHalData *currentApi; + + if(! firstHalData) + return NULL; + + currentApi = *firstHalData; + while(currentApi) { + if(currentApi->status == HAL_STATUS_READY && currentApi->sndCardId == cardId) + return currentApi; + + currentApi = currentApi->next; + } + + return NULL; +} + +/******************************************************************************* + * Hal Manager data handling functions * + ******************************************************************************/ + +uint8_t HalUtlInitializeHalMgrData(AFB_ApiT apiHandle, struct HalMgrData *HalMgrGlobalData, char *apiName, char *info) +{ + if(! apiHandle || ! HalMgrGlobalData || ! apiName || ! info) + return -1; + + // Allocate and fill apiName and info strings + HalMgrGlobalData->apiName = strdup(apiName); + if(! HalMgrGlobalData->apiName) + return -2; + + HalMgrGlobalData->info = strdup(info); + if(! HalMgrGlobalData->apiName) + return -3; + + HalMgrGlobalData->apiHandle = apiHandle; + + return 0; +} + +void HalUtlRemoveHalMgrData(struct HalMgrData *HalMgrGlobalData) +{ + if(! HalMgrGlobalData) + return; + + if(HalMgrGlobalData->first) + HalUtlRemoveAllHalFromList(&HalMgrGlobalData->first); + + free(HalMgrGlobalData->apiName); + free(HalMgrGlobalData->info); + + free(HalMgrGlobalData); +} \ No newline at end of file -- cgit 1.2.3-korg