From 8943be0ab8f315d935c9bfe7b46523c4e94b0025 Mon Sep 17 00:00:00 2001 From: Jonathan Aillet Date: Fri, 1 Jun 2018 22:44:21 +0200 Subject: Handle mixer response after its init Handle mixer response to get created streams and them corresponding card ids after mixer initialization. Store these informations into the controller hal data strucure. Creation of a verb for each stream is now handle at response handling. Remove unnecessary function because we don't need to search for a stream by his name. Change-Id: Id9e598668b071ca18d152b57e71109314025f698 Signed-off-by: Jonathan Aillet --- .../4a-hal-controllers-mixer-handler.c | 101 +++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c (limited to '4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c') diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c new file mode 100644 index 0000000..21c99af --- /dev/null +++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2016 "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. + */ + +#define _GNU_SOURCE + +#include +#include +#include + +#include "../4a-hal-utilities/4a-hal-utilities-verbs-loader.h" + +#include "4a-hal-controllers-mixer-handler.h" +#include "4a-hal-controllers-cb.h" + +/******************************************************************************* + * HAL controllers hanlde mixer responses functions * + ******************************************************************************/ + +int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT *currentHalStreamsData, json_object *mixerResponseJ) +{ + int err = 0; + unsigned int idx; + + char *currentStreamName, *currentStreamCardId; + + AFB_ApiT apiHandle; + + struct HalUtlApiVerb *CtlHalDynApiStreamVerbs; + + json_object *currentStreamJ; + + apiHandle = (AFB_ApiT) afb_request_get_dynapi(request); + if(! apiHandle) { + AFB_ReqWarning(request, "%s: Can't get current hal api handle", __func__); + return -1; + } + + switch(json_object_get_type(mixerResponseJ)) { + case json_type_object: + currentHalStreamsData->count = 1; + break; + case json_type_array: + currentHalStreamsData->count = json_object_array_length(mixerResponseJ); + break; + default: + currentHalStreamsData->count = 0; + AFB_ReqWarning(request, "%s: no streams returned", __func__); + return -2; + } + + currentHalStreamsData->data = (struct CtlHalStreamData *) calloc(currentHalStreamsData->count, sizeof(struct CtlHalStreamData)); + + CtlHalDynApiStreamVerbs = alloca((currentHalStreamsData->count + 1) * sizeof(struct HalUtlApiVerb)); + memset(CtlHalDynApiStreamVerbs, '\0', (currentHalStreamsData->count + 1) * sizeof(struct HalUtlApiVerb)); + CtlHalDynApiStreamVerbs[currentHalStreamsData->count].verb = NULL; + + for(idx = 0; idx < currentHalStreamsData->count; idx++) { + if(currentHalStreamsData->count > 1) + currentStreamJ = json_object_array_get_idx(mixerResponseJ, (int) idx); + else + currentStreamJ = mixerResponseJ; + + if(wrap_json_unpack(currentStreamJ, "{s:s}", "uid", ¤tStreamName)) { + AFB_ReqWarning(request, "%s: can't find name in current stream object", __func__); + err -= 10; + } + else if(wrap_json_unpack(currentStreamJ, "{s:s}", "alsa", ¤tStreamCardId)) { + AFB_ReqWarning(request, "%s: can't find card id in current stream object", __func__); + err -= 1000; + } + else { + currentHalStreamsData->data[idx].name = strdup(currentStreamName); + currentHalStreamsData->data[idx].cardId = strdup(currentStreamCardId); + + CtlHalDynApiStreamVerbs[idx].verb = currentStreamName; + CtlHalDynApiStreamVerbs[idx].callback = HalCtlsActionOnStream; + CtlHalDynApiStreamVerbs[idx].info = "Peform action on this stream"; + } + } + + if(HalUtlLoadVerbs(apiHandle, CtlHalDynApiStreamVerbs)) { + AFB_ReqWarning(request, "%s: error while creating verbs for streams", __func__); + err -= 100000; + } + + return err; +} \ No newline at end of file -- cgit 1.2.3-korg