aboutsummaryrefslogtreecommitdiffstats
path: root/mixer-binding/mixer-binding.c
diff options
context:
space:
mode:
authorFulup Ar Foll <fulup@iot.bzh>2018-04-29 20:52:58 +0200
committerFulup Ar Foll <fulup@iot.bzh>2018-04-29 20:52:58 +0200
commitf83d651392b8556248600f2b1360b9306b845c3d (patch)
tree69498e049145fbafaa2e20dcd0b3005f44fb138d /mixer-binding/mixer-binding.c
parente26d497d74bf7e5926a84cf83d61857f27d75753 (diff)
Initial push work in progress
Diffstat (limited to 'mixer-binding/mixer-binding.c')
-rw-r--r--mixer-binding/mixer-binding.c150
1 files changed, 150 insertions, 0 deletions
diff --git a/mixer-binding/mixer-binding.c b/mixer-binding/mixer-binding.c
new file mode 100644
index 0000000..ae83932
--- /dev/null
+++ b/mixer-binding/mixer-binding.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2016 "IoT.bzh"
+ * Author Fulup Ar Foll <fulup@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 <time.h>
+
+#include "mixer-binding.h"
+
+
+// default api to print log when apihandle not avaliable
+PUBLIC afb_dynapi *AFB_default;
+
+// Config Section definition (note: controls section index should match handle retrieval in HalConfigExec)
+static CtlSectionT ctrlSections[]= {
+ {.key="plugins" , .loadCB= PluginConfig},
+ {.key="controls", .loadCB= ControlConfig},
+
+ {.key=NULL}
+};
+
+STATIC void ctrlapi_ping (AFB_ReqT request) {
+ static int count=0;
+
+ count++;
+ AFB_ReqNotice (request, "Controller:ping count=%d", count);
+ AFB_ReqSucess(request,json_object_new_int(count), NULL);
+
+ return;
+}
+
+// Every HAL export the same API & Interface Mapping from SndCard to AudioLogic is done through alsaHalSndCardT
+STATIC AFB_ApiVerbs CtrlApiVerbs[] = {
+ /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */
+ { .verb = "ping", .callback = ctrlapi_ping , .info = "ping test for API"},
+ { .verb = NULL} /* marker for end of the array */
+};
+
+STATIC int CtrlLoadStaticVerbs (afb_dynapi *apiHandle, AFB_ApiVerbs *verbs) {
+ int errcount=0;
+
+ for (int idx=0; verbs[idx].verb; idx++) {
+ errcount+= afb_dynapi_add_verb(apiHandle, CtrlApiVerbs[idx].verb, NULL, CtrlApiVerbs[idx].callback, (void*)&CtrlApiVerbs[idx], CtrlApiVerbs[idx].auth, 0);
+ }
+
+ return errcount;
+};
+
+
+STATIC int CtrlInitOneApi (AFB_ApiT apiHandle) {
+
+ AFB_default = apiHandle; // hugely hack to make all V2 AFB_DEBUG to work in fileutils
+
+ // retrieve section config from api handle
+ CtlConfigT *ctrlConfig = (CtlConfigT*) afb_dynapi_get_userdata(apiHandle);
+ int err = CtlConfigExec (apiHandle, ctrlConfig);
+
+ return err;
+}
+
+// next generation dynamic API-V3 mode
+
+STATIC int CtrlLoadOneApi (void *cbdata, AFB_ApiT apiHandle) {
+ CtlConfigT *ctrlConfig = (CtlConfigT*) cbdata;
+
+ // save closure as api's data context
+ afb_dynapi_set_userdata(apiHandle, ctrlConfig);
+
+ AFB_ApiNotice (apiHandle, "debug1");
+
+ // add static controls verbs
+ int err = CtrlLoadStaticVerbs (apiHandle, CtrlApiVerbs);
+ if (err) {
+ AFB_ApiError(apiHandle, "CtrlLoadSection fail to register static V2 verbs");
+ goto OnErrorExit;
+ }
+
+ AFB_ApiNotice (apiHandle, "debug2");
+
+ // load section for corresponding API
+ err= CtlLoadSections(apiHandle, ctrlConfig, ctrlSections);
+
+ AFB_ApiNotice (apiHandle, "debug3");
+
+ // declare an event event manager for this API;
+ afb_dynapi_on_event(apiHandle, CtrlDispatchApiEvent);
+
+ // init API function (does not receive user closure ???
+ afb_dynapi_on_init(apiHandle, CtrlInitOneApi);
+
+ afb_dynapi_seal(apiHandle);
+ return err;
+
+OnErrorExit:
+ return 1;
+}
+
+
+PUBLIC int afbBindingVdyn(afb_dynapi *apiHandle) {
+
+ AFB_default = apiHandle;
+ AFB_ApiNotice (apiHandle, "Controller in afbBindingVdyn");
+
+ const char *dirList= getenv("CONTROL_CONFIG_PATH");
+ if (!dirList) dirList=CONTROL_CONFIG_PATH;
+
+ const char *configPath = CtlConfigSearch(apiHandle, dirList, "config-");
+ if (!configPath) {
+ AFB_ApiError(apiHandle, "CtlPreInit: No config-%s-* config found in %s ", GetBinderName(), dirList);
+ goto OnErrorExit;
+ }
+
+ // load config file and create API
+ CtlConfigT *ctrlConfig = CtlLoadMetaData (apiHandle, configPath);
+ if (!ctrlConfig) {
+ AFB_ApiError(apiHandle, "CtrlBindingDyn No valid control config file in:\n-- %s", configPath);
+ goto OnErrorExit;
+ }
+
+
+ if (!ctrlConfig->api) {
+ AFB_ApiError(apiHandle, "CtrlBindingDyn API Missing from metadata in:\n-- %s", configPath);
+ goto OnErrorExit;
+ }
+
+ AFB_ApiNotice (apiHandle, "Controller API='%s' info='%s'", ctrlConfig->api, ctrlConfig->info);
+ // create one API per config file (Pre-V3 return code ToBeChanged)
+ int status = afb_dynapi_new_api(apiHandle, ctrlConfig->api, ctrlConfig->info, 1, CtrlLoadOneApi, ctrlConfig);
+
+ return status;
+
+OnErrorExit:
+ return -1;
+}
+