summaryrefslogtreecommitdiff
path: root/hal/platform_info.c
diff options
context:
space:
mode:
authorHaynes Mathew George <hgeorge@codeaurora.org>2014-06-16 16:36:20 -0700
committerEric Laurent <elaurent@google.com>2014-07-11 14:15:25 -0700
commit5bc188456348ebdfc5d3c86414952503ec41bd44 (patch)
tree3390c9541177c859af2d9c9b4a03085921cd0f1e /hal/platform_info.c
parentfdf296a35ba3deb8490522c834037e5e977b05cf (diff)
downloadaudio-5bc188456348ebdfc5d3c86414952503ec41bd44.tar.gz
hal: Add XML parser for platform info
change 1 Add XML parser which parses the platform_info.xml on the device. That xml contains ACDB ID information and is populated from the device project folder to the /etc folder on the device. It is used to overwrite hardcoded ACDB ID's in platform.c. change 2 Move platform_parser to root hal directory. Rename platform_parser to platform_info. Change name of XML file read from platform_info.xml to audio_platform_info.xml. The xml now only needs information for ACDB ID's that you want overwritten. Names in the XML now match sound device enums in platform.c. (cherry-picked from CAF commits 61764e3b8069b819c3da19a6bb38b37ad173bf50, 5588688cbdd065a3572afb032e48a265790dfea2) Change-Id: Ie5978f609bbe9d60a64e20a0906d6bd7a8c48e1b
Diffstat (limited to 'hal/platform_info.c')
-rw-r--r--hal/platform_info.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/hal/platform_info.c b/hal/platform_info.c
new file mode 100644
index 0000000..409c396
--- /dev/null
+++ b/hal/platform_info.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * 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 LOG_TAG "platform_info"
+#define LOG_NDDEBUG 0
+
+#include <errno.h>
+#include <stdio.h>
+#include <expat.h>
+#include <cutils/log.h>
+#include <audio_hw.h>
+#include "platform_api.h"
+#include <platform.h>
+
+#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml"
+
+static void process_device(const XML_Char **attr)
+{
+ int index;
+
+ if (strcmp(attr[0], "name") != 0) {
+ ALOGE("%s: 'name' not found, no ACDB ID set!", __func__);
+ goto done;
+ }
+
+ index = platform_get_snd_device_index((char *)attr[1]);
+ if (index < 0) {
+ ALOGE("%s: Device %s in %s not found, no ACDB ID set!",
+ __func__, attr[1], PLATFORM_INFO_XML_PATH);
+ goto done;
+ }
+
+ if (strcmp(attr[2], "acdb_id") != 0) {
+ ALOGE("%s: Device %s in %s has no acdb_id, no ACDB ID set!",
+ __func__, attr[1], PLATFORM_INFO_XML_PATH);
+ goto done;
+ }
+
+ if(platform_set_snd_device_acdb_id(index, atoi((char *)attr[3])) < 0) {
+ ALOGE("%s: Device %s in %s, ACDB ID %d was not set!",
+ __func__, attr[1], PLATFORM_INFO_XML_PATH, atoi((char *)attr[3]));
+ goto done;
+ }
+
+done:
+ return;
+}
+
+static void start_tag(void *userdata __unused, const XML_Char *tag_name,
+ const XML_Char **attr)
+{
+ const XML_Char *attr_name = NULL;
+ const XML_Char *attr_value = NULL;
+ unsigned int i;
+
+ if (strcmp(tag_name, "device") == 0)
+ process_device(attr);
+
+ return;
+}
+
+static void end_tag(void *userdata __unused, const XML_Char *tag_name __unused)
+{
+
+}
+
+int platform_info_init(void)
+{
+ XML_Parser parser;
+ FILE *file;
+ int ret = 0;
+ int bytes_read;
+ void *buf;
+ static const uint32_t kBufSize = 1024;
+
+ file = fopen(PLATFORM_INFO_XML_PATH, "r");
+ if (!file) {
+ ALOGD("%s: Failed to open %s, using defaults.",
+ __func__, PLATFORM_INFO_XML_PATH);
+ ret = -ENODEV;
+ goto done;
+ }
+
+ parser = XML_ParserCreate(NULL);
+ if (!parser) {
+ ALOGE("%s: Failed to create XML parser!", __func__);
+ ret = -ENODEV;
+ goto err_close_file;
+ }
+
+ XML_SetElementHandler(parser, start_tag, end_tag);
+
+ while (1) {
+ buf = XML_GetBuffer(parser, kBufSize);
+ if (buf == NULL) {
+ ALOGE("%s: XML_GetBuffer failed", __func__);
+ ret = -ENOMEM;
+ goto err_free_parser;
+ }
+
+ bytes_read = fread(buf, 1, kBufSize, file);
+ if (bytes_read < 0) {
+ ALOGE("%s: fread failed, bytes read = %d", __func__, bytes_read);
+ ret = bytes_read;
+ goto err_free_parser;
+ }
+
+ if (XML_ParseBuffer(parser, bytes_read,
+ bytes_read == 0) == XML_STATUS_ERROR) {
+ ALOGE("%s: XML_ParseBuffer failed, for %s",
+ __func__, PLATFORM_INFO_XML_PATH);
+ ret = -EINVAL;
+ goto err_free_parser;
+ }
+
+ if (bytes_read == 0)
+ break;
+ }
+
+err_free_parser:
+ XML_ParserFree(parser);
+err_close_file:
+ fclose(file);
+done:
+ return ret;
+}