struct audio_route *audio_route_init(void) { struct config_parse_state state; XML_Parser parser; FILE *file; int bytes_read; void *buf; int i; struct mixer_path *path; struct audio_route *ar; ar = calloc(1, sizeof(struct audio_route)); if (!ar) goto err_calloc; ar->mixer = mixer_open(MIXER_CARD); if (!ar->mixer) { ALOGE("Unable to open the mixer, aborting."); goto err_mixer_open; } ar->mixer_path = NULL; ar->mixer_path_size = 0; ar->num_mixer_paths = 0; /* allocate space for and read current mixer settings */ if (alloc_mixer_state(ar) < 0) goto err_mixer_state; file = fopen(MIXER_XML_PATH, "r"); if (!file) { ALOGE("Failed to open %s", MIXER_XML_PATH); goto err_fopen; } parser = XML_ParserCreate(NULL); if (!parser) { ALOGE("Failed to create XML parser"); goto err_parser_create; } memset(&state, 0, sizeof(state)); state.ar = ar; XML_SetUserData(parser, &state); XML_SetElementHandler(parser, start_tag, end_tag); for (;;) { buf = XML_GetBuffer(parser, BUF_SIZE); if (buf == NULL) goto err_parse; bytes_read = fread(buf, 1, BUF_SIZE, file); if (bytes_read < 0) goto err_parse; if (XML_ParseBuffer(parser, bytes_read, bytes_read == 0) == XML_STATUS_ERROR) { ALOGE("Error in mixer xml (%s)", MIXER_XML_PATH); goto err_parse; } if (bytes_read == 0) break; } audio_route_apply_path(ar, "init"); /* apply the initial mixer values, and save them so we can reset the mixer to the original values */ update_mixer_state(ar); save_mixer_state(ar); XML_ParserFree(parser); fclose(file); return ar; err_parse: XML_ParserFree(parser); err_parser_create: fclose(file); err_fopen: free_mixer_state(ar); err_mixer_state: mixer_close(ar->mixer); err_mixer_open: free(ar); ar = NULL; err_calloc: return NULL; }
struct audio_route *audio_route_init(unsigned int card_slot) { struct config_parse_state state; XML_Parser parser; FILE *file; int bytes_read; void *buf; int fd, cnt; struct mixer_path *path; struct audio_route *ar; char vendor_xml_path[PATH_MAX]; char codec_vendor_name[PATH_MAX]; char vendor_name[255]; char *tmpchar; ar = calloc(1, sizeof(struct audio_route)); if (!ar) goto err_calloc; ar->mixer = mixer_open(card_slot); if (!ar->mixer) { ALOGE("Unable to open the mixer, aborting."); goto err_mixer_open; } ALOGV("Mixer open successful."); ar->mixer_path = NULL; ar->mixer_path_size = 0; ar->num_mixer_paths = 0; /* allocate space for and read current mixer settings */ if (alloc_mixer_state(ar) < 0) goto err_mixer_state; snprintf(codec_vendor_name, sizeof(codec_vendor_name), CODEC_CHIP_NAME_PATH, card_slot); fd = open(codec_vendor_name, O_RDONLY); if (fd == -1) { ALOGE("Failed to open %s", codec_vendor_name); /* If no codec name file, then use unknown. */ strcpy(vendor_name, CODEC_CHIP_NAME_UNKNOWN); } else { cnt = read(fd, vendor_name, 255); if (cnt <= 0) { ALOGE("Failed to read vendor name:%s.", vendor_name); /* If no codec name file, then use unknown. */ strcpy(vendor_name, CODEC_CHIP_NAME_UNKNOWN); } else { vendor_name[cnt-1] = '\0'; } close(fd); } /* Replace spaces with underscore in vendor name */ tmpchar = vendor_name; while (*tmpchar) { if (*tmpchar == ' ') *tmpchar = '_'; tmpchar++; } sprintf(vendor_xml_path, MIXER_XML_PATH, vendor_name); ALOGV("Opening up %s.", vendor_xml_path); file = fopen(vendor_xml_path, "r"); if (!file) { ALOGE("Failed to open %s", vendor_xml_path); goto err_fopen; } parser = XML_ParserCreate(NULL); if (!parser) { ALOGE("Failed to create XML parser"); goto err_parser_create; } memset(&state, 0, sizeof(state)); state.ar = ar; XML_SetUserData(parser, &state); XML_SetElementHandler(parser, start_tag, end_tag); for (;;) { buf = XML_GetBuffer(parser, BUF_SIZE); if (buf == NULL) goto err_parse; bytes_read = fread(buf, 1, BUF_SIZE, file); if (ferror(file)) goto err_parse; if (XML_ParseBuffer(parser, bytes_read, bytes_read == 0) == XML_STATUS_ERROR) { ALOGE("Error in mixer xml (%s)", MIXER_XML_PATH); goto err_parse; } if (bytes_read == 0) break; } /* apply the initial mixer values, and save them so we can reset the mixer to the original values */ update_mixer_state(ar); save_mixer_state(ar); XML_ParserFree(parser); fclose(file); return ar; err_parse: XML_ParserFree(parser); err_parser_create: fclose(file); err_fopen: free_mixer_state(ar); err_mixer_state: mixer_close(ar->mixer); err_mixer_open: free(ar); ar = NULL; err_calloc: return NULL; }