diff options
author | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2019-05-23 10:41:50 +0200 |
---|---|---|
committer | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2019-05-24 16:35:06 +0200 |
commit | 7095c40c09e2afec2382e1307b8bb134496282e3 (patch) | |
tree | 3030bbaf2c40b5087912129d5e654e136d006d5a | |
parent | e20fca4d144c431dd58face1be7d996ce15815f1 (diff) |
Rework mixer answer handling
Rework mixer answer handling to make it simpler and
to avoid fanciful returns.
Add some error prints to help diagnostic in case of
mixer answer handling error.
BUG-AGL : SPEC-2329
Change-Id: I14fe86496585bdc66b8aa761f4ff2c56333c5515
Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
5 files changed, 131 insertions, 53 deletions
diff --git a/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c b/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c index 806387a..9e03f33 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c +++ b/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c @@ -291,14 +291,66 @@ struct InternalHalMixerData *HalUtlAddStreamDataAndCreateStreamVerb(afb_api_t ap return createdStreamData; } +int HalUtlRemoveStreamDataAndDeleteStreamVerbUsingMixerData(afb_api_t apiHandle, + struct InternalHalMixerData *toRemoveStreamData) +{ + int returnedErr, wrapRet; + + json_object *streamRemovedEventJ; + + CtlConfigT *ctrlConfig; + + struct HalData *currentHalData; + + if(! apiHandle || ! toRemoveStreamData) + return -1; + + ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle); + if(! ctrlConfig) + return -2; + + currentHalData = (struct HalData *) getExternalData(ctrlConfig); + if((! currentHalData) || + (! currentHalData->internalHalData) || + (! currentHalData->internalHalData->streamsData) || + (! currentHalData->internalHalData->streamUpdates)) + return -3; + + if(afb_api_del_verb(apiHandle, toRemoveStreamData->verb, NULL)) { + AFB_API_ERROR(apiHandle,"Error while deleting verb for stream : '%s'", toRemoveStreamData->verb); + return -4; + } + + wrapRet = wrap_json_pack(&streamRemovedEventJ, + "{s:s, s:s, s:s}", + "action", "removed", + "name", toRemoveStreamData->verb, + "cardId", toRemoveStreamData->streamCardId); + if(wrapRet) { + AFB_API_ERROR(apiHandle,"Didn't succeed to allocate removed stream event json object"); + return -5; + } + + returnedErr = HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsData, toRemoveStreamData); + if(returnedErr) { + AFB_API_ERROR(apiHandle, + "Error %i while removing data for stream", + returnedErr); + json_object_put(streamRemovedEventJ); + return -6; + } + + afb_event_push(currentHalData->internalHalData->streamUpdates, streamRemovedEventJ); + + return 0; +} + int HalUtlRemoveStreamDataAndDeleteStreamVerb(afb_api_t apiHandle, char *verb, char *verbToCall, char *streamCardId) { - int returnedErr = 0, wrapRet; - - json_object *streamRemovedEventJ; + int returnedErr; CtlConfigT *ctrlConfig; @@ -324,30 +376,42 @@ int HalUtlRemoveStreamDataAndDeleteStreamVerb(afb_api_t apiHandle, if(! toRemoveStreamData) return -4; - if(afb_api_del_verb(apiHandle, verb, NULL)) { - AFB_API_ERROR(apiHandle,"Error while deleting verb for stream : '%s'", verb); - json_object_put(streamRemovedEventJ); + returnedErr = HalUtlRemoveStreamDataAndDeleteStreamVerbUsingMixerData(apiHandle, + toRemoveStreamData); + if(returnedErr) { + AFB_API_ERROR(apiHandle, + "Error %i while removing verb and data for stream : '%s'", + returnedErr, + verb); return -5; } - returnedErr = HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsData, toRemoveStreamData); - if(returnedErr) { - AFB_API_ERROR(apiHandle,"Error %i while removing data for stream : '%s'", returnedErr, verb); - json_object_put(streamRemovedEventJ); - return -6; - } + return 0; +} - wrapRet = wrap_json_pack(&streamRemovedEventJ, - "{s:s, s:s, s:s}", - "action", "removed", - "name", toRemoveStreamData->verb, - "cardId", toRemoveStreamData->streamCardId); - if(wrapRet) { - AFB_API_ERROR(apiHandle,"Didn't succeed to allocate removed stream event json object"); - return -7; - } +int HalUtlRemoveAllStreamsDataAndDeleteAllStreamsVerb(afb_api_t apiHandle) +{ + CtlConfigT *ctrlConfig; - afb_event_push(currentHalData->internalHalData->streamUpdates, streamRemovedEventJ); + struct HalData *currentHalData; + + if(! apiHandle) + return -1; + + ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle); + if(! ctrlConfig) + return -2; + + currentHalData = (struct HalData *) getExternalData(ctrlConfig); + if((! currentHalData) || + (! currentHalData->internalHalData)) + return -3; + + while(currentHalData->internalHalData->streamsData) { + if(HalUtlRemoveStreamDataAndDeleteStreamVerbUsingMixerData(apiHandle, + currentHalData->internalHalData->streamsData)) + return -4; + } return 0; }
\ No newline at end of file diff --git a/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.h b/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.h index e6f0d99..3345da3 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.h +++ b/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.h @@ -43,5 +43,6 @@ int HalUtlRemoveStreamDataAndDeleteStreamVerb(afb_api_t apiHandle, char *verb, char *verbToCall, char *streamCardId); +int HalUtlRemoveAllStreamsDataAndDeleteAllStreamsVerb(afb_api_t apiHandle); #endif /* _HAL_UTILITIES_HAL_STREAMS_CREATION_INCLUDE_ */
\ No newline at end of file diff --git a/src/4a-internals-hal/4a-internals-hal-cb.c b/src/4a-internals-hal/4a-internals-hal-cb.c index 4c5fb68..10ed6c0 100644 --- a/src/4a-internals-hal/4a-internals-hal-cb.c +++ b/src/4a-internals-hal/4a-internals-hal-cb.c @@ -338,6 +338,7 @@ int InternalHalProcessAllHalMap(afb_api_t apiHandle, json_object *AlsaMapJ, stru struct InternalHalAlsaMap *ctlMaps; + json_object *currentAlsaMapJ; json_type alsaMapType; alsaMapType = json_object_get_type(AlsaMapJ); @@ -363,8 +364,18 @@ int InternalHalProcessAllHalMap(afb_api_t apiHandle, json_object *AlsaMapJ, stru return -2; } - for(idx = 0; idx < currentInternalHalAlsaMapT->ctlsCount; idx++) - err += InternalHalProcessOneHalMapObject(apiHandle, &ctlMaps[idx], alsaMapType == json_type_array ? json_object_array_get_idx(AlsaMapJ, idx) : AlsaMapJ); + for(idx = 0; idx < currentInternalHalAlsaMapT->ctlsCount; idx++) { + currentAlsaMapJ = (alsaMapType == json_type_array) ? json_object_array_get_idx(AlsaMapJ, idx) : AlsaMapJ; + err = InternalHalProcessOneHalMapObject(apiHandle, &ctlMaps[idx], currentAlsaMapJ); + if(err) { + AFB_API_ERROR(apiHandle, + "Didn't succeed to proccess halmap object %i ('%s')", + idx, + json_object_get_string(currentAlsaMapJ)); + HalUtlFreeAlsaCtlsMap(currentInternalHalAlsaMapT); + return -3; + } + } currentInternalHalAlsaMapT->ctls = ctlMaps; @@ -381,8 +392,16 @@ int InternalHalHandleAllHalMap(afb_api_t apiHandle, int sndCardId, struct Intern InternalHalSubscribeToAlsaCardEvent(apiHandle, cardIdString); - for(idx = 0; idx < currentInternalHalAlsaMapT->ctlsCount; idx++) - err += InternalHalHandleOneHalMapObject(apiHandle, cardIdString, ¤tInternalHalAlsaMapT->ctls[idx]); + for(idx = 0; idx < currentInternalHalAlsaMapT->ctlsCount; idx++) { + err = InternalHalHandleOneHalMapObject(apiHandle, cardIdString, ¤tInternalHalAlsaMapT->ctls[idx]); + if(err) { + AFB_API_ERROR(apiHandle, + "Didn't succeed to handle halmap object %i ('%s')", + idx, + json_object_get_string(currentInternalHalAlsaMapT->ctls[idx].actionJ)); + return -3; + } + } return err; } 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 96f3e89..d5b9be9 100644 --- a/src/4a-internals-hal/4a-internals-hal-mixer-link.c +++ b/src/4a-internals-hal/4a-internals-hal-mixer-link.c @@ -40,7 +40,6 @@ int InternalHalHandleMixerData(afb_api_t apiHandle, json_object *currentDataJ) { int idx, mixerDataNb, verbStart, size; - int err = (int) MIXER_NO_ERROR; char *currentDataVerbName, *currentStreamCardId; @@ -60,7 +59,7 @@ int InternalHalHandleMixerData(afb_api_t apiHandle, default: mixerDataNb = 0; AFB_API_ERROR(apiHandle, "No data returned"); - return (int) MIXER_ERROR_DATA_EMPTY; + return -1; } for(idx = 0; idx < mixerDataNb; idx++) { @@ -71,11 +70,11 @@ int InternalHalHandleMixerData(afb_api_t apiHandle, if(wrap_json_unpack(currentJ, "{s:s}", "verb", ¤tDataVerbName)) { AFB_API_ERROR(apiHandle, "Can't find verb in current data object"); - err += (int) MIXER_ERROR_DATA_NAME_UNAVAILABLE; + return -2; } else if(wrap_json_unpack(currentJ, "{s:s}", "alsa", ¤tStreamCardId)) { AFB_API_ERROR(apiHandle, "Can't find card id in current data object"); - err += (int) MIXER_ERROR_DATA_CARDID_UNAVAILABLE; + return -3; } else { size = (int) strlen(currentDataVerbName); @@ -96,36 +95,43 @@ int InternalHalHandleMixerData(afb_api_t apiHandle, AFB_API_ERROR(apiHandle, "Error while adding stream '%s'", currentDataVerbName); - err += (int) MIXER_ERROR_STREAM_NOT_ADDED; + HalUtlRemoveAllStreamsDataAndDeleteAllStreamsVerb(apiHandle); + return -4; } } } - return err; + return 0; } int InternalHalHandleMixerAttachResponse(afb_api_t apiHandle, struct InternalHalData *currentHalSpecificData, json_object *mixerResponseJ) { - int err = (int) MIXER_NO_ERROR; + int err; json_object *mixerStreamsJ = NULL; if(! apiHandle) { AFB_API_ERROR(apiHandle, "Can't get current hal api handle"); - return (int) MIXER_ERROR_API_UNAVAILABLE; + return -1; } if(wrap_json_unpack(mixerResponseJ, "{s?:o}", "streams", &mixerStreamsJ)) { AFB_API_ERROR(apiHandle, "Can't get streams object in '%s'", json_object_get_string(mixerResponseJ)); - return (int) MIXER_ERROR_DATA_UNAVAILABLE; + return -2; } if(mixerStreamsJ) { - err += InternalHalHandleMixerData(apiHandle, ¤tHalSpecificData->streamsData, mixerStreamsJ); - if(err) - AFB_API_ERROR(apiHandle, "Error during handling response mixer streams data '%s'", json_object_get_string(mixerStreamsJ)); + err = InternalHalHandleMixerData(apiHandle, ¤tHalSpecificData->streamsData, mixerStreamsJ); + if(err) { + AFB_API_ERROR(apiHandle, + "Error %i during handling response mixer streams data '%s'", + err, + json_object_get_string(mixerStreamsJ)); + HalUtlRemoveAllMixerData(¤tHalSpecificData->streamsData); + return -3; + } } if(! currentHalSpecificData->streamsData) { @@ -140,10 +146,10 @@ int InternalHalHandleMixerAttachResponse(afb_api_t apiHandle, struct InternalHal 0, 0)) { AFB_API_ERROR(apiHandle, "Error while creating verb for all streams : '%s'", HAL_ALL_STREAMS_VERB); - return (int) MIXER_ERROR_ALL_STREAMS_VERB_NOT_CREATED; + return -4; } - return err; + return 0; } int InternalHalAttachToMixer(afb_api_t apiHandle) @@ -218,7 +224,7 @@ int InternalHalAttachToMixer(afb_api_t apiHandle) } else { mixerError = InternalHalHandleMixerAttachResponse(apiHandle, currentHalData->internalHalData, responseJ); - if(mixerError != (int) MIXER_NO_ERROR) { + if(mixerError) { AFB_API_ERROR(apiHandle, "Seems that %s call to api %s succeed but this warning was risen by response decoder : %i '%s'", MIXER_ATTACH_VERB, 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 cc069fc..7132aca 100644 --- a/src/4a-internals-hal/4a-internals-hal-mixer-link.h +++ b/src/4a-internals-hal/4a-internals-hal-mixer-link.h @@ -33,18 +33,6 @@ #define HAL_ALL_STREAMS_VERB "all-streams" -// Enum for the type of error detected -enum MixerStatus { - MIXER_NO_ERROR=0, - MIXER_ERROR_API_UNAVAILABLE=-1, - MIXER_ERROR_DATA_UNAVAILABLE=-2, - MIXER_ERROR_DATA_EMPTY =-3, - MIXER_ERROR_ALL_STREAMS_VERB_NOT_CREATED =-4, - MIXER_ERROR_DATA_NAME_UNAVAILABLE=-10, - MIXER_ERROR_DATA_CARDID_UNAVAILABLE=-100, - MIXER_ERROR_STREAM_NOT_ADDED =-1000 -}; - // Internals HAL handle mixer calls functions int InternalHalAttachToMixer(afb_api_t apiHandle); int InternalHalGetInfoFromMixer(afb_api_t apiHandle, |