From 1b07640d75f5a3c70655c629340e0263a21a2ff8 Mon Sep 17 00:00:00 2001 From: Jonathan Aillet Date: Fri, 11 Oct 2019 11:48:47 +0200 Subject: Add function to 'detach' dependency from mixer Add function to perform a 'detach' verb call to mixer to detach a dependency. This will be useful for 'dynamic' dependency handling. BUG-AGL: SPEC-2888 Change-Id: I4468b9fb0dedb79b637883ef88683274713765fa Signed-off-by: Jonathan Aillet --- lib/4a-hal-utilities/4a-hal-utilities-data.h | 4 +- src/4a-internals-hal/4a-internals-hal-mixer-link.c | 82 ++++++++++++++++++++++ src/4a-internals-hal/4a-internals-hal-mixer-link.h | 2 + 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/lib/4a-hal-utilities/4a-hal-utilities-data.h b/lib/4a-hal-utilities/4a-hal-utilities-data.h index 38cade6..69ba747 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-data.h +++ b/lib/4a-hal-utilities/4a-hal-utilities-data.h @@ -61,7 +61,9 @@ enum DependencyMixerStatus { DEPENDENCY_NO_MIXER_LINK = 0, DEPENDENCY_MIXER_LINK_USELESS = 1, DEPENDENCY_MIXER_ATTACH_SUCCEED = 2, - DEPENDENCY_MIXER_ATTACH_FAILED = 3 + DEPENDENCY_MIXER_ATTACH_FAILED = 3, + DEPENDENCY_MIXER_DETACH_SUCCEED = 4, + DEPENDENCY_MIXER_DETACH_FAILED = 5 }; // Enum for probed devices (dependencies) info format requested diff --git a/src/4a-internals-hal/4a-internals-hal-mixer-link.c b/src/4a-internals-hal/4a-internals-hal-mixer-link.c index a1b87b0..19fb3a0 100644 --- a/src/4a-internals-hal/4a-internals-hal-mixer-link.c +++ b/src/4a-internals-hal/4a-internals-hal-mixer-link.c @@ -259,6 +259,7 @@ int InternalHalAttachDependencyToMixer(afb_api_t apiHandle, struct InternalHalPr probedDeviceToAttach->mixerLinkStatus = DEPENDENCY_MIXER_ATTACH_FAILED; else probedDeviceToAttach->mixerLinkStatus = DEPENDENCY_MIXER_ATTACH_SUCCEED; + if(responseJ) json_object_put(responseJ); @@ -268,6 +269,87 @@ int InternalHalAttachDependencyToMixer(afb_api_t apiHandle, struct InternalHalPr return err; } +int InternalHalDetachDependencyToMixer(afb_api_t apiHandle, struct InternalHalProbedDevice *probedDeviceToDetach) +{ + int err, toReturn = 0; + + char *apiToCall, *returnedError = NULL, *returnedInfo = NULL; + + CtlConfigT *ctrlConfig; + + struct HalData *currentHalData; + + json_object *requestJ, *dependencyJ, *responseJ = NULL; + + if(! apiHandle) { + AFB_API_ERROR(apiHandle, "Can't get current internal hal api handle"); + return -1; + } + + ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle); + if(! ctrlConfig) { + AFB_API_ERROR(apiHandle, "Can't get current internal hal controller config"); + return -2; + } + + currentHalData = (struct HalData *) getExternalData(ctrlConfig); + if(! currentHalData) { + AFB_API_ERROR(apiHandle, "Can't get current internal hal controller data"); + return -3; + } + + apiToCall = currentHalData->internalHalData->mixerApiName; + if(! apiToCall) { + AFB_API_ERROR(apiHandle, "Can't get mixer api"); + return -4; + } + + dependencyJ = HalUtlGetJsonForSpecificDependenciesUsingUid(apiHandle, + ¤tHalData->internalHalData->probedDevicesListHead, + probedDeviceToDetach->uid, + DEPENDENCY_COMPACT_JSON); + if(! dependencyJ) { + AFB_API_ERROR(apiHandle, "Didn't succeed to get dependency %s compact json array", probedDeviceToDetach->uid); + return -5; + } + + err = wrap_json_pack(&requestJ, "{s:o}", "dependencies", dependencyJ); + if(err) { + AFB_API_ERROR(apiHandle, + "Didn't succeed to allocate detach dependency %s request json", probedDeviceToDetach->uid); + return -6; + } + + if(afb_api_call_sync(apiHandle, + apiToCall, + MIXER_DETACH_VERB, + requestJ, + &responseJ, + &returnedError, + &returnedInfo)) { + AFB_API_ERROR(apiHandle, + "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s'", + MIXER_DETACH_VERB, + apiToCall, + returnedError ? returnedError : "not returned", + returnedInfo ? returnedInfo : "not returned"); + toReturn = -7; + } + + if(toReturn) + probedDeviceToDetach->mixerLinkStatus = DEPENDENCY_MIXER_DETACH_FAILED; + else + probedDeviceToDetach->mixerLinkStatus = DEPENDENCY_MIXER_DETACH_SUCCEED; + + if(responseJ) + json_object_put(responseJ); + + free(returnedError); + free(returnedInfo); + + return toReturn; +} + int InternalHalGetInfoFromMixer(afb_api_t apiHandle, char *apiToCall, json_object *requestJson, diff --git a/src/4a-internals-hal/4a-internals-hal-mixer-link.h b/src/4a-internals-hal/4a-internals-hal-mixer-link.h index b22b5b2..af80844 100644 --- a/src/4a-internals-hal/4a-internals-hal-mixer-link.h +++ b/src/4a-internals-hal/4a-internals-hal-mixer-link.h @@ -29,12 +29,14 @@ #include "4a-hal-utilities-data.h" #define MIXER_ATTACH_VERB "attach" +#define MIXER_DETACH_VERB "detach" #define MIXER_INFO_VERB "info" #define HAL_ALL_STREAMS_VERB "all-streams" // Internals HAL handle mixer calls functions int InternalHalAttachDependencyToMixer(afb_api_t apiHandle, struct InternalHalProbedDevice *probedDeviceToAttach); +int InternalHalDetachDependencyToMixer(afb_api_t apiHandle, struct InternalHalProbedDevice *probedDeviceToDetach); int InternalHalGetInfoFromMixer(afb_api_t apiHandle, char *apiToCall, json_object *requestJson, -- cgit 1.2.3-korg