diff options
-rw-r--r-- | HAL-afb/HAL_MOST_UNICENS/hal_most_unicens.c | 23 | ||||
-rw-r--r-- | HAL-afb/HAL_MOST_UNICENS/wrap_unicens.c | 110 | ||||
-rw-r--r-- | HAL-afb/HAL_MOST_UNICENS/wrap_unicens.h | 2 | ||||
-rw-r--r-- | conf.d/cmake/config.cmake | 2 | ||||
-rw-r--r-- | nbproject/configurations.xml | 88 |
5 files changed, 187 insertions, 38 deletions
diff --git a/HAL-afb/HAL_MOST_UNICENS/hal_most_unicens.c b/HAL-afb/HAL_MOST_UNICENS/hal_most_unicens.c index 2cffe8d..7240fe0 100644 --- a/HAL-afb/HAL_MOST_UNICENS/hal_most_unicens.c +++ b/HAL-afb/HAL_MOST_UNICENS/hal_most_unicens.c @@ -23,10 +23,12 @@ #include "wrap_unicens.h" #include "wrap_volume.h" -#define XML_CONFIG_PATH "/home/agluser/DEVELOPMENT/AGL/BINDING/unicens2-binding/data/config_multichannel_audio_kit.xml" -#define ALSA_CARD_NAME "Microchip MOST:1" +#ifndef UCS2_CFG_PATH +# define UCS2_CFG_PATH "/home/agluser/DEVELOPMENT/AGL/BINDING/unicens2-binding/data" +#endif -#define PCM_MAX_CHANNELS 6 +#define ALSA_CARD_NAME "Microchip MOST:1" +#define PCM_MAX_CHANNELS 6 static int master_volume; static json_bool master_switch; @@ -96,6 +98,7 @@ STATIC alsaHalSndCardT alsaHalSndCard = { /* initializes ALSA sound card, UNICENS API */ STATIC int unicens_service_init() { int err = 0; + char *config_file = NULL; AFB_NOTICE("Initializing HAL-MOST-UNICENS-BINDING"); err = halServiceInit(afbBindingV2.api, &alsaHalSndCard); @@ -110,13 +113,25 @@ STATIC int unicens_service_init() { goto OnErrorExit; } + err = wrap_ucs_getconfig_sync(UCS2_CFG_PATH, &config_file); + if (err || (config_file == NULL)) { + AFB_ERROR("Failed to retrieve configuration"); + goto OnErrorExit; + } + else { + AFB_NOTICE("Found configuration: %s", config_file); + } + err = wrap_ucs_subscribe_sync(); if (err) { AFB_ERROR("Failed to subscribe to UNICENS binding"); goto OnErrorExit; } - err = wrap_ucs_initialize_sync(XML_CONFIG_PATH); + err = wrap_ucs_initialize_sync(config_file); + free(config_file); + config_file = NULL; + if (err) { AFB_ERROR("Failed to initialize UNICENS binding"); goto OnErrorExit; diff --git a/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.c b/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.c index 0cac86b..dc82568 100644 --- a/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.c +++ b/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.c @@ -21,14 +21,18 @@ #include <string.h> #include <json-c/json.h> #include <afb/afb-binding.h> - #include "wrap_unicens.h" #include "wrap-json.h" typedef struct async_job_ { - wrap_ucs_result_cb_t result_fptr; + wrap_ucs_result_cb_t result_fptr; void *result_user_ptr; -} async_job_t; +} async_job_t; + +typedef struct parse_result_ { + int done; + char *str_result; +} parse_result_t; /* Subscribes to unicens2-binding events. * \return Returns 0 if successful, otherwise != 0". @@ -63,19 +67,78 @@ OnErrorExit: return err; } +/* Checks if name ends with a given letter. */ +static int wrap_ucs_string_ends_with(const char *name, char letter) { + + int result = 0; + size_t len = strlen(name); + + if (len > 0) { + + if (name[len] == letter) { + result = 1; + } + } + + return result; +} + +/* Callback for iteration through found files. Marks search as "done" as + * soon as the search pattern "kit.xml" matches. + * \param closure User reference. Points to parse_result_t. + * \param j_obj Points to json object within array. + */ +static void wrap_ucs_find_xml_cb(void *closure, struct json_object *j_obj) { + + const char *dir, *name; + parse_result_t *result; + + if (!closure) + return; + + result = (parse_result_t *)closure; + if (result->done) + return; + + wrap_json_unpack(j_obj, "{s:s, s:s}", "dirpath", &dir, "basename", &name); + AFB_DEBUG("Found file: %s", name); + + if(strstr(name, "kit.xml") != NULL) { + size_t sz = strlen(dir)+strlen(name)+10; + char * full_path = malloc(sz); + + strncpy(full_path, dir, sz); + + if (!wrap_ucs_string_ends_with(dir, '/')) + strncat(full_path, "/", sz); + + strncat(full_path, name, sz); + AFB_DEBUG("Found XML file: %s", full_path); + + result->done = 1; + result->str_result = full_path; + } +} + /* Retrieves XML configuration path to initialize unicens2-binding. - * \param config_path Directory containing XML configuration file(s). + * \param config_path Directory containing XML configuration file(s). + * \param file_found Points to found file_path or NULL if not found. + * Memory must be released by calling free(). * \return Returns 0 if successful, otherwise != 0". */ -extern int wrap_ucs_getconfig_sync(const char *config_path) { - json_object *j_response, *j_query = NULL; - int err; +extern int wrap_ucs_getconfig_sync(const char *config_path, char **file_found) { + + int err = 0; + json_object *j_response, *j_query, *j_paths = NULL; + parse_result_t result = {.done = 0, .str_result = NULL}; + + *file_found = NULL; /* Build JSON object to retrieve UNICENS configuration */ - if (config_path != NULL) - err = wrap_json_pack(&j_query, "{s:s}", "cfgpath", config_path); - else + if ((config_path == NULL) || (strcmp(config_path, "") == 0)) err = wrap_json_pack(&j_query, "{}"); + else + err = wrap_json_pack(&j_query, "{s:s}", "cfgpath", config_path); if (err) { AFB_ERROR("Failed to create listconfig json object"); @@ -88,7 +151,25 @@ extern int wrap_ucs_getconfig_sync(const char *config_path) { goto OnErrorExit; } else { - AFB_NOTICE("UNICENS listconfig result, res=%s", json_object_to_json_string(j_response)); + AFB_DEBUG("UNICENS listconfig result, res=%s", json_object_to_json_string(j_response)); + + if (json_object_object_get_ex(j_response, "response", &j_paths)) { + + AFB_DEBUG("UNICENS listconfig result, paths=%s", json_object_to_json_string(j_paths)); + + wrap_json_optarray_for_all(j_paths, &wrap_ucs_find_xml_cb, &result); + + if (result.done) { + *file_found = strdup(result.str_result); + free(result.str_result); + result.str_result = NULL; + } + else { + AFB_NOTICE("wrap_ucs_getconfig_sync, search pattern does not match for paths=%s", json_object_to_json_string(j_paths)); + err = -1; + } + } + json_object_put(j_response); } json_object_put(j_query); @@ -100,7 +181,6 @@ OnErrorExit: return err; } - /* Initializes the unicens2-binding. * \param file_name Path to XML configuration file or \c NULL for * first found file in default path. @@ -170,11 +250,11 @@ extern int wrap_ucs_i2cwrite_sync(uint16_t node, uint8_t *data_ptr, uint8_t data err = afb_service_call_sync("UNICENS", "writei2c", j_query, &j_response); if (err) { - AFB_ERROR("Failed to call writei2c"); + AFB_ERROR("Failed to call writei2c_sync"); goto OnErrorExit; } else { - AFB_NOTICE("Called writei2c, res=%s", "async"/*json_object_to_json_string(j_response)*/); + AFB_INFO("Called writei2c_sync, res=%s", json_object_to_json_string(j_response)); json_object_put(j_response); } @@ -191,7 +271,7 @@ OnErrorExit: static void wrap_ucs_i2cwrite_cb(void *closure, int status, struct json_object *j_result) { - AFB_DEBUG("wrap_ucs_i2cwrite_cb: closure=%p status=%d, res=%s", closure, status, json_object_to_json_string(j_result)); + AFB_INFO("wrap_ucs_i2cwrite_cb: closure=%p status=%d, res=%s", closure, status, json_object_to_json_string(j_result)); if (closure) { async_job_t *job_ptr = (async_job_t *)closure; diff --git a/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.h b/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.h index 268fb74..c28d13a 100644 --- a/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.h +++ b/HAL-afb/HAL_MOST_UNICENS/wrap_unicens.h @@ -29,6 +29,6 @@ extern int wrap_ucs_i2cwrite(uint16_t node, uint8_t *data_ptr, uint8_t data_sz, /* Synchronous API: functions */
extern int wrap_ucs_subscribe_sync();
-extern int wrap_ucs_getconfig_sync(const char *config_path);
+extern int wrap_ucs_getconfig_sync(const char *config_path, char **file_found);
extern int wrap_ucs_initialize_sync(const char* file_name);
extern int wrap_ucs_i2cwrite_sync(uint16_t node, uint8_t *data_ptr, uint8_t data_sz);
diff --git a/conf.d/cmake/config.cmake b/conf.d/cmake/config.cmake index 73a00f6..9719711 100644 --- a/conf.d/cmake/config.cmake +++ b/conf.d/cmake/config.cmake @@ -83,6 +83,8 @@ set (PKG_REQUIRED_LIST add_compile_options(-DCTL_PLUGIN_MAGIC=2468013579) add_compile_options(-DCONTROL_PLUGIN_PATH="${CMAKE_BINARY_DIR}:${BINDINGS_INSTALL_DIR}/ctlplug:/usr/lib/afb/ctlplug") + add_compile_options(-DUCS2_CFG_PATH="../../unicens2-binding/data:/etc/default/ucs:../data:./data") + # Print a helper message when every thing is finished # ---------------------------------------------------- set(CLOSING_MESSAGE "Debug in ./buid: afb-daemon --port=1234 --ldpaths=. --workdir=. --roothttp=../htdocs --tracereq=common --token='' --verbose") diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 75a5a25..f7241d3 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -61,6 +61,14 @@ <in>HalPlugPcm.c</in> </df> <df name="HAL_MOST_UNICENS"> + <df name="ucs2-vol"> + <df name="src"> + <in>device_container.cpp</in> + <in>device_value.cpp</in> + <in>libmostvolume.cpp</in> + <in>setup.cpp</in> + </df> + </df> <in>hal_most_unicens.c</in> <in>wrap-json.c</in> <in>wrap_unicens.c</in> @@ -387,7 +395,7 @@ </cTool> </item> <item path="HAL-afb/HAL-interface/hal-volume.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> <incDir> <pElem>/usr/lib64/gcc/x86_64-suse-linux/5/include</pElem> <pElem>build/HAL-afb/HAL-interface</pElem> @@ -395,7 +403,7 @@ </cTool> </item> <item path="HAL-afb/HAL-plugin/HalPlugCb.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> <incDir> <pElem>HAL-afb/HAL-plugin</pElem> <pElem>/usr/lib64/gcc/x86_64-suse-linux/5/include</pElem> @@ -404,7 +412,7 @@ </cTool> </item> <item path="HAL-afb/HAL-plugin/HalPlugCtl.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> <incDir> <pElem>HAL-afb/HAL-plugin</pElem> <pElem>/usr/lib64/gcc/x86_64-suse-linux/5/include</pElem> @@ -413,7 +421,7 @@ </cTool> </item> <item path="HAL-afb/HAL-plugin/HalPlugPcm.c" ex="false" tool="0" flavor2="3"> - <cTool flags="1"> + <cTool flags="2"> <incDir> <pElem>../../../opt/include/afb</pElem> <pElem>HAL-afb/HAL-plugin</pElem> @@ -433,7 +441,7 @@ flavor2="3"> <incDir> <pElem>/opt/AGL/include/afb</pElem> - <pElem>HAL-afb/hal-most-unicens</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS</pElem> <pElem>/usr/include/json-c</pElem> <pElem>Shared-Interface</pElem> <pElem>HAL-afb/HAL-interface</pElem> @@ -441,11 +449,55 @@ </incDir> </cTool> </item> + <item path="HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src/device_container.cpp" + ex="false" + tool="1" + flavor2="0"> + <ccTool flags="1"> + <incDir> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/inc</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src</pElem> + </incDir> + </ccTool> + </item> + <item path="HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src/device_value.cpp" + ex="false" + tool="1" + flavor2="0"> + <ccTool flags="1"> + <incDir> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/inc</pElem> + </incDir> + </ccTool> + </item> + <item path="HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src/libmostvolume.cpp" + ex="false" + tool="1" + flavor2="0"> + <ccTool flags="1"> + <incDir> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/inc</pElem> + </incDir> + </ccTool> + </item> + <item path="HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src/setup.cpp" + ex="false" + tool="1" + flavor2="0"> + <ccTool flags="1"> + <incDir> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/inc</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/src</pElem> + </incDir> + </ccTool> + </item> <item path="HAL-afb/HAL_MOST_UNICENS/wrap-json.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> <incDir> <pElem>HAL-afb/HAL-interface</pElem> <pElem>build/HAL-afb/Unicens-USB</pElem> @@ -458,10 +510,10 @@ flavor2="3"> <incDir> <pElem>/opt/AGL/include/afb</pElem> - <pElem>HAL-afb/hal-most-unicens</pElem> - <pElem>/usr/include/json-c</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS</pElem> <pElem>/usr/lib64/gcc/x86_64-suse-linux/5/include</pElem> - <pElem>build/HAL-afb/hal-most-unicens</pElem> + <pElem>/usr/include/json-c</pElem> + <pElem>build/HAL-afb/HAL_MOST_UNICENS</pElem> </incDir> </cTool> </item> @@ -469,29 +521,29 @@ ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> <incDir> <pElem>/opt/AGL/include/afb</pElem> - <pElem>HAL-afb/hal-most-unicens</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS</pElem> <pElem>/usr/lib64/gcc/x86_64-suse-linux/5/include</pElem> - <pElem>HAL-afb/hal-most-unicens/ucs2-vol/inc</pElem> - <pElem>build/HAL-afb/hal-most-unicens</pElem> + <pElem>HAL-afb/HAL_MOST_UNICENS/ucs2-vol/inc</pElem> + <pElem>build/HAL-afb/HAL_MOST_UNICENS</pElem> </incDir> </cTool> </item> <item path="HAL-afb/HDA-intel/IntelHdaHAL.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> </cTool> </item> <item path="HAL-afb/Scarlett-Focusrite/ScarlettUsbHAL.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> </cTool> </item> <item path="HAL-afb/Unicens-USB/UnicensHAL.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> <incDir> <pElem>Shared-Interface</pElem> <pElem>HAL-afb/HAL-interface</pElem> @@ -502,7 +554,7 @@ </cTool> </item> <item path="HAL-afb/Unicens-USB/UnicensVol.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> <incDir> <pElem>HAL-afb/HAL-interface</pElem> <pElem>/usr/lib64/gcc/x86_64-suse-linux/5/include</pElem> @@ -519,7 +571,7 @@ </cTool> </item> <item path="Shared-Interface/audio-interface.c" ex="false" tool="0" flavor2="3"> - <cTool flags="3"> + <cTool flags="4"> </cTool> </folder> <folder path="0/Alsa-afb"> |