summaryrefslogtreecommitdiffstats
path: root/4a-hal/4a-hal-controllers
diff options
context:
space:
mode:
authorJonathan Aillet <jonathan.aillet@iot.bzh>2019-04-18 12:40:25 +0200
committerJonathan Aillet <jonathan.aillet@iot.bzh>2019-05-24 12:05:52 +0200
commit68138a3ec7a78ad7304d291ff92d8e5292847c4e (patch)
tree9157134d50a749c838afdf93a49c4ce17a018347 /4a-hal/4a-hal-controllers
parent196e723e79a1f5eae41cf4a8b1450df0679a4af8 (diff)
Clarify internals hal functions and files names
The purpose of this commit is to have of a more standard way to name files and functions used to generate/handle hal api (generated from hal json configuration file). It occurred to me that 'hal-controller' was not a good name because it is harder for people who don't know about the app-controller to understanded what is the purpose of these files/functions. It was renamed to 'internal-hal' because it's about hal that are all handle/load by hal-manager in opposition of external-hal that are independant binding/binder that can register themselves to hal-manager. BUG-AGL: SPEC-2329 Change-Id: I11b7efe64ec474b004a2a15ed8969b9db95d428f Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
Diffstat (limited to '4a-hal/4a-hal-controllers')
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.c629
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.h53
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c243
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.h31
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c771
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h45
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.c372
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.h70
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c355
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.h53
10 files changed, 0 insertions, 2622 deletions
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.c
deleted file mode 100644
index 214fca9..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.c
+++ /dev/null
@@ -1,629 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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 <stdio.h>
-#include <string.h>
-
-#include <wrap-json.h>
-
-#include <alsa/asoundlib.h>
-
-#include <afb/afb-binding.h>
-
-#include <ctl-config.h>
-
-#include "4a-hal-utilities-alsa-data.h"
-#include "4a-hal-utilities-data.h"
-
-#include "4a-hal-controllers-alsacore-link.h"
-#include "4a-hal-controllers-value-handler.h"
-
-/*******************************************************************************
- * Map to alsa control types *
- ******************************************************************************/
-
-static const char *const snd_ctl_elem_type_names[] = {
- [SND_CTL_ELEM_TYPE_NONE]= "NONE",
- [SND_CTL_ELEM_TYPE_BOOLEAN]= "BOOLEAN",
- [SND_CTL_ELEM_TYPE_INTEGER]="INTEGER",
- [SND_CTL_ELEM_TYPE_ENUMERATED]="ENUMERATED",
- [SND_CTL_ELEM_TYPE_BYTES]="BYTES",
- [SND_CTL_ELEM_TYPE_IEC958]="IEC958",
- [SND_CTL_ELEM_TYPE_INTEGER64]="INTEGER64",
-};
-
-/*******************************************************************************
- * Alsa control types map from string function *
- ******************************************************************************/
-
-snd_ctl_elem_type_t HalCtlsMapsAlsaTypeToEnum(const char *label)
-{
- int idx;
- static int length = sizeof(snd_ctl_elem_type_names) / sizeof(char *);
-
- for(idx = 0; idx < length; idx++) {
- if(! strcasecmp(label, snd_ctl_elem_type_names[idx]))
- return (snd_ctl_elem_type_t) idx;
- }
-
- return SND_CTL_ELEM_TYPE_NONE;
-}
-
-/*******************************************************************************
- * HAL controllers alsacore calls funtions *
- ******************************************************************************/
-
-int HalCtlsGetCardIdByCardPath(afb_api_t apiHandle, char *devPath)
-{
- int errorToReturn, cardId;
-
- char *returnedError = NULL, *returnedInfo = NULL;
-
- json_object *toSendJ, *responseJ = NULL;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Api handle not available");
- return -1;
- }
-
- if(! devPath) {
- AFB_API_ERROR(apiHandle, "Dev path is not available");
- return -2;
- }
-
- wrap_json_pack(&toSendJ, "{s:s}", "cardPath", devPath);
-
- if(afb_api_call_sync(apiHandle,
- ALSACORE_API,
- ALSACORE_GETINFO_VERB,
- toSendJ,
- &responseJ,
- &returnedError,
- &returnedInfo)) {
- AFB_API_ERROR(apiHandle,
- "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s'",
- ALSACORE_GETINFO_VERB,
- ALSACORE_API,
- returnedError ? returnedError : "not returned",
- returnedInfo ? returnedInfo : "not returned");
- errorToReturn = -3;
- }
- else if(! responseJ) {
- AFB_API_ERROR(apiHandle,
- "Seems that %s call to api %s succeed but no response was returned",
- ALSACORE_GETINFO_VERB,
- ALSACORE_API);
- errorToReturn = -4;
- }
- else if(! json_object_is_type(responseJ, json_type_object)) {
- AFB_API_ERROR(apiHandle,
- "Seems that %s call to api %s succeed but the returned response is invalid",
- ALSACORE_GETINFO_VERB,
- ALSACORE_API);
- errorToReturn = -5;
- }
- else if(wrap_json_unpack(responseJ, "{s:i}", "cardNb", &cardId)) {
- AFB_API_WARNING(apiHandle, "Response card id is not present/valid");
- errorToReturn = -6;
- }
- else {
- return cardId;
- }
-
- if(responseJ)
- json_object_put(responseJ);
-
- free(returnedError);
- free(returnedInfo);
-
- return errorToReturn;
-}
-
-int HalCtlsSubscribeToAlsaCardEvent(afb_api_t apiHandle, char *cardId)
-{
- int err = 0;
-
- char *returnedError = NULL, *returnedInfo = NULL;
-
- json_object *subscribeQueryJ, *responseJ = NULL;
-
- wrap_json_pack(&subscribeQueryJ, "{s:s}", "devid", cardId);
- if(afb_api_call_sync(apiHandle,
- ALSACORE_API,
- ALSACORE_SUBSCRIBE_VERB,
- subscribeQueryJ,
- &responseJ,
- &returnedError,
- &returnedInfo)) {
- AFB_API_ERROR(apiHandle,
- "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s'",
- ALSACORE_SUBSCRIBE_VERB,
- ALSACORE_API,
- returnedError ? returnedError : "not returned",
- returnedInfo ? returnedInfo : "not returned");
- err = -1;
- }
-
- if(responseJ)
- json_object_put(responseJ);
-
- free(returnedError);
- free(returnedInfo);
-
- return err;
-}
-
-int HalCtlsGetAlsaCtlInfo(afb_api_t apiHandle, char *cardId, struct CtlHalAlsaCtl *currentAlsaCtl, json_object **returnedDataJ)
-{
- int err = 0;
-
- char *returnedError = NULL, *returnedInfo = NULL;
-
- json_object *queryJ, *responseJ = NULL;
-
- *returnedDataJ = NULL;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Api handle not available");
- return -1;
- }
-
- if(! cardId) {
- AFB_API_ERROR(apiHandle, "Card id is not available");
- return -2;
- }
-
- if(! currentAlsaCtl) {
- AFB_API_ERROR(apiHandle, "Alsa control data structure is not available");
- return -3;
- }
-
- if(currentAlsaCtl->name && currentAlsaCtl->numid > 0) {
- AFB_API_DEBUG(apiHandle,
- "Both a control name (%s) and a control uid (%i) are specified, control uid will be used",
- currentAlsaCtl->name,
- currentAlsaCtl->numid);
- }
-
- if(currentAlsaCtl->numid > 0) {
- wrap_json_pack(&queryJ, "{s:s s:i s:i}", "devid", cardId, "ctl", currentAlsaCtl->numid, "mode", 3);
- }
- else if(currentAlsaCtl->name) {
- wrap_json_pack(&queryJ, "{s:s s:s s:i}", "devid", cardId, "ctl", currentAlsaCtl->name, "mode", 3);
- }
- else {
- AFB_API_ERROR(apiHandle, "Need at least a control name or a control id");
- return -4;
- }
-
- if(afb_api_call_sync(apiHandle,
- ALSACORE_API,
- ALSACORE_CTLGET_VERB,
- queryJ,
- &responseJ,
- &returnedError,
- &returnedInfo)) {
- AFB_API_ERROR(apiHandle,
- "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s'",
- ALSACORE_CTLGET_VERB,
- ALSACORE_API,
- returnedError ? returnedError : "not returned",
- returnedInfo ? returnedInfo : "not returned");
- free(returnedError);
- free(returnedInfo);
- return -5;
- }
- else if(! responseJ) {
- AFB_API_ERROR(apiHandle,
- "Seems that %s call to api %s succeed but no response was returned",
- ALSACORE_CTLGET_VERB,
- ALSACORE_API);
- return -6;
- }
- else if(currentAlsaCtl->name && wrap_json_unpack(responseJ, "{s:i}", "id", &currentAlsaCtl->numid)) {
- AFB_API_ERROR(apiHandle, "Can't find alsa control 'id' from control 'name': '%s' on device '%s'", currentAlsaCtl->name, cardId);
- json_object_put(responseJ);
- return -7;
- }
-
- *returnedDataJ = responseJ;
-
- return err;
-}
-
-int HalCtlsUpdateAlsaCtlProperties(afb_api_t apiHandle, char *cardId, struct CtlHalAlsaCtl *currentAlsaCtl)
-{
- int err = 0;
-
- json_object *returnedDataJ;
-
- if((err = HalCtlsGetAlsaCtlInfo(apiHandle, cardId, currentAlsaCtl, &returnedDataJ))) {
- return err;
- }
- // TBD JAI : get dblinear/dbminmax/... values
- else if(wrap_json_unpack(returnedDataJ,
- "{s:{s?:i s?:i s?:i s?:i s?:i}}",
- "ctl",
- "type", (int *) &currentAlsaCtl->alsaCtlProperties.type,
- "count", &currentAlsaCtl->alsaCtlProperties.count,
- "min", &currentAlsaCtl->alsaCtlProperties.minval,
- "max", &currentAlsaCtl->alsaCtlProperties.maxval,
- "step", &currentAlsaCtl->alsaCtlProperties.step)) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to get control %i properties on device '%s' : '%s'",
- currentAlsaCtl->numid,
- cardId,
- json_object_get_string(returnedDataJ));
-
- err = -8;
- }
-
- if(returnedDataJ)
- json_object_put(returnedDataJ);
-
- return err;
-}
-
-int HalCtlsGetAlsaCtlValues(afb_api_t apiHandle, char *cardId, struct CtlHalAlsaCtl *currentAlsaCtl, json_object **returnedValuesJ)
-{
- int err = 0;
-
- json_object *returnedDataJ = NULL, *returnedValuesArrayJ;
-
- *returnedValuesJ = NULL;
-
- if((err = HalCtlsGetAlsaCtlInfo(apiHandle, cardId, currentAlsaCtl, &returnedDataJ))) {
- return err;
- }
- else if(wrap_json_unpack(returnedDataJ, "{s:o}", "val", &returnedValuesArrayJ)) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to get control %i values on device '%s' : '%s'",
- currentAlsaCtl->numid,
- cardId,
- json_object_get_string(returnedValuesArrayJ));
-
- err = -8;
- }
- else if(! json_object_is_type(returnedValuesArrayJ, json_type_array)) {
- AFB_API_ERROR(apiHandle,
- "Json returned by control %i values on device '%s' are not an array ('%s')",
- currentAlsaCtl->numid,
- cardId,
- json_object_get_string(returnedValuesArrayJ));
-
- err = -9;
- }
-
- if(! err)
- *returnedValuesJ = json_object_get(returnedValuesArrayJ);
-
- if(returnedDataJ)
- json_object_put(returnedDataJ);
-
- return err;
-}
-
-int HalCtlsSetAlsaCtlValue(afb_api_t apiHandle, char *cardId, int ctlId, json_object *valuesJ)
-{
- int err = 0;
-
- char *returnedError = NULL, *returnedInfo = NULL;
-
- json_object *queryJ, *responseJ = NULL;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Api handle not available");
- return -1;
- }
-
- if(! cardId) {
- AFB_API_ERROR(apiHandle, "Card id is not available");
- return -2;
- }
-
- if(ctlId <= 0) {
- AFB_API_ERROR(apiHandle, "Alsa control id is not valid");
- return -3;
- }
-
- if(! valuesJ) {
- AFB_API_ERROR(apiHandle, "Values to set json is not available");
- return -4;
- }
-
- wrap_json_pack(&queryJ, "{s:s s:{s:i s:o}}", "devid", cardId, "ctl", "id", ctlId, "val", json_object_get(valuesJ));
-
- if(afb_api_call_sync(apiHandle,
- ALSACORE_API,
- ALSACORE_CTLSET_VERB,
- queryJ,
- &responseJ,
- &returnedError,
- &returnedInfo)) {
- AFB_API_ERROR(apiHandle,
- "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s'",
- ALSACORE_CTLSET_VERB,
- ALSACORE_API,
- returnedError ? returnedError : "not returned",
- returnedInfo ? returnedInfo : "not returned");
- err = -5;
- }
-
- if(responseJ)
- json_object_put(responseJ);
-
- free(returnedError);
- free(returnedInfo);
-
- return err;
-}
-
-int HalCtlsCreateAlsaCtl(afb_api_t apiHandle, char *cardId, struct CtlHalAlsaCtl *alsaCtlToCreate)
-{
- int err = 0;
-
- char *returnedError = NULL, *returnedInfo = NULL;
-
- json_object *queryJ, *responseJ = NULL;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Api handle not available");
- return -1;
- }
-
- if(! cardId) {
- AFB_API_ERROR(apiHandle, "Card id is not available");
- return -2;
- }
-
- if(! alsaCtlToCreate) {
- AFB_API_ERROR(apiHandle, "Alsa control data structure is not available");
- return -3;
- }
-
- if(! alsaCtlToCreate->alsaCtlCreation) {
- AFB_API_ERROR(apiHandle, "Alsa control data for creation structure is not available");
- return -4;
- }
-
- wrap_json_pack(&queryJ, "{s:s s:{s:i s:s s?:i s?:i s?:i s:i s:i}}",
- "devid", cardId,
- "ctl",
- "ctl", -1,
- "name", alsaCtlToCreate->name,
- "min", alsaCtlToCreate->alsaCtlCreation->minval,
- "max", alsaCtlToCreate->alsaCtlCreation->maxval,
- "step", alsaCtlToCreate->alsaCtlCreation->step,
- "type", (int) alsaCtlToCreate->alsaCtlCreation->type,
- "count", alsaCtlToCreate->alsaCtlCreation->count);
-
- if(afb_api_call_sync(apiHandle,
- ALSACORE_API,
- ALSACORE_ADDCTL_VERB,
- queryJ,
- &responseJ,
- &returnedError,
- &returnedInfo)) {
- AFB_API_ERROR(apiHandle,
- "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s'",
- ALSACORE_ADDCTL_VERB,
- ALSACORE_API,
- returnedError ? returnedError : "not returned",
- returnedInfo ? returnedInfo : "not returned");
- err = -5;
- }
- else if(! responseJ) {
- AFB_API_ERROR(apiHandle,
- "Seems that %s call to api %s succeed but no response was returned",
- ALSACORE_ADDCTL_VERB,
- ALSACORE_API);
- err = -6;
- }
- else if(wrap_json_unpack(responseJ, "{s:i}", "id", &alsaCtlToCreate->numid)) {
- AFB_API_ERROR(apiHandle,
- "Can't get create id from %s of %s api",
- ALSACORE_ADDCTL_VERB,
- ALSACORE_API);
- err = -7;
- }
- else if(wrap_json_unpack(responseJ, "{s:o}", "ctl", NULL)) {
- AFB_API_WARNING(apiHandle, "Control %s was already present but has been updated", alsaCtlToCreate->name);
- }
-
- if(responseJ)
- json_object_put(responseJ);
-
- free(returnedError);
- free(returnedInfo);
-
- return err;
-}
-
-/*******************************************************************************
- * HAL controllers alsacore controls request callback *
- ******************************************************************************/
-
-void HalCtlsActionOnAlsaCtl(afb_req_t request)
-{
- char cardIdString[6];
-
- afb_api_t apiHandle;
-
- CtlConfigT *ctrlConfig;
-
- struct SpecificHalData *currentCtlHalData;
- struct CtlHalAlsaMap *currentAlsaCtl;
-
- json_object *requestJson,
- *valueJ,
- *convertedJ,
- *answerJ,
- *previousControlValuesJ,
- *normalizedPreviousControlValuesJ,
- *appliedControlValuesJ,
- *normalizedAppliedControlValuesJ;
-
- if(! (apiHandle = afb_req_get_api(request))) {
- afb_req_fail(request, "api_handle", "Can't get current hal controller api handle");
- return;
- }
-
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle))) {
- afb_req_fail(request, "hal_controller_config", "Can't get current hal controller config");
- return;
- }
-
- if(! (currentCtlHalData = (struct SpecificHalData *) getExternalData(ctrlConfig))) {
- afb_req_fail(request, "hal_controller_data", "Can't get current hal controller data");
- return;
- }
-
- if(currentCtlHalData->status == HAL_STATUS_UNAVAILABLE) {
- afb_req_fail(request, "hal_unavailable", "Seems that hal is not available");
- return;
- }
-
- if(! (currentAlsaCtl = (struct CtlHalAlsaMap *) afb_req_get_vcbdata(request))) {
- afb_req_fail(request, "alsa_control_data", "Can't get current alsa control data");
- return;
- }
-
- if(currentAlsaCtl->ctl.numid <= 0) {
- afb_req_fail(request, "alsa_control_id", "Alsa control id is not valid");
- return;
- }
-
- snprintf(cardIdString, 6, "hw:%i", currentCtlHalData->sndCardId);
-
- if(HalCtlsGetAlsaCtlValues(apiHandle, cardIdString, &currentAlsaCtl->ctl, &previousControlValuesJ)) {
- afb_req_fail_f(request, "previous_values", "Error when trying to get unchanged alsa control values");
- return;
- }
- else if(HalCtlsConvertJsonValues(apiHandle,
- &currentAlsaCtl->ctl.alsaCtlProperties,
- previousControlValuesJ,
- &normalizedPreviousControlValuesJ,
- CONVERSION_ALSACORE_TO_NORMALIZED)) {
- afb_req_fail_f(request,
- "request_json",
- "Error when trying to normalize unchanged alsa control values json '%s'",
- json_object_get_string(previousControlValuesJ));
- json_object_put(previousControlValuesJ);
- return;
- }
-
- if(! (requestJson = afb_req_json(request))) {
- wrap_json_pack(&answerJ,
- "{s:o}",
- "current", normalizedPreviousControlValuesJ);
- afb_req_success(request, answerJ, "Current controls values");
- json_object_put(previousControlValuesJ);
- return;
- }
-
- if(! json_object_is_type(requestJson, json_type_object)) {
- afb_req_fail_f(request, "request_json", "Request json is not valid '%s'", json_object_get_string(requestJson));
- json_object_put(previousControlValuesJ);
- json_object_put(normalizedPreviousControlValuesJ);
- return;
- }
-
- if(wrap_json_unpack(requestJson, "{s:o}", "value", &valueJ)) {
- afb_req_fail_f(request,
- "request_json", "Error when trying to get request value object inside request '%s'",
- json_object_get_string(requestJson));
- json_object_put(previousControlValuesJ);
- json_object_put(normalizedPreviousControlValuesJ);
- return;
- }
-
- if((! json_object_is_type(valueJ, json_type_string)) &&
- HalCtlsConvertJsonValues(apiHandle,
- &currentAlsaCtl->ctl.alsaCtlProperties,
- valueJ,
- &convertedJ,
- CONVERSION_NORMALIZED_TO_ALSACORE)) {
- afb_req_fail_f(request,
- "request_json",
- "Error when trying to convert request values '%s'",
- json_object_get_string(valueJ));
- json_object_put(previousControlValuesJ);
- json_object_put(normalizedPreviousControlValuesJ);
- return;
- }
- else if(json_object_is_type(valueJ, json_type_string) &&
- HalCtlsChangePreviousValuesUsingJson(apiHandle,
- &currentAlsaCtl->ctl.alsaCtlProperties,
- valueJ,
- previousControlValuesJ,
- &convertedJ)) {
- afb_req_fail_f(request,
- "previous_values",
- "Error when trying to generate changed alsa control values (values : '%s', previous :'%s')",
- json_object_get_string(valueJ),
- json_object_get_string(previousControlValuesJ));
- json_object_put(previousControlValuesJ);
- json_object_put(normalizedPreviousControlValuesJ);
- return;
- }
-
- json_object_put(previousControlValuesJ);
-
- if(HalCtlsSetAlsaCtlValue(apiHandle, cardIdString, currentAlsaCtl->ctl.numid, convertedJ)) {
- afb_req_fail_f(request,
- "alsa_control_call_error",
- "Error while trying to set value on alsa control %i, device '%s', converted message '%s'",
- currentAlsaCtl->ctl.numid,
- cardIdString,
- json_object_get_string(convertedJ));
- json_object_put(convertedJ);
- json_object_put(normalizedPreviousControlValuesJ);
- return;
- }
-
- json_object_put(convertedJ);
-
- if(HalCtlsGetAlsaCtlValues(apiHandle, cardIdString, &currentAlsaCtl->ctl, &appliedControlValuesJ)) {
- afb_req_fail_f(request, "applied_values", "Error when trying to get applied alsa control values");
- json_object_put(normalizedPreviousControlValuesJ);
- return;
- }
- else if(HalCtlsConvertJsonValues(apiHandle,
- &currentAlsaCtl->ctl.alsaCtlProperties,
- appliedControlValuesJ,
- &normalizedAppliedControlValuesJ,
- CONVERSION_ALSACORE_TO_NORMALIZED)) {
- afb_req_fail_f(request,
- "request_json",
- "Error when trying to normalize applied values json '%s'",
- json_object_get_string(appliedControlValuesJ));
- json_object_put(normalizedPreviousControlValuesJ);
- json_object_put(appliedControlValuesJ);
- return;
- }
-
- json_object_put(appliedControlValuesJ);
-
- wrap_json_pack(&answerJ,
- "{s:o, s:o}",
- "previous", normalizedPreviousControlValuesJ,
- "current", normalizedAppliedControlValuesJ);
-
- afb_req_success(request, answerJ, "Values correctly applied on alsa control");
-} \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.h
deleted file mode 100644
index 5081b49..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-alsacore-link.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-* Copyright (C) 2018 "IoT.bzh"
-* Author Jonathan Aillet <jonathan.aillet@iot.bzh>
-*
-* 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.
-*/
-
-#ifndef _HAL_CTLS_ALSACORE_LINK_INCLUDE_
-#define _HAL_CTLS_ALSACORE_LINK_INCLUDE_
-
-#include <stdio.h>
-
-#include <wrap-json.h>
-
-#include <alsa/asoundlib.h>
-
-#include <afb/afb-binding.h>
-
-#include <ctl-config.h>
-
-#include "4a-hal-utilities-alsa-data.h"
-
-#define ALSACORE_API "alsacore"
-#define ALSACORE_SUBSCRIBE_VERB "subscribe"
-#define ALSACORE_GETINFO_VERB "infoget"
-#define ALSACORE_CTLGET_VERB "ctlget"
-#define ALSACORE_CTLSET_VERB "ctlset"
-#define ALSACORE_ADDCTL_VERB "addcustomctl"
-
-// Alsa control types map from string function
-snd_ctl_elem_type_t HalCtlsMapsAlsaTypeToEnum(const char *label);
-
-// HAL controllers alsacore calls funtions
-int HalCtlsGetCardIdByCardPath(afb_api_t apiHandle, char *devPath);
-int HalCtlsSubscribeToAlsaCardEvent(afb_api_t apiHandle, char *cardId);
-int HalCtlsUpdateAlsaCtlProperties(afb_api_t apiHandle, char *cardId, struct CtlHalAlsaCtl *currentAlsaCtl);
-int HalCtlsSetAlsaCtlValue(afb_api_t apiHandle, char *cardId, int ctlId, json_object *valuesJ);
-int HalCtlsCreateAlsaCtl(afb_api_t apiHandle, char *cardId, struct CtlHalAlsaCtl *alsaCtlToCreate);
-
-// HAL controllers alsacore controls request callback
-void HalCtlsActionOnAlsaCtl(afb_req_t request);
-
-#endif /* _HAL_CTLS_ALSACORE_LINK_INCLUDE_ */ \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
deleted file mode 100644
index a6f6895..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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 <stdio.h>
-#include <string.h>
-
-#include <filescan-utils.h>
-#include <wrap-json.h>
-
-#include <afb/afb-binding.h>
-
-#include <ctl-config.h>
-
-#include "4a-hal-utilities-verbs-loader.h"
-
-#include "4a-hal-controllers-api-loader.h"
-#include "4a-hal-controllers-alsacore-link.h"
-#include "4a-hal-controllers-cb.h"
-#include "4a-hal-controllers-mixer-link.h"
-
-// Default api to print log when apihandle not available
-afb_api_t AFB_default;
-
-/*******************************************************************************
- * Json parsing functions using app controller *
- ******************************************************************************/
-
-// Config Section definition
-static CtlSectionT ctrlSectionsDefault[] =
-{
- { .key = "resources", .loadCB = PluginConfig },
- { .key = "halmixer", .loadCB = HalCtlsHalMixerConfig },
- { .key = "onload", .loadCB = OnloadConfig },
- { .key = "controls", .loadCB = ControlConfig },
- { .key = "events", .loadCB = EventConfig },
- { .key = "halmap", .loadCB = HalCtlsHalMapConfig },
- { .key = NULL }
-};
-
-/*******************************************************************************
- * Dynamic HAL verbs' functions *
- ******************************************************************************/
-
-// Every HAL export the same API & Interface Mapping from SndCard to AudioLogic is done through alsaHalSndCardT
-static afb_verb_t CtlHalApiStaticVerbs[] =
-{
- /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */
- { .verb = "info", .callback = HalCtlsInfo, .info = "List available streams/playbacks/captures/controls for this api" },
- { .verb = "subscribe", .callback = HalCtlsSubscribe, .info = "Subscribe to event(s) for values changes (streams/playbacks/captures/controls) for this api" },
- { .verb = "unsubscribe", .callback = HalCtlsUnsubscribe, .info = "Unsubscribe to event(s) for values changes (streams/playbacks/captures/controls) for this api" },
- { .verb = NULL } // Marker for end of the array
-};
-
-/*******************************************************************************
- * Dynamic API functions for app controller *
- ******************************************************************************/
-
-static int HalCtlsInitOneApi(afb_api_t apiHandle)
-{
- CtlConfigT *ctrlConfig;
- struct SpecificHalData *currentCtlHalData;
-
- if(! apiHandle)
- return -1;
-
- // Hugely hack to make all V2 AFB_DEBUG to work in fileutils
- AFB_default = apiHandle;
-
- // Retrieve section config from api handle
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle)))
- return -2;
-
- currentCtlHalData = (struct SpecificHalData *) getExternalData(ctrlConfig);
- if(! currentCtlHalData)
- return -3;
-
- // Fill SpecificHalDatadata structure
- currentCtlHalData->internal = 1;
-
- currentCtlHalData->sndCardPath = (char *) ctrlConfig->uid;
- currentCtlHalData->info = (char *) ctrlConfig->info;
-
- currentCtlHalData->author = (char *) ctrlConfig->author;
- currentCtlHalData->version = (char *) ctrlConfig->version;
- currentCtlHalData->date = (char *) ctrlConfig->date;
-
- currentCtlHalData->ctlHalSpecificData->apiHandle = apiHandle;
- currentCtlHalData->ctlHalSpecificData->ctrlConfig = ctrlConfig;
-
- currentCtlHalData->sndCardId = HalCtlsGetCardIdByCardPath(apiHandle, currentCtlHalData->sndCardPath);
-
- if(! (currentCtlHalData->ctlHalSpecificData->streamUpdates = afb_api_make_event(apiHandle, HAL_STREAM_UPDATES_EVENT_NAME)))
- return -4;
-
- if(currentCtlHalData->sndCardId < 0)
- currentCtlHalData->status = HAL_STATUS_UNAVAILABLE;
- else
- currentCtlHalData->status = HAL_STATUS_AVAILABLE;
-
- // TBD JAI: handle refresh of hal status for dynamic card (/dev/by-id)
-
- return CtlConfigExec(apiHandle, ctrlConfig);
-}
-
-static int HalCtlsLoadOneApi(void *cbdata, afb_api_t apiHandle)
-{
- int err;
- CtlConfigT *ctrlConfig;
- CtlSectionT *ctrlCurrentSections;
-
- if(! cbdata || ! apiHandle)
- return -1;
-
- ctrlConfig = (CtlConfigT*) cbdata;
-
- // Save closure as api's data context
- afb_api_set_userdata(apiHandle, ctrlConfig);
-
- // Add static controls verbs
- if(HalUtlLoadVerbs(apiHandle, CtlHalApiStaticVerbs)) {
- AFB_API_ERROR(apiHandle, "Load Section : fail to register static V2 verbs");
- return 1;
- }
-
- ctrlCurrentSections = malloc(sizeof(ctrlSectionsDefault));
- memcpy(ctrlCurrentSections, ctrlSectionsDefault, sizeof(ctrlSectionsDefault));
-
- // Load section for corresponding Api
- if((err = CtlLoadSections(apiHandle, ctrlConfig, ctrlCurrentSections)))
- return err;
-
- // Declare an event manager for this Api
- afb_api_on_event(apiHandle, HalCtlsDispatchApiEvent);
-
- // Init Api function (does not receive user closure ???)
- afb_api_on_init(apiHandle, HalCtlsInitOneApi);
-
- return 0;
-}
-
-int HalCtlsCreateApi(afb_api_t apiHandle, char *path, struct HalMgrData *HalMgrGlobalData)
-{
- CtlConfigT *ctrlConfig;
- struct SpecificHalData *currentCtlHalData;
-
- if(! apiHandle || ! path || ! HalMgrGlobalData)
- return -1;
-
- // Create one Api per file
- ctrlConfig = CtlLoadMetaData(apiHandle, path);
- if(! ctrlConfig) {
- AFB_API_ERROR(apiHandle, "No valid control config file in:\n-- %s", path);
- return -2;
- }
-
- if(! ctrlConfig->api) {
- AFB_API_ERROR(apiHandle, "API Missing from metadata in:\n-- %s", path);
- return -3;
- }
-
- // Allocation of current hal controller data
- currentCtlHalData = HalUtlAddHalApiToHalList(&HalMgrGlobalData->halDataList);
- if(! currentCtlHalData)
- return -4;
-
- currentCtlHalData->apiName = (char *) ctrlConfig->api;
-
- // Stores current hal controller data in controller config
- setExternalData(ctrlConfig, (void *) currentCtlHalData);
-
- // Allocation of the structure that will be used to store specific hal controller data
- currentCtlHalData->ctlHalSpecificData = calloc(1, sizeof(struct CtlHalSpecificData));
-
- // Create one API
- if(! afb_api_new_api(apiHandle, ctrlConfig->api, ctrlConfig->info, 1, HalCtlsLoadOneApi, ctrlConfig))
- return -5;
-
- return 0;
-}
-
-int HalCtlsCreateAllApi(afb_api_t apiHandle, struct HalMgrData *HalMgrGlobalData)
-{
- int index, status = 0;
- char *dirList, *fileName, *fullPath;
- char filePath[CONTROL_MAXPATH_LEN];
-
- filePath[CONTROL_MAXPATH_LEN - 1] = '\0';
-
- json_object *configJ, *entryJ;
-
- if(! apiHandle || ! HalMgrGlobalData)
- return -1;
-
- // Hugely hack to make all V2 AFB_DEBUG to work in fileutils
- AFB_default = apiHandle;
-
- AFB_API_NOTICE(apiHandle, "Begining to create all APIs");
-
- dirList = getenv("CONTROL_CONFIG_PATH");
- if(! dirList)
- dirList = CONTROL_CONFIG_PATH;
-
- configJ = CtlConfigScan(dirList, "hal");
- if(! configJ) {
- AFB_API_WARNING(apiHandle, "No hal-(binder-middle-name)*.json config file(s) found in %s, 4a-hal-manager will only works with external hal", dirList);
- return 0;
- }
-
- // We load 1st file others are just warnings
- for(index = 0; index < (int) json_object_array_length(configJ); index++) {
- entryJ = json_object_array_get_idx(configJ, index);
-
- if(wrap_json_unpack(entryJ, "{s:s, s:s !}", "fullpath", &fullPath, "filename", &fileName)) {
- AFB_API_ERROR(apiHandle, "HOOPs invalid JSON entry = %s", json_object_get_string(entryJ));
- return -2;
- }
-
- strncpy(filePath, fullPath, sizeof(filePath) - 1);
- strncat(filePath, "/", sizeof(filePath) - 1);
- strncat(filePath, fileName, sizeof(filePath) - 1);
-
- if(HalCtlsCreateApi(apiHandle, filePath, HalMgrGlobalData) < 0)
- status--;
- }
-
- return status;
-} \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.h
deleted file mode 100644
index dd33108..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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.
- */
-
-#ifndef _HAL_CTLS_API_LOADER_INCLUDE_
-#define _HAL_CTLS_API_LOADER_INCLUDE_
-
-#include <stdio.h>
-
-#include <afb/afb-binding.h>
-
-#include "4a-hal-utilities-data.h"
-
-// Verbs that can be use to create api
-int HalCtlsCreateApi(afb_api_t apiHandle, char *path, struct HalMgrData *HalMgrGlobalData);
-int HalCtlsCreateAllApi(afb_api_t apiHandle, struct HalMgrData *HalMgrGlobalData);
-
-#endif /* _HAL_CTLS_API_LOADER_INCLUDE_ */ \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
deleted file mode 100644
index c38b057..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
+++ /dev/null
@@ -1,771 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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 <stdio.h>
-#include <string.h>
-
-#include <wrap-json.h>
-
-#include <afb/afb-binding.h>
-
-#include "4a-hal-utilities-data.h"
-
-#include "4a-hal-controllers-cb.h"
-#include "4a-hal-controllers-alsacore-link.h"
-#include "4a-hal-controllers-mixer-link.h"
-#include "4a-hal-controllers-value-handler.h"
-
-/*******************************************************************************
- * HAL controller event handler function *
- ******************************************************************************/
-
-void HalCtlsDispatchApiEvent(afb_api_t apiHandle, const char *evtLabel, json_object *eventJ)
-{
- int numid, idx = 0, cardidx;
-
- CtlConfigT *ctrlConfig;
- CtlSourceT source;
-
- struct SpecificHalData *currentHalData;
- struct CtlHalAlsaMapT *currentHalAlsaCtlsT;
-
- json_object *valuesJ, *normalizedValuesJ;
-
- AFB_API_DEBUG(apiHandle, "Evtname=%s [msg=%s]", evtLabel, json_object_get_string(eventJ));
-
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle))) {
- AFB_API_ERROR(apiHandle, "Can't get current hal controller config");
- return;
- }
-
- if(! (currentHalData = (struct SpecificHalData *) getExternalData(ctrlConfig))) {
- AFB_API_WARNING(apiHandle, "Can't get current hal controller data");
- return;
- }
-
- // Extract sound card index from event
- while(evtLabel[idx] != '\0' && evtLabel[idx] != ':')
- idx++;
-
- if(evtLabel[idx] != '\0' &&
- sscanf(&evtLabel[idx + 1], "%d", &cardidx) == 1 &&
- currentHalData->sndCardId == cardidx) {
- if(wrap_json_unpack(eventJ, "{s:i s:o !}", "id", &numid, "val", &valuesJ)) {
- AFB_API_ERROR(apiHandle, "Invalid Alsa Event label=%s value=%s", evtLabel, json_object_get_string(eventJ));
- return;
- }
-
- currentHalAlsaCtlsT = currentHalData->ctlHalSpecificData->ctlHalAlsaMapT;
-
- // Search for corresponding numid in halCtls, if found, launch callback (if available)
- for(idx = 0; idx < currentHalAlsaCtlsT->ctlsCount; idx++) {
- if(currentHalAlsaCtlsT->ctls[idx].ctl.numid == numid) {
- if(currentHalAlsaCtlsT->ctls[idx].action) {
- source.uid = currentHalAlsaCtlsT->ctls[idx].action->uid;
- source.api = currentHalAlsaCtlsT->ctls[idx].action->api;
- source.request = NULL;
-
- (void) ActionExecOne(&source, currentHalAlsaCtlsT->ctls[idx].action, valuesJ);
- }
- else {
- AFB_API_NOTICE(apiHandle,
- "The alsa control id '%i' is corresponding to a known control but without any action registered",
- numid);
- }
-
- if((! currentHalAlsaCtlsT->ctls[idx].alsaControlEvent) ||
- HalCtlsConvertJsonValues(apiHandle,
- &currentHalAlsaCtlsT->ctls[idx].ctl.alsaCtlProperties,
- valuesJ,
- &normalizedValuesJ,
- CONVERSION_ALSACORE_TO_NORMALIZED) ||
- (afb_event_push(currentHalAlsaCtlsT->ctls[idx].alsaControlEvent, normalizedValuesJ) < 0)) {
- AFB_API_ERROR(apiHandle,
- "Couldn't generate an event for known halmap %s (alsa control id %i)",
- currentHalAlsaCtlsT->ctls[idx].uid,
- currentHalAlsaCtlsT->ctls[idx].ctl.numid);
- }
-
- return;
- }
- }
-
- AFB_API_WARNING(apiHandle,
- "Alsacore event with an unrecognized numid: %i, evtname=%s [msg=%s]",
- numid,
- evtLabel,
- json_object_get_string(eventJ));
-
- return;
- }
-
- AFB_API_INFO(apiHandle,
- "Not an alsacore event '%s' [msg=%s]",
- evtLabel,
- json_object_get_string(eventJ));
-
- CtrlDispatchApiEvent(apiHandle, evtLabel, eventJ);
-}
-
-/*******************************************************************************
- * HAL controllers sections parsing functions *
- ******************************************************************************/
-
-int HalCtlsHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_object *MixerJ)
-{
- int err = 0;
-
- CtlConfigT *ctrlConfig;
- struct SpecificHalData *currentHalData;
-
- if(! apiHandle || ! section)
- return -1;
-
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle)))
- return -2;
-
- if(! (currentHalData = (struct SpecificHalData *) getExternalData(ctrlConfig)))
- return -3;
-
- if(MixerJ) {
- if(json_object_is_type(MixerJ, json_type_object))
- currentHalData->ctlHalSpecificData->halMixerJ = MixerJ;
- else
- return -4;
-
- if(wrap_json_unpack(MixerJ, "{s:s}", "mixerapi", &currentHalData->ctlHalSpecificData->mixerApiName))
- return -5;
-
- wrap_json_unpack(MixerJ, "{s?:s}", "prefix", &currentHalData->ctlHalSpecificData->prefix);
- }
- else if(currentHalData->status == HAL_STATUS_AVAILABLE &&
- (err = HalCtlsAttachToMixer(apiHandle))) {
- AFB_API_ERROR(apiHandle, "%s: Error %i while attaching to mixer", __func__, err);
- return -6;
- }
-
- return 0;
-}
-
-int HalCtlsProcessOneHalMapObject(afb_api_t apiHandle, struct CtlHalAlsaMap *alsaMap, json_object *AlsaMapJ)
-{
- char *action = NULL, *typename = NULL;
-
- json_object *alsaJ = NULL, *createAlsaCtlJ = NULL;
-
- AFB_API_DEBUG(apiHandle, "AlsaMapJ=%s", json_object_get_string(AlsaMapJ));
-
- if(wrap_json_unpack(AlsaMapJ, "{s:s s?:s s:o s?:s !}",
- "uid", &alsaMap->uid,
- "info", &alsaMap->info,
- "alsa", &alsaJ,
- "action", &action)) {
- AFB_API_ERROR(apiHandle, "Parsing error, map should only contains [label]|[uid]|[tag]|[info]|[alsa]|[action] in:\n-- %s", json_object_get_string(AlsaMapJ));
- return -1;
- }
-
- if(wrap_json_unpack(alsaJ, "{s?:s s?:i s?:i s?:o !}",
- "name", &alsaMap->ctl.name,
- "numid", &alsaMap->ctl.numid,
- "value", &alsaMap->ctl.value,
- "create", &createAlsaCtlJ)) {
- AFB_API_ERROR(apiHandle, "Parsing error, alsa json should only contains [name]|[numid]||[value]|[create] in:\n-- %s", json_object_get_string(alsaJ));
- return -2;
- }
-
- if(createAlsaCtlJ) {
- alsaMap->ctl.alsaCtlCreation = &alsaMap->ctl.alsaCtlProperties;
-
- if(wrap_json_unpack(createAlsaCtlJ,
- "{s:s s:i s:i s:i s:i !}",
- "type", &typename,
- "count", &alsaMap->ctl.alsaCtlCreation->count,
- "minval", &alsaMap->ctl.alsaCtlCreation->minval,
- "maxval", &alsaMap->ctl.alsaCtlCreation->maxval,
- "step", &alsaMap->ctl.alsaCtlCreation->step)) {
- AFB_API_ERROR(apiHandle, "Parsing error, alsa creation json should only contains [type]|[count]|[minval]|[maxval]|[step] in:\n-- %s", json_object_get_string(alsaJ));
- return -3;
- }
-
- if(typename && (alsaMap->ctl.alsaCtlCreation->type = HalCtlsMapsAlsaTypeToEnum(typename)) == SND_CTL_ELEM_TYPE_NONE) {
- AFB_API_ERROR(apiHandle, "Couldn't get alsa type from string %s in:\n-- %s", typename, json_object_get_string(alsaJ));
- return -4;
- }
-
- if(! alsaMap->ctl.name)
- alsaMap->ctl.name = (char *) alsaMap->uid;
- }
- else if(alsaMap->ctl.name && alsaMap->ctl.numid > 0) {
- AFB_API_ERROR(apiHandle,
- "Can't have both a control name (%s) and a control uid (%i) in alsa object:\n-- %s",
- alsaMap->ctl.name,
- alsaMap->ctl.numid,
- json_object_get_string(alsaJ));
- return -5;
- }
- else if(! alsaMap->ctl.name && alsaMap->ctl.numid <= 0) {
- AFB_API_ERROR(apiHandle,
- "Need at least a control name or a control uid in alsa object:\n-- %s",
- json_object_get_string(alsaJ));
- return -6;
- }
-
- if(action)
- alsaMap->actionJ = AlsaMapJ;
-
- return 0;
-}
-
-int HalCtlsHandleOneHalMapObject(afb_api_t apiHandle, char *cardId, struct CtlHalAlsaMap *alsaMap)
-{
- int err;
-
- json_object *valueJ, *convertedValueJ = NULL;
-
- if(! (alsaMap->alsaControlEvent = afb_api_make_event(apiHandle, alsaMap->uid))) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to create event for current alsa control to load action using alsa object:\n-- %s",
- json_object_get_string(alsaMap->actionJ));
- return -1;
- }
-
- if(alsaMap->ctl.alsaCtlCreation) {
- if(HalCtlsCreateAlsaCtl(apiHandle, cardId, &alsaMap->ctl)) {
- AFB_API_ERROR(apiHandle, "An error happened when trying to create a new alsa control");
- return -2;
- }
- }
- else if(HalCtlsUpdateAlsaCtlProperties(apiHandle, cardId, &alsaMap->ctl)) {
- AFB_API_ERROR(apiHandle, "An error happened when trying to get existing alsa control info");
- return -3;
- }
-
- if(alsaMap->ctl.value) {
- // TBD JAI : handle alsa controls type
- valueJ = json_object_new_int(alsaMap->ctl.value);
- err = 0;
-
- if(HalCtlsConvertJsonValues(apiHandle, &alsaMap->ctl.alsaCtlProperties, valueJ, &convertedValueJ, CONVERSION_NORMALIZED_TO_ALSACORE)) {
- AFB_API_ERROR(apiHandle, "Error when trying to convert initiate value json '%s'", json_object_get_string(valueJ));
- err = -4;
- }
- else if(HalCtlsSetAlsaCtlValue(apiHandle, cardId, alsaMap->ctl.numid, convertedValueJ)) {
- AFB_API_ERROR(apiHandle,
- "Error while trying to set initial value on alsa control %i, device '%s', value '%s'",
- alsaMap->ctl.numid,
- cardId,
- json_object_get_string(valueJ));
- err = -5;
- }
-
- json_object_put(valueJ);
-
- if(convertedValueJ)
- json_object_put(convertedValueJ);
-
- if(err)
- return err;
- }
-
- if(alsaMap->actionJ) {
- alsaMap->action = calloc(1, sizeof(CtlActionT));
- if(ActionLoadOne(apiHandle, alsaMap->action, alsaMap->actionJ, 0)) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to load action using alsa object:\n-- %s",
- json_object_get_string(alsaMap->actionJ));
- return -6;
- }
- }
-
- if(afb_api_add_verb(apiHandle, alsaMap->uid, alsaMap->info, HalCtlsActionOnAlsaCtl, (void *) alsaMap, NULL, 0, 0)) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to create verb for current alsa control to load action using alsa object:\n-- %s",
- json_object_get_string(alsaMap->actionJ));
- return -7;
- }
-
- return 0;
-}
-
-int HalCtlsProcessAllHalMap(afb_api_t apiHandle, json_object *AlsaMapJ, struct CtlHalAlsaMapT *currentCtlHalAlsaMapT)
-{
- int idx, err = 0;
-
- struct CtlHalAlsaMap *ctlMaps;
-
- json_type alsaMapType;
-
- alsaMapType = json_object_get_type(AlsaMapJ);
- switch(alsaMapType) {
- case json_type_array:
- currentCtlHalAlsaMapT->ctlsCount = (unsigned int) json_object_array_length(AlsaMapJ);
- break;
-
- case json_type_object:
- currentCtlHalAlsaMapT->ctlsCount = 1;
- break;
-
- default:
- currentCtlHalAlsaMapT->ctlsCount = 0;
- currentCtlHalAlsaMapT->ctls = NULL;
- AFB_API_WARNING(apiHandle, "Couldn't get content of 'halmap' section in:\n-- %s", json_object_get_string(AlsaMapJ));
- return -1;
- }
-
- ctlMaps = calloc(currentCtlHalAlsaMapT->ctlsCount, sizeof(struct CtlHalAlsaMap));
-
- for(idx = 0; idx < currentCtlHalAlsaMapT->ctlsCount; idx++)
- err += HalCtlsProcessOneHalMapObject(apiHandle, &ctlMaps[idx], alsaMapType == json_type_array ? json_object_array_get_idx(AlsaMapJ, idx) : AlsaMapJ);
-
- currentCtlHalAlsaMapT->ctls = ctlMaps;
-
- return err;
-}
-
-int HalCtlsHandleAllHalMap(afb_api_t apiHandle, int sndCardId, struct CtlHalAlsaMapT *currentCtlHalAlsaMapT)
-{
- int idx, err = 0;
-
- char cardIdString[6];
-
- snprintf(cardIdString, 6, "hw:%i", sndCardId);
-
- HalCtlsSubscribeToAlsaCardEvent(apiHandle, cardIdString);
-
- for(idx = 0; idx < currentCtlHalAlsaMapT->ctlsCount; idx++)
- err += HalCtlsHandleOneHalMapObject(apiHandle, cardIdString, &currentCtlHalAlsaMapT->ctls[idx]);
-
- return err;
-}
-
-int HalCtlsHalMapConfig(afb_api_t apiHandle, CtlSectionT *section, json_object *AlsaMapJ)
-{
- CtlConfigT *ctrlConfig;
- struct SpecificHalData *currentHalData;
-
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle)))
- return -1;
-
- currentHalData = (struct SpecificHalData *) getExternalData(ctrlConfig);
- if(! currentHalData)
- return -2;
-
- if(AlsaMapJ) {
- currentHalData->ctlHalSpecificData->ctlHalAlsaMapT = calloc(1, sizeof(struct CtlHalAlsaMapT));
-
- if(HalCtlsProcessAllHalMap(apiHandle, AlsaMapJ, currentHalData->ctlHalSpecificData->ctlHalAlsaMapT)) {
- AFB_API_ERROR(apiHandle, "Failed to process 'halmap' section");
- return -3;
- }
- }
- else if(currentHalData->status == HAL_STATUS_UNAVAILABLE) {
- AFB_API_WARNING(apiHandle, "Hal is unavailable, 'halmap' section data can't be handle");
- return 1;
- }
- else if(currentHalData->sndCardId < 0) {
- AFB_API_ERROR(apiHandle, "Hal alsa card id is not valid, 'halmap' section data can't be handle");
- return -6;
- }
- else if(! currentHalData->ctlHalSpecificData->ctlHalAlsaMapT) {
- AFB_API_WARNING(apiHandle, "'halmap' section data is empty");
- return 2;
- }
- else if(! (currentHalData->ctlHalSpecificData->ctlHalAlsaMapT->ctlsCount > 0)) {
- AFB_API_WARNING(apiHandle, "No alsa controls defined in 'halmap' section");
- return 3;
- }
- else if(HalCtlsHandleAllHalMap(apiHandle, currentHalData->sndCardId, currentHalData->ctlHalSpecificData->ctlHalAlsaMapT)) {
- AFB_API_ERROR(apiHandle, "Failed to handle 'halmap' section");
- return -9;
- }
-
- return 0;
-}
-
-/*******************************************************************************
- * HAL controllers verbs functions *
- ******************************************************************************/
-
-json_object *HalCtlsGetJsonArrayForMixerDataTable(afb_api_t apiHandle, struct CtlHalMixerData **mixerDataList, enum MixerDataType dataType)
-{
- json_object *mixerDataArrayJ, *currentMixerDataJ;
-
- struct CtlHalMixerData *currentMixerData;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Can't get current hal controller api handle");
- return NULL;
- }
-
- mixerDataArrayJ = json_object_new_array();
- if(! mixerDataArrayJ) {
- AFB_API_ERROR(apiHandle, "Can't generate json mixer data array");
- return NULL;
- }
-
- currentMixerData = *mixerDataList;
-
- while(currentMixerData) {
- switch(dataType) {
- case MIXER_DATA_STREAMS:
- wrap_json_pack(&currentMixerDataJ,
- "{s:s s:s}",
- "name", currentMixerData->verb,
- "cardId", currentMixerData->streamCardId);
- break;
-
- case MIXER_DATA_PLAYBACKS:
- case MIXER_DATA_CAPTURES :
- wrap_json_pack(&currentMixerDataJ,
- "{s:s s:s}",
- "name", currentMixerData->verb,
- "mixer-name", currentMixerData->verbToCall,
- "uid", currentMixerData->streamCardId ? currentMixerData->streamCardId : "none");
- break;
-
- default:
- json_object_put(mixerDataArrayJ);
- return NULL;
- }
- json_object_array_add(mixerDataArrayJ, currentMixerDataJ);
-
- currentMixerData = currentMixerData->next;
- }
-
- return mixerDataArrayJ;
-}
-
-json_object *HalCtlsGetJsonArrayForControls(afb_api_t apiHandle, struct CtlHalAlsaMapT *currentAlsaMapDataT)
-{
- unsigned int idx;
-
- json_object *alsaMapDataArray, *currentAlsaMapData;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Can't get current hal controller api handle");
- return NULL;
- }
-
- if(! currentAlsaMapDataT) {
- AFB_API_ERROR(apiHandle, "Can't get Alsa map data table to handle");
- return NULL;
- }
-
- if(! (alsaMapDataArray = json_object_new_array())) {
- AFB_API_ERROR(apiHandle, "Can't generate json mixer data array");
- return NULL;
- }
-
- for(idx = 0; idx < currentAlsaMapDataT->ctlsCount; idx++) {
- wrap_json_pack(&currentAlsaMapData,
- "{s:s s:s}",
- "name", currentAlsaMapDataT->ctls[idx].uid,
- "info", currentAlsaMapDataT->ctls[idx].info ? currentAlsaMapDataT->ctls[idx].info : "none");
-
- json_object_array_add(alsaMapDataArray, currentAlsaMapData);
- }
-
- return alsaMapDataArray;
-}
-
-void HalCtlsInfo(afb_req_t request)
-{
- char *apiToCall, *returnedError = NULL, *returnedInfo = NULL;
-
- afb_api_t apiHandle;
- CtlConfigT *ctrlConfig;
-
- struct SpecificHalData *currentCtlHalData;
-
- json_object *requestJson, *toReturnJ = NULL, *requestAnswer, *streamsArray, *playbacksArray, *capturesArray, *controlsArray;
-
- if(! (apiHandle = afb_req_get_api(request))) {
- afb_req_fail(request, "api_handle", "Can't get current hal controller api handle");
- return;
- }
-
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle))) {
- afb_req_fail(request, "hal_controller_config", "Can't get current hal controller config");
- return;
- }
-
- if(! (currentCtlHalData = (struct SpecificHalData *) getExternalData(ctrlConfig))) {
- afb_req_fail(request, "hal_controller_data", "Can't get current hal controller data");
- return;
- }
-
- if(! (requestJson = afb_req_json(request))) {
- AFB_REQ_NOTICE(request, "Can't get request json");
- }
- else if(json_object_is_type(requestJson, json_type_object) && json_object_get_object(requestJson)->count > 0) {
- apiToCall = currentCtlHalData->ctlHalSpecificData->mixerApiName;
- if(! apiToCall) {
- afb_req_fail(request, "mixer_api", "Can't get mixer api");
- return;
- }
-
- if(HalCtlsGetInfoFromMixer(apiHandle, apiToCall, requestJson, &toReturnJ, &returnedError, &returnedInfo)) {
- afb_req_fail_f(request,
- "mixer_info",
- "Call to mixer info verb didn't succeed with status '%s' and info '%s'",
- returnedError ? returnedError : "not returned",
- returnedInfo ? returnedInfo : "not returned");
- return;
- }
-
- afb_req_success(request, toReturnJ, "Mixer requested data");
- return;
- }
-
- if(! (streamsArray = HalCtlsGetJsonArrayForMixerDataTable(apiHandle,
- &currentCtlHalData->ctlHalSpecificData->ctlHalStreamsData,
- MIXER_DATA_STREAMS))) {
- afb_req_fail(request, "streams_data", "Didn't succeed to generate streams data array");
- return;
- }
-
- if(! (playbacksArray = HalCtlsGetJsonArrayForMixerDataTable(apiHandle,
- &currentCtlHalData->ctlHalSpecificData->ctlHalPlaybacksData,
- MIXER_DATA_PLAYBACKS))) {
- afb_req_fail(request, "playbacks_data", "Didn't succeed to generate playbacks data array");
- return;
- }
-
- if(! (capturesArray = HalCtlsGetJsonArrayForMixerDataTable(apiHandle,
- &currentCtlHalData->ctlHalSpecificData->ctlHalCapturesData,
- MIXER_DATA_CAPTURES))) {
- afb_req_fail(request, "captures_data", "Didn't succeed to generate captures data array");
- return;
- }
-
- if(! (controlsArray = HalCtlsGetJsonArrayForControls(apiHandle,
- currentCtlHalData->ctlHalSpecificData->ctlHalAlsaMapT))) {
- afb_req_fail(request, "controls_data", "Didn't succeed to generate controls data array");
- return;
- }
-
- wrap_json_pack(&requestAnswer,
- "{s:o s:o s:o s:o}",
- "streams", streamsArray,
- "playbacks", playbacksArray,
- "captures", capturesArray,
- "controls", controlsArray);
-
- afb_req_success(request, requestAnswer, "Requested data");
-}
-
-void HalCtlsSubscribeUnsubscribe(afb_req_t request, enum SubscribeUnsubscribeType subscribeUnsubscribeType)
-{
- int arrayIdx, searchIdx, count, subscriptionFound, subscriptionDoneNb = 0;
-
- char *currentSubscriptionString;
-
- afb_api_t apiHandle;
- CtlConfigT *ctrlConfig;
-
- struct SpecificHalData *currentCtlHalData;
- struct CtlHalMixerData *currentStreamData;
- struct CtlHalAlsaMapT *halAlsaMapT;
-
- json_object *requestJson, *requestedSubscriptionsJ, *requestedSubscriptionJ = NULL;
- json_type requestJsonType;
-
- if(! (apiHandle = afb_req_get_api(request))) {
- afb_req_fail(request, "api_handle", "Can't get current hal controller api handle");
- return;
- }
-
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle))) {
- afb_req_fail(request, "hal_controller_config", "Can't get current hal controller config");
- return;
- }
-
- if(! (currentCtlHalData = (struct SpecificHalData *) getExternalData(ctrlConfig))) {
- afb_req_fail(request, "hal_controller_data", "Can't get current hal controller data");
- return;
- }
-
- if(! currentCtlHalData->ctlHalSpecificData) {
- afb_req_fail(request, "hal_controller_data", "Can't get current hal specific data");
- return;
- }
-
- halAlsaMapT = currentCtlHalData->ctlHalSpecificData->ctlHalAlsaMapT;
-
- if(! (requestJson = afb_req_json(request))) {
- afb_req_fail(request, "request_json", "Can't get request json");
- return;
- }
-
- if(wrap_json_unpack(requestJson, "{s:o}", "events", &requestedSubscriptionsJ)) {
- afb_req_fail(request, "request_json", "Request json invalid");
- return;
- }
-
- requestJsonType = json_object_get_type(requestedSubscriptionsJ);
- switch(requestJsonType) {
- case json_type_string:
- count = 1;
- requestedSubscriptionJ = requestedSubscriptionsJ;
- break;
-
- case json_type_array:
- count = (int) json_object_array_length(requestedSubscriptionsJ);
- break;
-
- default:
- afb_req_fail(request, "request_json", "Request json invalid");
- return;
- }
-
- for(arrayIdx = 0; arrayIdx < count; arrayIdx++) {
- if(requestJsonType == json_type_array) {
- requestedSubscriptionJ = json_object_array_get_idx(requestedSubscriptionsJ, arrayIdx);
- if(! json_object_is_type(requestedSubscriptionJ, json_type_string)) {
- afb_req_fail_f(request, "request_json", "Request json number %i in array invalid", arrayIdx);
- return;
- }
- }
-
- subscriptionFound = 0;
- currentSubscriptionString = (char *) json_object_get_string(requestedSubscriptionJ);
-
- if(! strcasecmp(currentSubscriptionString, HAL_STREAM_UPDATES_EVENT_NAME)) {
- if(currentCtlHalData->ctlHalSpecificData->streamUpdates &&
- subscribeUnsubscribeType == SUBSCRIPTION &&
- afb_req_subscribe(request, currentCtlHalData->ctlHalSpecificData->streamUpdates)) {
- afb_req_fail_f(request,
- "request_stream_list_updates_event",
- "Error while trying to subscribe to stream list updates event");
- return;
- }
- else if(currentCtlHalData->ctlHalSpecificData->streamUpdates &&
- subscribeUnsubscribeType == UNSUBSCRIPTION &&
- afb_req_unsubscribe(request, currentCtlHalData->ctlHalSpecificData->streamUpdates)) {
- afb_req_fail_f(request,
- "request_stream_list_updates_event",
- "Error while trying to unsubscribe to stream list updates event");
- return;
- }
-
- subscriptionFound = 1;
- subscriptionDoneNb++;
- }
-
- currentStreamData = currentCtlHalData->ctlHalSpecificData->ctlHalStreamsData;
- while(currentStreamData &&
- (! subscriptionFound)) {
- if(! strcasecmp(currentSubscriptionString, currentStreamData->verb)) {
- if(currentStreamData->event &&
- subscribeUnsubscribeType == SUBSCRIPTION &&
- afb_req_subscribe(request, currentStreamData->event)) {
- afb_req_fail_f(request,
- "request_stream_event",
- "Error while trying to subscribe to %s stream events",
- currentStreamData->verb);
- return;
- }
- else if(currentStreamData->event &&
- subscribeUnsubscribeType == UNSUBSCRIPTION &&
- afb_req_unsubscribe(request, currentStreamData->event)) {
- afb_req_fail_f(request,
- "request_stream_event",
- "Error while trying to unsubscribe to %s stream events",
- currentStreamData->verb);
- return;
- }
-
- subscriptionFound = 1;
- subscriptionDoneNb++;
-
- break;
- }
-
- currentStreamData = currentStreamData->next;
- }
-
- searchIdx = 0;
- while((searchIdx < (halAlsaMapT ? halAlsaMapT->ctlsCount : 0)) &&
- (! subscriptionFound)) {
- if(! strcasecmp(currentSubscriptionString, halAlsaMapT->ctls[searchIdx].uid)) {
- if(halAlsaMapT->ctls[searchIdx].alsaControlEvent &&
- subscribeUnsubscribeType == SUBSCRIPTION &&
- afb_req_subscribe(request, halAlsaMapT->ctls[searchIdx].alsaControlEvent)) {
- afb_req_fail_f(request,
- "request_control_event",
- "Error while trying to subscribe to %s halmap controls events",
- halAlsaMapT->ctls[searchIdx].uid);
- return;
- }
- else if(halAlsaMapT->ctls[searchIdx].alsaControlEvent &&
- subscribeUnsubscribeType == UNSUBSCRIPTION &&
- afb_req_unsubscribe(request, halAlsaMapT->ctls[searchIdx].alsaControlEvent)) {
- afb_req_fail_f(request,
- "request_stream_event",
- "Error while trying to unsubscribe to %s halmap controls events",
- halAlsaMapT->ctls[searchIdx].uid);
- return;
- }
-
- subscriptionFound = 1;
- subscriptionDoneNb++;
-
- break;
- }
-
- searchIdx++;
- }
- }
-
- if(subscriptionDoneNb == 0)
- afb_req_fail_f(request,
- "events_not_found",
- "%s failed, event(s) were not found",
- subscribeUnsubscribeType == SUBSCRIPTION ? "Subscription" : "Unsubscription");
- if(subscriptionDoneNb == count)
- afb_req_success_f(request,
- json_object_new_int(subscriptionDoneNb),
- "%s succeed for all the %i events requested",
- subscribeUnsubscribeType == SUBSCRIPTION ? "Subscription" : "Unsubscription",
- subscriptionDoneNb);
- else if(subscriptionDoneNb < count)
- afb_req_success_f(request,
- json_object_new_int(subscriptionDoneNb),
- "%s succeed but only to %i events requested out of %i",
- subscribeUnsubscribeType == SUBSCRIPTION ? "Subscription" : "Unsubscription",
- subscriptionDoneNb,
- count);
- else
- afb_req_success_f(request,
- json_object_new_int(subscriptionDoneNb),
- "%s succeed but to more events than requested (%i out of %i)",
- subscribeUnsubscribeType == SUBSCRIPTION ? "Subscription" : "Unsubscription",
- subscriptionDoneNb,
- count);
-}
-
-void HalCtlsSubscribe(afb_req_t request)
-{
- HalCtlsSubscribeUnsubscribe(request, SUBSCRIPTION);
-}
-
-void HalCtlsUnsubscribe(afb_req_t request)
-{
- HalCtlsSubscribeUnsubscribe(request, UNSUBSCRIPTION);
-} \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h
deleted file mode 100644
index 60e24da..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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.
- */
-
-#ifndef _HAL_CTLS_CB_INCLUDE_
-#define _HAL_CTLS_CB_INCLUDE_
-
-#include <stdio.h>
-
-#include <afb/afb-binding.h>
-
-#include <ctl-config.h>
-
-// Enum for the type of subscription/subscription
-enum SubscribeUnsubscribeType {
- SUBSCRIPTION = 1,
- UNSUBSCRIPTION = 2
-};
-
-// HAL controller event handler function
-void HalCtlsDispatchApiEvent(afb_api_t apiHandle, const char *evtLabel, json_object *eventJ);
-
-// HAL controllers sections parsing functions
-int HalCtlsHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_object *MixerJ);
-int HalCtlsHalMapConfig(afb_api_t apiHandle, CtlSectionT *section, json_object *AlsaMapJ);
-
-// HAL controllers verbs functions
-void HalCtlsInfo(afb_req_t request);
-void HalCtlsSubscribe(afb_req_t request);
-void HalCtlsUnsubscribe(afb_req_t request);
-
-#endif /* _HALMGR_CB_INCLUDE_ */ \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.c
deleted file mode 100644
index 1839261..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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 <stdio.h>
-#include <string.h>
-
-#include <wrap-json.h>
-
-#include <afb/afb-binding.h>
-
-#include "4a-hal-utilities-data.h"
-
-#include "4a-hal-utilities-hal-streams-handler.h"
-#include "4a-hal-utilities-verbs-loader.h"
-
-#include "../4a-hal-manager/4a-hal-manager.h"
-
-#include "4a-hal-controllers-mixer-link.h"
-#include "4a-hal-controllers-cb.h"
-
-/*******************************************************************************
- * HAL controllers handle mixer calls functions *
- ******************************************************************************/
-
-int HalCtlsHandleMixerData(afb_api_t apiHandle, struct CtlHalMixerData **mixerDataList, json_object *currentDataJ, enum MixerDataType dataType)
-{
- int idx, mixerDataNb, verbStart, size;
- int err = (int) MIXER_NO_ERROR;
-
- char *currentDataVerbName, *currentStreamCardId;
-
- json_type currentDataType;
- json_object *currentJ;
-
- struct CtlHalMixerData *currentMixerData;
-
- currentDataType = json_object_get_type(currentDataJ);
- switch(currentDataType) {
- case json_type_object:
- mixerDataNb = 1;
- break;
- case json_type_array:
- mixerDataNb = (unsigned int) json_object_array_length(currentDataJ);
- break;
- default:
- mixerDataNb = 0;
- AFB_API_ERROR(apiHandle, "No data returned");
- return (int) MIXER_ERROR_DATA_EMPTY;
- }
-
- for(idx = 0; idx < mixerDataNb; idx++) {
- if(currentDataType == json_type_array)
- currentJ = json_object_array_get_idx(currentDataJ, (int) idx);
- else
- currentJ = currentDataJ;
-
- if(wrap_json_unpack(currentJ, "{s:s}", "verb", &currentDataVerbName)) {
- AFB_API_ERROR(apiHandle, "Can't find verb in current data object");
- err += (int) MIXER_ERROR_DATA_NAME_UNAVAILABLE;
- }
- else if(dataType == MIXER_DATA_STREAMS && wrap_json_unpack(currentJ, "{s:s}", "alsa", &currentStreamCardId)) {
- AFB_API_ERROR(apiHandle, "Can't find card id in current data object");
- err += (int) MIXER_ERROR_DATA_CARDID_UNAVAILABLE;
- }
- else {
- switch(dataType) {
- case MIXER_DATA_STREAMS:
- size = (int) strlen(currentDataVerbName);
- for(verbStart = 0; verbStart < size; verbStart++) {
- if(currentDataVerbName[verbStart] == '#') {
- verbStart++;
- break;
- }
- }
-
- if(verbStart == size)
- verbStart = 0;
-
- if(! HalUtlAddStreamDataAndCreateStreamVerb(apiHandle,
- &currentDataVerbName[verbStart],
- currentDataVerbName,
- currentStreamCardId)) {
- AFB_API_ERROR(apiHandle,
- "Error while adding stream '%s'",
- currentDataVerbName);
- err += (int) MIXER_ERROR_STREAM_NOT_ADDED;
- }
-
- break;
-
- case MIXER_DATA_PLAYBACKS:
- case MIXER_DATA_CAPTURES:
- currentMixerData = HalUtlAddMixerDataToMixerDataList(mixerDataList);
-
- currentMixerData->verb = strdup((dataType == MIXER_DATA_PLAYBACKS) ? HAL_PLAYBACK_ID : HAL_CAPTURE_ID);
- currentMixerData->verbToCall = strdup(currentDataVerbName);
-
- if((! currentMixerData->verb) ||
- (! currentMixerData->verbToCall)) {
- HalUtlRemoveSelectedMixerData(mixerDataList, currentMixerData);
- err += (int) MIXER_ERROR_STREAM_ALLOCATION_FAILED;
- }
- break;
-
- default:
- break;
- }
- }
- }
-
- if(dataType == MIXER_DATA_PLAYBACKS) {
- if(afb_api_add_verb(apiHandle,
- HAL_PLAYBACK_ID,
- "Playback action transferred to mixer",
- HalUtlActionOnPlayback,
- (void *) *mixerDataList,
- NULL,
- 0,
- 0)) {
- AFB_API_ERROR(apiHandle, "Error while creating verb for playbacks : '%s'", HAL_PLAYBACK_ID);
- err += (int) MIXER_ERROR_PLAYBACK_VERB_NOT_CREATED;
- }
- }
-
- if(dataType == MIXER_DATA_CAPTURES) {
- if(afb_api_add_verb(apiHandle,
- HAL_CAPTURE_ID,
- "Capture action transferred to mixer",
- HalUtlActionOnCapture,
- (void *) *mixerDataList,
- NULL,
- 0,
- 0)) {
- AFB_API_ERROR(apiHandle, "Error while creating verb for captures : '%s'", HAL_CAPTURE_ID);
- err += (int) MIXER_ERROR_CAPTURE_VERB_NOT_CREATED;
- }
- }
-
- return err;
-}
-
-int HalCtlsHandleMixerAttachResponse(afb_api_t apiHandle, struct CtlHalSpecificData *currentHalSpecificData, json_object *mixerResponseJ)
-{
- int err = (int) MIXER_NO_ERROR;
-
- json_object *mixerStreamsJ = NULL, *mixerPlaybacksJ = NULL, *mixerCapturesJ = NULL;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Can't get current hal api handle");
- return (int) MIXER_ERROR_API_UNAVAILABLE;
- }
-
- if(wrap_json_unpack(mixerResponseJ, "{s?:o s?:o s?:o}", "streams", &mixerStreamsJ, "playbacks", &mixerPlaybacksJ, "captures", &mixerCapturesJ)) {
- AFB_API_ERROR(apiHandle, "Can't get streams|playbacks|captures object in '%s'", json_object_get_string(mixerResponseJ));
- return (int) MIXER_ERROR_DATA_UNAVAILABLE;
- }
-
- if(mixerStreamsJ && (err += HalCtlsHandleMixerData(apiHandle, &currentHalSpecificData->ctlHalStreamsData, mixerStreamsJ, MIXER_DATA_STREAMS)))
- AFB_API_ERROR(apiHandle, "Error during handling response mixer streams data '%s'", json_object_get_string(mixerStreamsJ));
-
- if(mixerPlaybacksJ && (err += HalCtlsHandleMixerData(apiHandle, &currentHalSpecificData->ctlHalPlaybacksData, mixerPlaybacksJ, MIXER_DATA_PLAYBACKS)))
- AFB_API_ERROR(apiHandle, "Error during handling response mixer playbacks data '%s'", json_object_get_string(mixerPlaybacksJ));
-
- if(mixerCapturesJ && (err += HalCtlsHandleMixerData(apiHandle, &currentHalSpecificData->ctlHalCapturesData, mixerCapturesJ, MIXER_DATA_CAPTURES)))
- AFB_API_ERROR(apiHandle, "Error during handling response mixer captures data '%s'", json_object_get_string(mixerCapturesJ));
-
- if(! currentHalSpecificData->ctlHalStreamsData) {
- AFB_API_WARNING(apiHandle, "No stream detected in mixer response, %s verb won't be created", HAL_ALL_STREAMS_VERB);
- }
- else if(afb_api_add_verb(apiHandle,
- HAL_ALL_STREAMS_VERB,
- "Send a stream action on all streams",
- HalUtlActionOnAllStream,
- (void *) currentHalSpecificData->ctlHalStreamsData,
- NULL,
- 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 err;
-}
-
-int HalCtlsAttachToMixer(afb_api_t apiHandle)
-{
- int err = 0, mixerError;
-
- char *apiToCall, *returnedError = NULL, *returnedInfo = NULL;
-
- CtlConfigT *ctrlConfig;
-
- struct SpecificHalData *currentCtlHalData, *concurentHalData = NULL;
-
- json_object *responseJ = NULL;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Can't get current hal api handle");
- return -1;
- }
-
- if(! (ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle))) {
- AFB_API_ERROR(apiHandle, "Can't get current hal controller config");
- return -2;
- }
-
- if(! (currentCtlHalData = (struct SpecificHalData *) getExternalData(ctrlConfig))) {
- AFB_API_ERROR(apiHandle, "Can't get current hal controller data");
- return -3;
- }
-
- switch(currentCtlHalData->status) {
- case HAL_STATUS_UNAVAILABLE:
- AFB_API_ERROR(apiHandle, "Seems that the hal corresponding card was not found by alsacore at startup");
- return -4;
-
- case HAL_STATUS_READY:
- AFB_API_NOTICE(apiHandle, "Seems that the hal mixer is already initialized");
- return 1;
-
- case HAL_STATUS_AVAILABLE:
- break;
- }
-
- concurentHalData = HalUtlSearchReadyHalDataByCardId(HalMngGetHalDataList(), currentCtlHalData->sndCardId);
- if(concurentHalData) {
- AFB_API_ERROR(apiHandle,
- "Trying to attach mixer for hal '%s' but the alsa device %i is already in use with mixer by hal '%s'",
- currentCtlHalData->apiName,
- currentCtlHalData->sndCardId,
- concurentHalData->apiName);
- return -5;
- }
-
- if(! (apiToCall = currentCtlHalData->ctlHalSpecificData->mixerApiName)) {
- AFB_API_ERROR(apiHandle, "Can't get mixer api");
- return -6;
- }
-
- if(afb_api_call_sync(apiHandle,
- apiToCall,
- MIXER_ATTACH_VERB,
- json_object_get(currentCtlHalData->ctlHalSpecificData->halMixerJ),
- &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_ATTACH_VERB,
- apiToCall,
- returnedError ? returnedError : "not returned",
- returnedInfo ? returnedInfo : "not returned");
- err = -7;
- }
- else if(! responseJ) {
- AFB_API_ERROR(apiHandle,
- "Seems that %s call to api %s succeed but no response was returned",
- MIXER_ATTACH_VERB,
- apiToCall);
- err = -8;
- }
- else if((mixerError = HalCtlsHandleMixerAttachResponse(apiHandle, currentCtlHalData->ctlHalSpecificData, responseJ)) != (int) MIXER_NO_ERROR) {
- 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,
- apiToCall,
- mixerError,
- json_object_get_string(responseJ));
- err = -9;
- }
- else {
- AFB_API_NOTICE(apiHandle,
- "Seems that %s call to api %s succeed with no warning raised : '%s'",
- MIXER_ATTACH_VERB,
- apiToCall,
- json_object_get_string(responseJ));
- currentCtlHalData->status = HAL_STATUS_READY;
- }
-
- if(responseJ)
- json_object_put(responseJ);
-
- free(returnedError);
- free(returnedInfo);
-
- return err;
-}
-
-int HalCtlsGetInfoFromMixer(afb_api_t apiHandle,
- char *apiToCall,
- json_object *requestJson,
- json_object **toReturnJ,
- char **returnedError,
- char **returnedInfo)
-{
- json_object *responseJ = NULL;
-
- if(! apiHandle) {
- AFB_API_ERROR(apiHandle, "Can't get current hal api handle");
- return -1;
- }
-
- if(! apiToCall) {
- AFB_API_ERROR(apiHandle, "Can't get mixer api");
- return -2;
- }
-
- if(! requestJson) {
- AFB_API_ERROR(apiHandle, "Can't get request json");
- return -3;
- }
-
- if(*returnedError || *returnedInfo) {
- AFB_API_ERROR(apiHandle, "'returnedError' and 'returnedInfo' strings should be empty and set to 'NULL'");
- return -4;
- }
-
- if(*toReturnJ) {
- AFB_API_ERROR(apiHandle, "'toReturnJ' should be empty and set to 'NULL'");
- return -5;
- }
-
- if(afb_api_call_sync(apiHandle,
- apiToCall,
- MIXER_INFO_VERB,
- json_object_get(requestJson),
- &responseJ,
- returnedError,
- returnedInfo)) {
- AFB_API_ERROR(apiHandle,
- "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s'",
- apiToCall,
- MIXER_INFO_VERB,
- *returnedError ? *returnedError : "not returned",
- *returnedInfo ? *returnedInfo : "not returned");
- return -6;
- }
- else if(! responseJ) {
- AFB_API_ERROR(apiHandle,
- "Seems that %s call to api %s succeed but no response was returned",
- MIXER_INFO_VERB,
- apiToCall);
- json_object_put(responseJ);
- return -7;
- }
- else {
- AFB_API_NOTICE(apiHandle,
- "Seems that %s call to api %s succeed with no warning raised : '%s'",
- MIXER_INFO_VERB,
- apiToCall,
- json_object_get_string(responseJ));
- *toReturnJ = responseJ;
- }
-
- return 0;
-} \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.h
deleted file mode 100644
index 744830c..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-link.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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.
- */
-
-#ifndef _HAL_CTLS_SOFTMIXER_LINK_INCLUDE_
-#define _HAL_CTLS_SOFTMIXER_LINK_INCLUDE_
-
-#include <stdio.h>
-
-#include <wrap-json.h>
-
-#include <afb/afb-binding.h>
-
-#include <afb-helpers-utils.h>
-
-#include "4a-hal-utilities-data.h"
-
-#define MIXER_ATTACH_VERB "attach"
-#define MIXER_INFO_VERB "info"
-
-#define HAL_PLAYBACK_ID "playback"
-#define HAL_CAPTURE_ID "capture"
-
-#define HAL_ALL_STREAMS_VERB "all-streams"
-
-// Enum for the type of object sent back by the mixer
-enum MixerDataType {
- MIXER_DATA_STREAMS = 1,
- MIXER_DATA_PLAYBACKS = 2,
- MIXER_DATA_CAPTURES = 3
-};
-
-// 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_PLAYBACK_VERB_NOT_CREATED =-4,
- MIXER_ERROR_CAPTURE_VERB_NOT_CREATED =-5,
- MIXER_ERROR_ALL_STREAMS_VERB_NOT_CREATED =-6,
- MIXER_ERROR_DATA_NAME_UNAVAILABLE=-10,
- MIXER_ERROR_DATA_CARDID_UNAVAILABLE=-100,
- MIXER_ERROR_STREAM_NOT_ADDED =-1000,
- MIXER_ERROR_STREAM_ALLOCATION_FAILED =-10000
-};
-
-// HAL controllers handle mixer calls functions
-int HalCtlsAttachToMixer(afb_api_t apiHandle);
-int HalCtlsGetInfoFromMixer(afb_api_t apiHandle,
- char *apiToCall,
- json_object *requestJson,
- json_object **toReturnJ,
- char **returnedError,
- char **returnedInfo);
-
-#endif /* _HAL_CTLS_SOFTMIXER_LINK_INCLUDE_ */ \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c
deleted file mode 100644
index 4e9b56d..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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 <stdio.h>
-#include <string.h>
-
-#include <limits.h>
-#include <math.h>
-
-#include <wrap-json.h>
-
-#include <afb/afb-binding.h>
-
-#include "4a-hal-controllers-value-handler.h"
-#include "4a-hal-controllers-alsacore-link.h"
-
-/*******************************************************************************
- * Simple conversion value to/from percentage functions *
- ******************************************************************************/
-
-int HalCtlsConvertValueToPercentage(double val, double min, double max)
-{
- double range;
-
- range = max - min;
- if(range <= 0)
- return -INT_MAX;
-
- val -= min;
-
- return (int) round(val / range * 100);
-}
-
-int HalCtlsConvertPercentageToValue(int percentage, int min, int max)
-{
- int range;
-
- range = max - min;
- if(range <= 0)
- return -INT_MAX;
-
- return (int) round((double) percentage * (double) range * 0.01 + (double) min);
-}
-
-/*******************************************************************************
- * Convert json object from percentage to value *
- ******************************************************************************/
-
-int HalCtlsConvertJsonValueForIntegerControl(afb_api_t apiHandle,
- struct CtlHalAlsaCtlProperties *alsaCtlProperties,
- json_object *toConvertJ,
- json_object **ConvertedJ,
- enum ConversionType requestedConversion)
-{
- int initialValue, convertedValue;
-
- if(! json_object_is_type(toConvertJ, json_type_int)) {
- AFB_API_ERROR(apiHandle,
- "Can't convert json value, unrecognized json format (must be an integer) : '%s'",
- json_object_get_string(toConvertJ));
- return -1;
- }
-
- initialValue = json_object_get_int(toConvertJ);
-
- switch(requestedConversion) {
- case CONVERSION_NORMALIZED_TO_ALSACORE:
- if(initialValue < 0 || initialValue > 100) {
- AFB_API_ERROR(apiHandle,
- "Cannot convert '%i' value, value should be between 0 and 100 ('%s')",
- initialValue,
- json_object_get_string(toConvertJ));
- return -2;
- }
-
- convertedValue = HalCtlsConvertPercentageToValue(initialValue,
- alsaCtlProperties->minval,
- alsaCtlProperties->maxval);
-
- if(convertedValue == -INT_MAX) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to convert %i (using min %i et max %i)",
- initialValue,
- alsaCtlProperties->minval,
- alsaCtlProperties->maxval);
- return -3;
- }
-
- if(alsaCtlProperties->step) {
- // Round value to the nearest step
- convertedValue = (int) round((double) convertedValue / (double) alsaCtlProperties->step);
- convertedValue *= alsaCtlProperties->step;
- }
- break;
-
- case CONVERSION_ALSACORE_TO_NORMALIZED:
- convertedValue = HalCtlsConvertValueToPercentage(initialValue,
- alsaCtlProperties->minval,
- alsaCtlProperties->maxval);
-
- if(convertedValue == -INT_MAX) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to convert %i (using min %i et max %i)",
- initialValue,
- alsaCtlProperties->minval,
- alsaCtlProperties->maxval);
- return -4;
- }
-
- break;
-
- default:
- AFB_API_ERROR(apiHandle,
- "Can't convert '%i' value, unrecognized conversion type : '%i'",
- initialValue,
- (int) requestedConversion);
- *ConvertedJ = NULL;
- return -5;
- }
-
- *ConvertedJ = json_object_new_int(convertedValue);
-
- return 0;
-}
-
-int HalCtlsConvertJsonValueForBooleanControl(afb_api_t apiHandle,
- struct CtlHalAlsaCtlProperties *alsaCtlProperties,
- json_object *toConvertJ,
- json_object **ConvertedJ,
- enum ConversionType requestedConversion)
-{
- int initialValue;
-
- switch(json_object_get_type(toConvertJ)) {
- case json_type_int:
- initialValue = json_object_get_int(toConvertJ);
- break;
-
- case json_type_boolean:
- initialValue = json_object_get_boolean(toConvertJ);
- break;
-
- default:
- AFB_API_ERROR(apiHandle,
- "Can't convert json value, unrecognized format (must be an integer or a boolean) : '%s'",
- json_object_get_string(toConvertJ));
- return -1;
- }
-
- if(initialValue < 0 || initialValue > 1) {
- AFB_API_ERROR(apiHandle,
- "Cannot convert '%i' value, value should be 0 or 1 ('%s')",
- initialValue,
- json_object_get_string(toConvertJ));
- return -2;
- }
-
- switch(requestedConversion) {
- case CONVERSION_NORMALIZED_TO_ALSACORE:
- *ConvertedJ = json_object_new_int(initialValue);
- break;
-
- case CONVERSION_ALSACORE_TO_NORMALIZED:
- *ConvertedJ = json_object_new_boolean(initialValue);
- break;
-
- default:
- AFB_API_ERROR(apiHandle,
- "Can't convert '%i' value, unrecognized conversion type : '%i'",
- initialValue,
- (int) requestedConversion);
- *ConvertedJ = NULL;
- return -3;
- }
-
- return 0;
-}
-
-int HalCtlsConvertJsonValues(afb_api_t apiHandle,
- struct CtlHalAlsaCtlProperties *alsaCtlProperties,
- json_object *toConvertJ,
- json_object **ConvertedJ,
- enum ConversionType requestedConversion)
-{
- int conversionError = 0, idx, count;
-
- json_type toConvertType;
- json_object *toConvertObjectJ, *convertedValueJ, *convertedArrayJ;
-
- *ConvertedJ = NULL;
-
- toConvertType = json_object_get_type(toConvertJ);
- count = (toConvertType == json_type_array) ? (int) json_object_array_length(toConvertJ) : 1;
-
- convertedArrayJ = json_object_new_array();
-
- for(idx = 0; idx < count; idx++) {
- if(toConvertType == json_type_array)
- toConvertObjectJ = json_object_array_get_idx(toConvertJ, idx);
- else
- toConvertObjectJ = toConvertJ;
-
- switch(alsaCtlProperties->type) {
- case SND_CTL_ELEM_TYPE_INTEGER:
- case SND_CTL_ELEM_TYPE_INTEGER64:
- if((conversionError = HalCtlsConvertJsonValueForIntegerControl(apiHandle,
- alsaCtlProperties,
- toConvertObjectJ,
- &convertedValueJ,
- requestedConversion))) {
- AFB_API_ERROR(apiHandle,
- "Error %i happened in when trying to convert index %i for integer control ('%s')",
- conversionError,
- idx,
- json_object_get_string(toConvertObjectJ));
- json_object_put(convertedArrayJ);
- return -(idx + 1);
- }
- break;
-
- case SND_CTL_ELEM_TYPE_BOOLEAN:
- if((conversionError = HalCtlsConvertJsonValueForBooleanControl(apiHandle,
- alsaCtlProperties,
- toConvertObjectJ,
- &convertedValueJ,
- requestedConversion))) {
- AFB_API_ERROR(apiHandle,
- "Error %i happened in when trying to convert index %i for boolean control ('%s')",
- conversionError,
- idx,
- json_object_get_string(toConvertObjectJ));
- json_object_put(convertedArrayJ);
- return -(idx + 1);
- }
- break;
-
- default:
- AFB_API_ERROR(apiHandle,
- "Conversion not handle for the alsa control type %i",
- (int) alsaCtlProperties->type);
- json_object_put(convertedArrayJ);
- return -(idx + 1);
- }
-
- json_object_array_put_idx(convertedArrayJ, idx, convertedValueJ);
- }
-
- *ConvertedJ = convertedArrayJ;
-
- return 0;
-}
-
-int HalCtlsChangePreviousValuesUsingJson(afb_api_t apiHandle,
- struct CtlHalAlsaCtlProperties *alsaCtlProperties,
- json_object *requestedPercentageVariationJ,
- json_object *previousControlValuesJ,
- json_object **ChangedJ)
-{
- int requestedPercentageVariation, requestedVariation, toChangeValue, changedValue, idx, count;
-
- char *requestedPercentageVariationString, *conversionEnd;
-
- json_object *toChangeObjectJ, *changedArrayJ;
-
- *ChangedJ = NULL;
-
- requestedPercentageVariationString = (char *) json_object_get_string(requestedPercentageVariationJ);
-
- requestedPercentageVariation = (int) strtol(requestedPercentageVariationString, &conversionEnd, 10);
- if(conversionEnd == requestedPercentageVariationString) {
- AFB_API_ERROR(apiHandle,
- "Tried to increase/decrease an integer control \
- but string sent in json is not a increase/decrease string : '%s'",
- json_object_get_string(requestedPercentageVariationJ));
- return -1;
- }
-
- if(alsaCtlProperties->type != SND_CTL_ELEM_TYPE_INTEGER &&
- alsaCtlProperties->type != SND_CTL_ELEM_TYPE_INTEGER64) {
- AFB_API_ERROR(apiHandle,
- "Tried to increase/decrease values on a incompatible \
- control type (%i), control type must be an integer",
- alsaCtlProperties->type);
- return -2;
- }
-
- if(requestedPercentageVariation < -100 || requestedPercentageVariation > 100) {
- AFB_API_ERROR(apiHandle,
- "Tried to increase/decrease values but specified change is \
- not a valid percentage, it should be between -100 and 100");
- return -3;
- }
-
- requestedVariation = HalCtlsConvertPercentageToValue((int) abs(requestedPercentageVariation),
- alsaCtlProperties->minval,
- alsaCtlProperties->maxval);
-
- if(requestedVariation == -INT_MAX) {
- AFB_API_ERROR(apiHandle,
- "Didn't succeed to convert %i (using min %i et max %i)",
- requestedPercentageVariation,
- alsaCtlProperties->minval,
- alsaCtlProperties->maxval);
- return -4;
- }
-
- if(requestedPercentageVariation < 0)
- requestedVariation = -requestedVariation;
-
- count = (int) json_object_array_length(previousControlValuesJ);
-
- changedArrayJ = json_object_new_array();
-
- for(idx = 0; idx < count; idx++) {
- toChangeObjectJ = json_object_array_get_idx(previousControlValuesJ, idx);
-
- if(! json_object_is_type(toChangeObjectJ, json_type_int)) {
- AFB_API_ERROR(apiHandle,
- "Current json object %s is not an integer",
- json_object_get_string(toChangeObjectJ));
- return -(10 + idx);
- }
-
- toChangeValue = json_object_get_int(toChangeObjectJ);
-
- if((toChangeValue + requestedVariation) < alsaCtlProperties->minval)
- changedValue = alsaCtlProperties->minval;
- else if((toChangeValue + requestedVariation) > alsaCtlProperties->maxval)
- changedValue = alsaCtlProperties->maxval;
- else
- changedValue = toChangeValue + requestedVariation;
-
- json_object_array_put_idx(changedArrayJ, idx, json_object_new_int(changedValue));
- }
-
- *ChangedJ = changedArrayJ;
-
- return 0;
-} \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.h
deleted file mode 100644
index 03b47e7..0000000
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * 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.
- */
-
-#ifndef _HAL_CTLS_VALUE_CONVERSION_INCLUDE_
-#define _HAL_CTLS_VALUE_CONVERSION_INCLUDE_
-
-#include <stdio.h>
-
-#include <wrap-json.h>
-
-#include <afb/afb-binding.h>
-
-#include "4a-hal-controllers-alsacore-link.h"
-
-// Enum for the type of conversion requested
-enum ConversionType {
- CONVERSION_NORMALIZED_TO_ALSACORE = 1,
- CONVERSION_ALSACORE_TO_NORMALIZED = 2
-};
-
-// Simple conversion value to/from percentage functions
-int HalCtlsConvertValueToPercentage(double val, double min, double max);
-int HalCtlsConvertPercentageToValue(int percentage, int min, int max);
-
-// Convert json object from percentage to value
-int HalCtlsConvertJsonValues(afb_api_t apiHandle,
- struct CtlHalAlsaCtlProperties *alsaCtlProperties,
- json_object *toConvertJ,
- json_object **ConvertedJ,
- enum ConversionType requestedConversion);
-
-// Increase/Decrease previous values using percentage passed in Json
-int HalCtlsChangePreviousValuesUsingJson(afb_api_t apiHandle,
- struct CtlHalAlsaCtlProperties *alsaCtlProperties,
- json_object *requestedPercentageVariationJ,
- json_object *previousControlValuesJ,
- json_object **ChangedJ);
-
-#endif /* _HAL_CTLS_VALUE_CONVERSION_INCLUDE_ */ \ No newline at end of file