/* * 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. */ #ifndef _HAL_UTILITIES_DATA_INCLUDE_ #define _HAL_UTILITIES_DATA_INCLUDE_ #include #include #include #include #include #include "4a-hal-utilities-alsa-data.h" #define HAL_STREAM_UPDATES_EVENT_NAME "stream-updates" // Enum for linked list type enum LinkedListType { LINKED_LIST_FOR_DEPENDENCIES_DATA = 0, LINKED_LIST_FOR_MIXER_DATA = 1, LINKED_LIST_FOR_HALMAP_DATA = 2, LINKED_LIST_FOR_HAL_DATA = 3 }; // Enum for hal status enum HalStatus { HAL_STATUS_INIT_FAILED = 0, HAL_STATUS_UNAVAILABLE = 1, HAL_STATUS_AVAILABLE = 2, HAL_STATUS_READY = 3 }; // Enum for probed devices (dependencies) class enum ProbedDeviceClasses { INVALID_PROBED_DEVICE = 0, STATIC_PROBED_DEVICE = 1, DYNAMIC_PROBED_DEVICE = 2, MANDATORY_PROBED_DEVICE = 3 }; // Enum for dependencies mixer link status enum DependencyMixerStatus { DEPENDENCY_NO_MIXER_LINK = 0, DEPENDENCY_MIXER_LINK_USELESS = 1, DEPENDENCY_MIXER_ATTACH_SUCCEED = 2, DEPENDENCY_MIXER_ATTACH_FAILED = 3 }; // Enum for probed devices (dependencies) info format requested enum DependencyInfoJsonFormat { DEPENDENCY_COMPACT_JSON = 0, DEPENDENCY_FULL_JSON = 1 }; // Enum for probed devices (dependencies) info format requested enum DependencyStatus { UNAVAILABLE_DEPENDENCY = 0, AVAILABLE_DEPENDENCY = 1, ALL_DEPENDENCY = 2 }; // 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; enum DependencyMixerStatus mixerLinkStatus; struct cds_list_head node; }; // Structure to store stream data struct InternalHalMixerData { char *verb; char *verbToCall; char *streamCardId; afb_event_t event; struct cds_list_head node; }; // Structure to store specific internal hal data struct InternalHalData { char *mixerApiName; char *prefix; json_object *halMixerJ; struct cds_list_head probedDevicesListHead; struct cds_list_head streamsDataListHead; afb_event_t streamUpdates; struct cds_list_head halMapListHead; afb_api_t apiHandle; CtlConfigT *ctrlConfig; }; // Structure to store specific hal (internal or external) data struct HalData { char *apiName; enum HalStatus status; char *uid; char *info; unsigned int internal; char *author; char *version; char *date; // Can be beefed up if needed struct InternalHalData *internalHalData; // Can be NULL if external api struct cds_list_head node; }; // Structure to store hal manager data struct HalMgrData { char *apiName; char *info; afb_api_t apiHandle; struct cds_list_head halDataListHead; }; // Internal Hal - Probed devices structure handling functions enum ProbedDeviceClasses HalUtlGetProbedDeviceClassFromString(char *probedDeviceString); char *HalUtlGetProbedDeviceClassString(enum ProbedDeviceClasses deviceClass); void HalUtlFreeSelectedProbedDeviceDataAllocation(struct InternalHalDeviceData *probedDeviceDataToFree); struct InternalHalProbedDevice *HalUtlAddProbedDeviceToProbedDeviceList(struct cds_list_head *probedDevicesListHead); int HalUtlRemoveSelectedProbedDeviceFromList(struct cds_list_head *probedDevicesListHead, struct InternalHalProbedDevice *probedDeviceToRemove); int HalUtlRemoveAllProbedDevicesFromList(struct cds_list_head *probedDevicesListHead); int HalUtlGetNumberOfProbedDevicesInList(struct cds_list_head *probedDevicesListHead); int HalUtlGetNumberOfDynamicProbedDevicesInList(struct cds_list_head *probedDevicesListHead); struct InternalHalProbedDevice *HalUtlSearchProbedDeviceDataById(struct cds_list_head *probedDevicesListHead, char *uid); int HalUtlGetProbedDeviceCardNbUsingUid(struct cds_list_head *probedDevicesListHead, char *uid); struct InternalHalDeviceData *HalUtlAllocateAndFillProbedDeviceDataUsingInfoGetResponse(json_object *responseJ); json_object *HalUtlGetJsonForSpecificDependencies(afb_api_t apiHandle, struct InternalHalProbedDevice *requestedProbedDevice, enum DependencyInfoJsonFormat jsonFormat); json_object *HalUtlGetJsonForSpecificDependenciesUsingUid(afb_api_t apiHandle, struct cds_list_head *probedDevicesListHead, char *uid, enum DependencyInfoJsonFormat jsonFormat); json_object *HalUtlGetJsonArrayForAvailableDependencies(afb_api_t apiHandle, struct cds_list_head *probedDevicesListHead, enum DependencyInfoJsonFormat jsonFormat); json_object *HalUtlGetJsonArrayForAllDependencies(afb_api_t apiHandle, struct cds_list_head *probedDevicesListHead, enum DependencyInfoJsonFormat jsonFormat); json_object *HalUtlGetJsonArrayForAllDependenciesInfoWithHandledDependency(afb_api_t apiHandle, struct cds_list_head *probedDevicesListHead, enum DependencyInfoJsonFormat jsonFormat, char *handledProbedDeviceUid); // Internal Hal - Streams data handling functions struct InternalHalMixerData *HalUtlAddMixerDataToMixerDataList(struct cds_list_head *mixerDataListHead); int HalUtlRemoveSelectedMixerData(struct cds_list_head *mixerDataListHead, struct InternalHalMixerData *mixerDataToRemove); int HalUtlRemoveAllMixerData(struct cds_list_head *mixerDataListHead); int HalUtlGetNumberOfMixerDataInList(struct cds_list_head *mixerDataListHead); struct InternalHalMixerData *HalUtlSearchMixerDataByProperties(struct cds_list_head *mixerDataListHead, char *verb, char *verbToCall, char *streamCardId); json_object *HalUtlGetJsonArrayForSpecificMixerData(afb_api_t apiHandle, struct InternalHalMixerData *mixerData); json_object *HalUtlGetJsonArrayForAllMixersData(afb_api_t apiHandle, struct cds_list_head *mixerDataListHead); // Internal Hal - Alsa Map data handling functions struct InternalHalAlsaMap *HalUtlAddHalMapDataToHalMapDataList(struct cds_list_head *halMapListHead); int HalUtlRemoveSelectedHalMapData(struct cds_list_head *halMapListHead, struct InternalHalAlsaMap *halMapDataToRemove); int HalUtlRemoveAllHalMapData(struct cds_list_head *halMapListHead); int HalUtlGetNumberOfHalMapDataInList(struct cds_list_head *halMapListHead); json_object *HalUtlGetJsonForSpecificDependenciesUsingUid(afb_api_t apiHandle, struct cds_list_head *probedDevicesListHead, char *uid, enum DependencyInfoJsonFormat jsonFormat); json_object *HalUtGetJsonArrayForSpecificHalMapControl(afb_api_t apiHandle, struct InternalHalAlsaMap *currentHalMapData); json_object *HalUtGetJsonArrayForAllHalMapControls(afb_api_t apiHandle, struct cds_list_head *halMapListHead); // Hal data handling functions struct HalData *HalUtlAddHalToHalList(struct cds_list_head *halDataListHead); int HalUtlRemoveSelectedHalFromList(struct cds_list_head *halDataListHead, struct HalData *halToRemove); int HalUtlRemoveAllHalFromList(struct cds_list_head *halDataListHead); int HalUtlGetNumberOfHalInList(struct cds_list_head *halDataListHead); struct HalData *HalUtlSearchHalDataByApiName(struct cds_list_head *halDataListHead, char *apiName); // Hal Manager data handling functions int HalUtlInitializeHalMgrData(afb_api_t apiHandle, struct HalMgrData *halMgrData, char *apiName, char *info); void HalUtlRemoveHalMgrData(struct HalMgrData *halMgrData); #endif /* _HAL_UTILITIES_DATA_INCLUDE_ */