summaryrefslogtreecommitdiffstats
path: root/mixer-binding
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
parente26d497d74bf7e5926a84cf83d61857f27d75753 (diff)
Initial push work in progress
Diffstat (limited to 'mixer-binding')
-rw-r--r--mixer-binding/CMakeLists.txt50
-rw-r--r--mixer-binding/mixer-binding.c150
-rw-r--r--mixer-binding/mixer-binding.h30
3 files changed, 230 insertions, 0 deletions
diff --git a/mixer-binding/CMakeLists.txt b/mixer-binding/CMakeLists.txt
new file mode 100644
index 0000000..bc4ebe6
--- /dev/null
+++ b/mixer-binding/CMakeLists.txt
@@ -0,0 +1,50 @@
+###########################################################################
+# Copyright 2015, 2016, 2017, 2018 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.
+###########################################################################
+
+
+# Add target to project dependency list
+PROJECT_TARGET_ADD(mixer-binding)
+
+ # Define project Targets
+ ADD_LIBRARY(${TARGET_NAME} MODULE mixer-binding.c)
+
+ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+ PREFIX ""
+ LABELS "BINDING"
+ LINK_FLAGS ${BINDINGS_LINK_FLAG}
+ OUTPUT_NAME ${TARGET_NAME}
+ )
+
+ TARGET_LINK_LIBRARIES(${TARGET_NAME}
+ afb-helpers
+ ctl-utilities
+ ${link_libraries}
+ )
+
+ # Define target includes for this target client
+ TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME}
+ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+
+ # Define target includes for this target client
+ TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME}
+ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+
+ # make sure config is copied before starting
+ add_dependencies(${TARGET_NAME} soft-mixer-config) \ No newline at end of file
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;
+}
+
diff --git a/mixer-binding/mixer-binding.h b/mixer-binding/mixer-binding.h
new file mode 100644
index 0000000..57d4ce9
--- /dev/null
+++ b/mixer-binding/mixer-binding.h
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+
+
+#ifndef _CTL_BINDING_INCLUDE_
+#define _CTL_BINDING_INCLUDE_
+
+#include <stdio.h>
+#include <alsa/asoundlib.h>
+
+#include <filescan-utils.h>
+#include <wrap-json.h>
+
+#include <ctl-config.h>
+
+#endif /* _CTL_BINDING_INCLUDE_ */