diff options
author | Haynes Mathew George <hgeorge@codeaurora.org> | 2014-06-16 16:36:20 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2014-07-11 14:15:25 -0700 |
commit | 5bc188456348ebdfc5d3c86414952503ec41bd44 (patch) | |
tree | 3390c9541177c859af2d9c9b4a03085921cd0f1e /hal/platform_info.c | |
parent | fdf296a35ba3deb8490522c834037e5e977b05cf (diff) | |
download | audio-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.c | 139 |
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; +} |