summaryrefslogtreecommitdiffstats
path: root/src/ahl-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ahl-config.c')
-rw-r--r--src/ahl-config.c140
1 files changed, 85 insertions, 55 deletions
diff --git a/src/ahl-config.c b/src/ahl-config.c
index 432910f..5e3de08 100644
--- a/src/ahl-config.c
+++ b/src/ahl-config.c
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2017 "Audiokinetic Inc"
- * Author Francois Thibault <fthibault@audiokinetic.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,19 +22,39 @@
#include "ahl-binding.h"
-// TODO: Term() to free all allocs upon exit...
-
extern AHLCtxT g_AHLCtx;
-PUBLIC int ParseHLBConfig() {
+static InterruptBehaviorT InterruptBehaviorToEnum(char * in_pInterruptBehaviorStr)
+{
+ g_assert_nonnull(in_pInterruptBehaviorStr);
+ if (strcasecmp(in_pInterruptBehaviorStr,AHL_INTERRUPTBEHAVIOR_CONTINUE)==0) {
+ return INTERRUPTBEHAVIOR_CONTINUE;
+ }
+ else if (strcasecmp(in_pInterruptBehaviorStr,AHL_INTERRUPTBEHAVIOR_CANCEL)==0) {
+ return INTERRUPTBEHAVIOR_CANCEL;
+ }
+ else if (strcasecmp(in_pInterruptBehaviorStr,AHL_INTERRUPTBEHAVIOR_PAUSE)==0) {
+ return INTERRUPTBEHAVIOR_PAUSE;
+ }
+ else
+ return INTERRUPTBEHAVIOR_MAXVALUE;
+}
+
+int ParseHLBConfig() {
char * versionStr = NULL;
json_object * jAudioRoles = NULL;
json_object * jHALList = NULL;
- json_object * jStateList = NULL;
+ char * policyModule = NULL;
// TODO: This should be retrieve from binding startup arguments
char configfile_path[256];
- sprintf(configfile_path, "%s/opt/config/ahl-config.json", getenv("HOME"));
+ if(getenv("AHL_CONFIG_FILE") == NULL)
+ {
+ AFB_ERROR("Please Set Environnement Variable AHL_CONFIG_FILE");
+ return 1;
+ }
+
+ sprintf(configfile_path, "%s", getenv("AHL_CONFIG_FILE"));
AFB_INFO("High-level config file -> %s\n", configfile_path);
// Open configuration file
@@ -46,67 +65,61 @@ PUBLIC int ParseHLBConfig() {
return 1;
}
- int err = wrap_json_unpack(config_JFile, "{s:s,s:o,s:o,s:o}", "version", &versionStr,"audio_roles",&jAudioRoles,"hal_list",&jHALList,"state_list",&jStateList);
+ int err = wrap_json_unpack(config_JFile, "{s:s,s:s,s:o,s:o}", "version", &versionStr,"policy_module", &policyModule,"audio_roles",&jAudioRoles,"hal_list",&jHALList);
if (err) {
AFB_ERROR("Invalid configuration file -> %s", configfile_path);
return 1;
}
-
- // Parse and populate list of known states
- g_AHLCtx.pDefaultStatesHT = g_hash_table_new(g_str_hash, g_str_equal);
- int iStateListLength = json_object_array_length(jStateList);
- for ( int i = 0; i < iStateListLength; i++)
- {
- char * pStateName = NULL;
- char * pStateVal = NULL;
- json_object * jStateobject = json_object_array_get_idx(jStateList,i);
- err = wrap_json_unpack(jStateobject, "{s:s,s:s}", "name", &pStateName,"default_val",&pStateVal);
- if (err) {
- AFB_ERROR("Invalid state object -> %s", json_object_get_string(jStateobject));
- return 1;
- }
-
- g_hash_table_insert(g_AHLCtx.pDefaultStatesHT, pStateName, pStateVal);
- }
+ AFB_INFO("High-level audio API version: %s", "1.0.0");
+ AFB_INFO("Config version: %s", versionStr);
+ AFB_INFO("Policy module: %s", policyModule);
int iHALListLength = json_object_array_length(jHALList);
+ g_AHLCtx.policyCtx.pHALList = g_ptr_array_new_with_free_func(g_free);
int iNumberOfRoles = json_object_array_length(jAudioRoles);
- // Dynamically allocated based on number or roles found
- g_AHLCtx.pHALList = g_array_sized_new(FALSE, TRUE, sizeof(GString), iHALListLength);
- g_AHLCtx.policyCtx.pRolePriority = g_array_sized_new(FALSE, TRUE, sizeof(int), iNumberOfRoles);
- g_AHLCtx.policyCtx.pAudioRoles = g_array_sized_new(FALSE, TRUE, sizeof(GString), iNumberOfRoles);
- g_AHLCtx.policyCtx.pSourceEndpoints = g_ptr_array_sized_new(iNumberOfRoles);
- g_AHLCtx.policyCtx.pSinkEndpoints = g_ptr_array_sized_new(iNumberOfRoles);
- g_AHLCtx.policyCtx.iNumberRoles = iNumberOfRoles;
+ g_AHLCtx.policyCtx.pRoleInfo = g_hash_table_new(g_str_hash, g_str_equal);
- for (unsigned int i = 0; i < iHALListLength; i++)
+ for (int i = 0; i < iHALListLength; i++)
{
char * pHAL = NULL;
json_object * jHAL = json_object_array_get_idx(jHALList,i);
- pHAL = (char *)json_object_get_string(jHAL);
- GString * gHALName = g_string_new( pHAL );
- g_array_append_val( g_AHLCtx.pHALList, *gHALName );
-
- // Set dependency on HAL
- err = afb_daemon_require_api_v2(pHAL,1) ;
- if( err != 0 )
- {
- AFB_ERROR("Audio high level API could not set dependenvy on API: %s",pHAL);
- return 1;
+ if (jHAL) {
+ pHAL = (char *)json_object_get_string(jHAL);
+ char * pHALName = g_strdup( pHAL );
+ g_ptr_array_add( g_AHLCtx.policyCtx.pHALList, pHALName );
+
+ // Set dependency on HAL specified
+ err = afb_daemon_require_api_v2(pHAL,1) ;
+ if( err != 0 )
+ {
+ AFB_ERROR("Audio high level API could not set dependency on API: %s",pHAL);
+ return 1;
+ }
}
}
- for (unsigned int i = 0; i < iNumberOfRoles; i++)
+ for (int i = 0; i < iNumberOfRoles; i++)
{
int priority = 0;
json_object * jAudioRole = json_object_array_get_idx(jAudioRoles,i);
json_object * jOutputDevices = NULL;
json_object * jInputDevices = NULL;
+ json_object * jActions = NULL;
char * pRoleName = NULL;
+ char * pInteruptBehavior = NULL;
+
int iNumOutDevices = 0;
int iNumInDevices = 0;
-
- err = wrap_json_unpack(jAudioRole, "{s:s,s:i,s?o,s?o}", "name", &pRoleName,"priority",&priority,"output",&jOutputDevices,"input",&jInputDevices);
+ int iNumActions = 0;
+
+ err = wrap_json_unpack(jAudioRole, "{s:s,s:i,s:s,s?o,s?o,s?o}",
+ "name", &pRoleName,
+ "priority",&priority,
+ "interupt_behavior",&pInteruptBehavior,
+ "output",&jOutputDevices,
+ "input",&jInputDevices,
+ "actions",&jActions
+ );
if (err) {
AFB_ERROR("Invalid audio role configuration : %s", json_object_to_json_string(jAudioRole));
return 1;
@@ -116,30 +129,47 @@ PUBLIC int ParseHLBConfig() {
iNumOutDevices = json_object_array_length(jOutputDevices);
if (jInputDevices)
iNumInDevices = json_object_array_length(jInputDevices);
-
- GString * gRoleName = g_string_new( pRoleName );
- g_array_append_val( g_AHLCtx.policyCtx.pAudioRoles, *gRoleName );
- g_array_append_val( g_AHLCtx.policyCtx.pRolePriority, priority );
+ if (jActions)
+ iNumActions = json_object_array_length(jActions);
+
+ RoleInfoT * pRoleInfo = (RoleInfoT*) malloc(sizeof(RoleInfoT));
+ memset(pRoleInfo,0,sizeof(RoleInfoT));
+ pRoleInfo->pRoleName = g_strdup( pRoleName );
+ pRoleInfo->iPriority = priority;
+ pRoleInfo->eInterruptBehavior = InterruptBehaviorToEnum(pInteruptBehavior);
+
+ // Actions
+ pRoleInfo->pActionList = g_ptr_array_new_with_free_func(g_free);
+ // Parse and validate list of available actions
+ for (int i = 0; i < iNumActions; i++)
+ {
+ json_object * jAction = json_object_array_get_idx(jActions,i);
+ char * pActionName = (char *)json_object_get_string(jAction);
+ if (pActionName)
+ g_ptr_array_add(pRoleInfo->pActionList, g_strdup(pActionName));
+ }
// Sources
- GArray * pRoleSourceDeviceArray = g_array_new(FALSE, TRUE, sizeof(EndpointInfoT));
- g_ptr_array_add(g_AHLCtx.policyCtx.pSourceEndpoints,pRoleSourceDeviceArray);
+ pRoleInfo->pSourceEndpoints = g_ptr_array_new_with_free_func(g_free);
if (iNumInDevices) {
- err = EnumerateSources(jInputDevices,i,pRoleName);
+ err = EnumerateDevices(jInputDevices,pRoleName,ENDPOINTTYPE_SOURCE,pRoleInfo->pSourceEndpoints);
if (err) {
AFB_ERROR("Invalid input devices : %s", json_object_to_json_string(jInputDevices));
return 1;
}
}
- GArray * pRoleSinkDeviceArray = g_array_new(FALSE, TRUE, sizeof(EndpointInfoT));
- g_ptr_array_add(g_AHLCtx.policyCtx.pSinkEndpoints,pRoleSinkDeviceArray);
+ // Sinks
+ pRoleInfo->pSinkEndpoints = g_ptr_array_new_with_free_func(g_free);
if (iNumOutDevices) {
- err = EnumerateSinks(jOutputDevices,i,pRoleName);
+ err = EnumerateDevices(jOutputDevices,pRoleName,ENDPOINTTYPE_SINK,pRoleInfo->pSinkEndpoints);
if (err) {
AFB_ERROR("Invalid output devices : %s", json_object_to_json_string(jOutputDevices));
return 1;
}
}
+
+ g_hash_table_insert(g_AHLCtx.policyCtx.pRoleInfo, pRoleInfo->pRoleName, pRoleInfo);
+
}
// Build lists of all device URI referenced in config file (input/output)