diff options
Diffstat (limited to 'src/4a-internals-hal/4a-internals-hal-mixer-link.c')
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-mixer-link.c | 82 |
1 files changed, 82 insertions, 0 deletions
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, |