15bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George/* 25bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * Copyright (C) 2014 The Android Open Source Project 35bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * 45bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * Licensed under the Apache License, Version 2.0 (the "License"); 55bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * you may not use this file except in compliance with the License. 65bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * You may obtain a copy of the License at 75bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * 85bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * http://www.apache.org/licenses/LICENSE-2.0 95bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * 105bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * Unless required by applicable law or agreed to in writing, software 115bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * distributed under the License is distributed on an "AS IS" BASIS, 125bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * See the License for the specific language governing permissions and 145bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George * limitations under the License. 155bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George*/ 165bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 175bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#define LOG_TAG "platform_info" 185bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#define LOG_NDDEBUG 0 195bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 205bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#include <errno.h> 215bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#include <stdio.h> 225bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#include <expat.h> 235bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#include <cutils/log.h> 245bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#include <audio_hw.h> 255bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#include "platform_api.h" 265bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#include <platform.h> 275bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 285bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml" 295bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 3098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgetypedef enum { 3198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ROOT, 3298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ACDB, 3398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George PCM_ID, 3498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George BACKEND_NAME, 3598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} section_t; 3698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 3798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgetypedef void (* section_process_fn)(const XML_Char **attr); 3898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 3998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_acdb_id(const XML_Char **attr); 4098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_pcm_id(const XML_Char **attr); 4198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_backend_name(const XML_Char **attr); 4298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_root(const XML_Char **attr); 4398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 4498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic section_process_fn section_table[] = { 4598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George [ROOT] = process_root, 4698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George [ACDB] = process_acdb_id, 4798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George [PCM_ID] = process_pcm_id, 4898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George [BACKEND_NAME] = process_backend_name, 4998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}; 5098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 5198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic section_t section; 5298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 5398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George/* 5498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * <audio_platform_info> 5598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * <acdb_ids> 5698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * <device name="???" acdb_id="???"/> 5798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * ... 5898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * ... 5998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * </acdb_ids> 6098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * <backend_names> 6198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * <device name="???" backend="???"/> 6298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * ... 6398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * ... 6498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * </backend_names> 6598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * <pcm_ids> 6698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * <usecase name="???" type="in/out" id="???"/> 6798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * ... 6898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * ... 6998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * </pcm_ids> 7098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George * </audio_platform_info> 7198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George */ 7298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 7398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_root(const XML_Char **attr __unused) 7498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 7598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 7698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 7798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George/* mapping from usecase to pcm dev id */ 7898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_pcm_id(const XML_Char **attr) 7998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 8098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int index; 8198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 8298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (strcmp(attr[0], "name") != 0) { 8398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: 'name' not found, no ACDB ID set!", __func__); 8498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 8598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 8698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 8798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George index = platform_get_usecase_index((char *)attr[1]); 8898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (index < 0) { 8998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: usecase %s in %s not found!", 9098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH); 9198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 9298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 9398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 9498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (strcmp(attr[2], "type") != 0) { 9598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: usecase type not mentioned", __func__); 9698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 9798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 9898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 9998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int type = -1; 10098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 10198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (!strcasecmp((char *)attr[3], "in")) { 10298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George type = 1; 10398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else if (!strcasecmp((char *)attr[3], "out")) { 10498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George type = 0; 10598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else { 10698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: type must be IN or OUT", __func__); 10798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 10898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 10998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 11098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (strcmp(attr[4], "id") != 0) { 11198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: usecase id not mentioned", __func__); 11298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 11398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 11498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 11598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int id = atoi((char *)attr[5]); 11698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 11798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (platform_set_usecase_pcm_id(index, type, id) < 0) { 11898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: usecase %s in %s, type %d id %d was not set!", 11998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH, type, id); 12098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 12198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 12298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 12398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone: 12498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return; 12598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 12698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 12798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George/* backend to be used for a device */ 12898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_backend_name(const XML_Char **attr) 12998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 13098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int index; 13198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 13298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (strcmp(attr[0], "name") != 0) { 13398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: 'name' not found, no ACDB ID set!", __func__); 13498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 13598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 13698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 13798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George index = platform_get_snd_device_index((char *)attr[1]); 13898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (index < 0) { 13998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: Device %s in %s not found, no ACDB ID set!", 14098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH); 14198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 14298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 14398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 14498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (strcmp(attr[2], "backend") != 0) { 14598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: Device %s in %s has no backed set!", 14698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH); 14798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 14898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 14998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 15098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (platform_set_snd_device_backend(index, attr[3]) < 0) { 15198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: Device %s in %s, backend %s was not set!", 15298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH, attr[3]); 15398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 15498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 15598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 15698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone: 15798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return; 15898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 15998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 16098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void process_acdb_id(const XML_Char **attr) 1615bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{ 1625bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George int index; 1635bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 1645bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (strcmp(attr[0], "name") != 0) { 1655bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: 'name' not found, no ACDB ID set!", __func__); 1665bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 1675bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 1685bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 1695bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George index = platform_get_snd_device_index((char *)attr[1]); 1705bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (index < 0) { 1715bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: Device %s in %s not found, no ACDB ID set!", 1725bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH); 1735bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 1745bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 1755bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 1765bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (strcmp(attr[2], "acdb_id") != 0) { 1775bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: Device %s in %s has no acdb_id, no ACDB ID set!", 1785bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH); 1795bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 1805bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 1815bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 18298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (platform_set_snd_device_acdb_id(index, atoi((char *)attr[3])) < 0) { 1835bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: Device %s in %s, ACDB ID %d was not set!", 1845bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George __func__, attr[1], PLATFORM_INFO_XML_PATH, atoi((char *)attr[3])); 1855bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 1865bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 1875bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 1885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone: 1895bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George return; 1905bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George} 1915bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 1925bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgestatic void start_tag(void *userdata __unused, const XML_Char *tag_name, 1935bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George const XML_Char **attr) 1945bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{ 1955bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George const XML_Char *attr_name = NULL; 1965bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George const XML_Char *attr_value = NULL; 1975bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George unsigned int i; 1985bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 19998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (strcmp(tag_name, "acdb_ids") == 0) { 20098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section = ACDB; 20198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else if (strcmp(tag_name, "pcm_ids") == 0) { 20298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section = PCM_ID; 20398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else if (strcmp(tag_name, "backend_names") == 0) { 20498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section = BACKEND_NAME; 20598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else if (strcmp(tag_name, "device") == 0) { 20698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if ((section != ACDB) && (section != BACKEND_NAME)) { 20798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("device tag only supported for acdb/backend names"); 20898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return; 20998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 21098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 21198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George /* call into process function for the current section */ 21298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section_process_fn fn = section_table[section]; 21398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George fn(attr); 21498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else if (strcmp(tag_name, "usecase") == 0) { 21598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (section != PCM_ID) { 21698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("usecase tag only supported with PCM_ID section"); 21798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return; 21898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 21998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 22098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section_process_fn fn = section_table[PCM_ID]; 22198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George fn(attr); 22298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 2235bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2245bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George return; 2255bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George} 2265bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 22798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic void end_tag(void *userdata __unused, const XML_Char *tag_name) 2285bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{ 22998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (strcmp(tag_name, "acdb_ids") == 0) { 23098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section = ROOT; 23198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else if (strcmp(tag_name, "pcm_ids") == 0) { 23298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section = ROOT; 23398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } else if (strcmp(tag_name, "backend_names") == 0) { 23498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section = ROOT; 23598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 2365bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George} 2375bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2385bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgeint platform_info_init(void) 2395bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{ 2405bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George XML_Parser parser; 2415bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George FILE *file; 2425bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George int ret = 0; 2435bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George int bytes_read; 2445bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George void *buf; 2455bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George static const uint32_t kBufSize = 1024; 2465bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 24798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George section = ROOT; 24898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 2495bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George file = fopen(PLATFORM_INFO_XML_PATH, "r"); 2505bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (!file) { 2515bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGD("%s: Failed to open %s, using defaults.", 2525bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George __func__, PLATFORM_INFO_XML_PATH); 2535bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = -ENODEV; 2545bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 2555bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 2565bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2575bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George parser = XML_ParserCreate(NULL); 2585bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (!parser) { 2595bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: Failed to create XML parser!", __func__); 2605bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = -ENODEV; 2615bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto err_close_file; 2625bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 2635bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2645bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George XML_SetElementHandler(parser, start_tag, end_tag); 2655bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2665bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George while (1) { 2675bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George buf = XML_GetBuffer(parser, kBufSize); 2685bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (buf == NULL) { 2695bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: XML_GetBuffer failed", __func__); 2705bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = -ENOMEM; 2715bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto err_free_parser; 2725bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 2735bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2745bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George bytes_read = fread(buf, 1, kBufSize, file); 2755bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (bytes_read < 0) { 2765bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: fread failed, bytes read = %d", __func__, bytes_read); 2775bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = bytes_read; 2785bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto err_free_parser; 2795bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 2805bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2815bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (XML_ParseBuffer(parser, bytes_read, 2825bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George bytes_read == 0) == XML_STATUS_ERROR) { 2835bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: XML_ParseBuffer failed, for %s", 2845bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George __func__, PLATFORM_INFO_XML_PATH); 2855bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = -EINVAL; 2865bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto err_free_parser; 2875bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 2885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2895bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if (bytes_read == 0) 2905bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George break; 2915bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 2925bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 2935bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgeerr_free_parser: 2945bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George XML_ParserFree(parser); 2955bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgeerr_close_file: 2965bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George fclose(file); 2975bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone: 2985bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George return ret; 2995bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George} 300