From dd706b1a0d0897130e749bcb5dcfc4fa954697b5 Mon Sep 17 00:00:00 2001 From: Jonathan Aillet Date: Fri, 11 Oct 2019 11:45:48 +0200 Subject: Rework mixer calls to handle dependencies Rework 'attach' mixer calls to handle dependencies individually. That means that an attach call will be performed for each dependency. To avoid errors when calling mixer, complete list of dependencies should be send to it, but we can specify which dependency we want to be processed using 'handled' key. BUG-AGL: SPEC-2887 Change-Id: I9db7391fe7a44ba045fd82d94221a1442b7c2198 Signed-off-by: Jonathan Aillet --- lib/4a-hal-utilities/4a-hal-utilities-data.h | 9 ++++++++ src/4a-internals-hal/4a-internals-hal-cb.c | 25 +++++++++++++++++----- src/4a-internals-hal/4a-internals-hal-mixer-link.c | 14 +++++++----- src/4a-internals-hal/4a-internals-hal-mixer-link.h | 2 +- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/lib/4a-hal-utilities/4a-hal-utilities-data.h b/lib/4a-hal-utilities/4a-hal-utilities-data.h index e57bd85..38cade6 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-data.h +++ b/lib/4a-hal-utilities/4a-hal-utilities-data.h @@ -56,6 +56,14 @@ enum ProbedDeviceClasses { 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, @@ -91,6 +99,7 @@ struct InternalHalProbedDevice { json_object *requestedDeviceJ; struct InternalHalDeviceData *deviceData; + enum DependencyMixerStatus mixerLinkStatus; struct cds_list_head node; }; diff --git a/src/4a-internals-hal/4a-internals-hal-cb.c b/src/4a-internals-hal/4a-internals-hal-cb.c index c5f19a2..1e872bb 100644 --- a/src/4a-internals-hal/4a-internals-hal-cb.c +++ b/src/4a-internals-hal/4a-internals-hal-cb.c @@ -725,6 +725,7 @@ int InternalHalHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_ob CtlConfigT *ctrlConfig; struct HalData *currentHalData; + struct InternalHalProbedDevice *currentProbedDevice; if(! apiHandle || ! section) return -1; @@ -752,17 +753,31 @@ int InternalHalHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_ob return -6; if(prefix) { - currentHalData->internalHalData->prefix = strdup(prefix); + currentHalData->internalHalData->prefix = strdup(prefix); if(! currentHalData->internalHalData->prefix) return -7; } } else if(currentHalData->status == HAL_STATUS_AVAILABLE) { - err = InternalHalAttachToMixer(apiHandle); - if(err) { - AFB_API_ERROR(apiHandle, "Error %i while attaching to mixer", err); - return -8; + cds_list_for_each_entry(currentProbedDevice, ¤tHalData->internalHalData->probedDevicesListHead, node) { + if(! currentProbedDevice->deviceData) { + currentProbedDevice->mixerLinkStatus = DEPENDENCY_MIXER_LINK_USELESS; + continue; + } + + if(currentProbedDevice->mixerLinkStatus == DEPENDENCY_MIXER_ATTACH_SUCCEED) { + AFB_API_WARNING(apiHandle, "Mixer status is already initialized, moving to next one"); + continue; + } + + err = InternalHalAttachDependencyToMixer(apiHandle, currentProbedDevice); + if(err) { + AFB_API_ERROR(apiHandle, "Error %i while attaching to mixer", err); + return -8; + } } + + currentHalData->status = HAL_STATUS_READY; } return 0; 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 56dc840..a1b87b0 100644 --- a/src/4a-internals-hal/4a-internals-hal-mixer-link.c +++ b/src/4a-internals-hal/4a-internals-hal-mixer-link.c @@ -142,7 +142,7 @@ int InternalHalHandleMixerAttachResponse(afb_api_t apiHandle, struct InternalHal return 0; } -int InternalHalAttachToMixer(afb_api_t apiHandle) +int InternalHalAttachDependencyToMixer(afb_api_t apiHandle, struct InternalHalProbedDevice *probedDeviceToAttach) { int err = 0, mixerError; @@ -194,9 +194,10 @@ int InternalHalAttachToMixer(afb_api_t apiHandle) return -6; } - dependencyJ = HalUtlGetJsonArrayForAllDependencies(apiHandle, - ¤tHalData->internalHalData->probedDevicesListHead, - DEPENDENCY_COMPACT_JSON); + dependencyJ = HalUtlGetJsonArrayForAllDependenciesInfoWithHandledDependency(apiHandle, + ¤tHalData->internalHalData->probedDevicesListHead, + DEPENDENCY_COMPACT_JSON, + probedDeviceToAttach->uid); if(! dependencyJ) { AFB_API_ERROR(apiHandle, "Didn't succeed to generate available dependencies compact json array"); return -7; @@ -251,10 +252,13 @@ int InternalHalAttachToMixer(afb_api_t apiHandle) MIXER_ATTACH_VERB, apiToCall, json_object_get_string(responseJ)); - currentHalData->status = HAL_STATUS_READY; } } + if(err) + probedDeviceToAttach->mixerLinkStatus = DEPENDENCY_MIXER_ATTACH_FAILED; + else + probedDeviceToAttach->mixerLinkStatus = DEPENDENCY_MIXER_ATTACH_SUCCEED; if(responseJ) json_object_put(responseJ); 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 7132aca..b22b5b2 100644 --- a/src/4a-internals-hal/4a-internals-hal-mixer-link.h +++ b/src/4a-internals-hal/4a-internals-hal-mixer-link.h @@ -34,7 +34,7 @@ #define HAL_ALL_STREAMS_VERB "all-streams" // Internals HAL handle mixer calls functions -int InternalHalAttachToMixer(afb_api_t apiHandle); +int InternalHalAttachDependencyToMixer(afb_api_t apiHandle, struct InternalHalProbedDevice *probedDeviceToAttach); int InternalHalGetInfoFromMixer(afb_api_t apiHandle, char *apiToCall, json_object *requestJson, -- cgit 1.2.3-korg