1 /* Copyright 2017 The Chromium OS Authors. All rights reserved.
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  */
5 
6 #include <errno.h>
7 #include <syslog.h>
8 
9 #include "cras_board_config.h"
10 #include "iniparser_wrapper.h"
11 
12 static const int32_t DEFAULT_OUTPUT_BUFFER_SIZE = 512;
13 static const int32_t AEC_SUPPORTED_DEFAULT = 0;
14 static const int32_t AEC_GROUP_ID_DEFAULT = -1;
15 static const int32_t BLUETOOTH_WBS_ENABLED_INI_DEFAULT = 1;
16 static const int32_t BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_DEFAULT = 0;
17 static const int32_t HOTWORD_PAUSE_AT_SUSPEND_DEFAULT = 0;
18 
19 #define CONFIG_NAME "board.ini"
20 #define DEFAULT_OUTPUT_BUF_SIZE_INI_KEY "output:default_output_buffer_size"
21 #define AEC_SUPPORTED_INI_KEY "processing:aec_supported"
22 #define AEC_GROUP_ID_INI_KEY "processing:group_id"
23 #define BLUETOOTH_WBS_ENABLED_INI_KEY "bluetooth:wbs_enabled"
24 #define BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_KEY "bluetooth:deprioritize_wbs_mic"
25 #define UCM_IGNORE_SUFFIX_KEY "ucm:ignore_suffix"
26 #define HOTWORD_PAUSE_AT_SUSPEND "hotword:pause_at_suspend"
27 
cras_board_config_get(const char * config_path,struct cras_board_config * board_config)28 void cras_board_config_get(const char *config_path,
29 			   struct cras_board_config *board_config)
30 {
31 	char ini_name[MAX_INI_NAME_LENGTH + 1];
32 	char ini_key[MAX_INI_KEY_LENGTH + 1];
33 	const char *ptr;
34 	dictionary *ini;
35 
36 	board_config->default_output_buffer_size = DEFAULT_OUTPUT_BUFFER_SIZE;
37 	board_config->aec_supported = AEC_SUPPORTED_DEFAULT;
38 	board_config->aec_group_id = AEC_GROUP_ID_DEFAULT;
39 	board_config->ucm_ignore_suffix = NULL;
40 	board_config->bt_wbs_enabled = BLUETOOTH_WBS_ENABLED_INI_DEFAULT;
41 	board_config->deprioritize_bt_wbs_mic =
42 		BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_DEFAULT;
43 	if (config_path == NULL)
44 		return;
45 
46 	snprintf(ini_name, MAX_INI_NAME_LENGTH, "%s/%s", config_path,
47 		 CONFIG_NAME);
48 	ini_name[MAX_INI_NAME_LENGTH] = '\0';
49 	ini = iniparser_load_wrapper(ini_name);
50 	if (ini == NULL) {
51 		syslog(LOG_DEBUG, "No ini file %s", ini_name);
52 		return;
53 	}
54 
55 	snprintf(ini_key, MAX_INI_KEY_LENGTH, DEFAULT_OUTPUT_BUF_SIZE_INI_KEY);
56 	ini_key[MAX_INI_KEY_LENGTH] = 0;
57 	board_config->default_output_buffer_size =
58 		iniparser_getint(ini, ini_key, DEFAULT_OUTPUT_BUFFER_SIZE);
59 
60 	snprintf(ini_key, MAX_INI_KEY_LENGTH, AEC_SUPPORTED_INI_KEY);
61 	ini_key[MAX_INI_KEY_LENGTH] = 0;
62 	board_config->aec_supported =
63 		iniparser_getint(ini, ini_key, AEC_SUPPORTED_DEFAULT);
64 
65 	snprintf(ini_key, MAX_INI_KEY_LENGTH, AEC_GROUP_ID_INI_KEY);
66 	ini_key[MAX_INI_KEY_LENGTH] = 0;
67 	board_config->aec_group_id =
68 		iniparser_getint(ini, ini_key, AEC_GROUP_ID_DEFAULT);
69 
70 	snprintf(ini_key, MAX_INI_KEY_LENGTH, BLUETOOTH_WBS_ENABLED_INI_KEY);
71 	ini_key[MAX_INI_KEY_LENGTH] = 0;
72 	board_config->bt_wbs_enabled = iniparser_getint(
73 		ini, ini_key, BLUETOOTH_WBS_ENABLED_INI_DEFAULT);
74 
75 	snprintf(ini_key, MAX_INI_KEY_LENGTH,
76 		 BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_KEY);
77 	ini_key[MAX_INI_KEY_LENGTH] = 0;
78 	board_config->deprioritize_bt_wbs_mic = iniparser_getint(
79 		ini, ini_key, BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_DEFAULT);
80 
81 	snprintf(ini_key, MAX_INI_KEY_LENGTH, UCM_IGNORE_SUFFIX_KEY);
82 	ini_key[MAX_INI_KEY_LENGTH] = 0;
83 	ptr = iniparser_getstring(ini, ini_key, "");
84 	if (ptr) {
85 		board_config->ucm_ignore_suffix = strdup(ptr);
86 		if (!board_config->ucm_ignore_suffix)
87 			syslog(LOG_ERR, "Failed to call strdup: %d", errno);
88 	}
89 
90 	snprintf(ini_key, MAX_INI_KEY_LENGTH, HOTWORD_PAUSE_AT_SUSPEND);
91 	ini_key[MAX_INI_KEY_LENGTH] = 0;
92 	board_config->hotword_pause_at_suspend = iniparser_getint(
93 		ini, ini_key, HOTWORD_PAUSE_AT_SUSPEND_DEFAULT);
94 
95 	iniparser_freedict(ini);
96 	syslog(LOG_DEBUG, "Loaded ini file %s", ini_name);
97 }
98