adv_error advance_ui_init(struct advance_ui_context* context, adv_conf* cfg_context) { context->state.ui_extra_flag = 0; context->state.ui_message_flag = 0; context->state.ui_help_flag = 0; context->state.ui_menu_map = 0; context->state.ui_osd_flag = 0; context->state.ui_scroll_flag = 0; context->state.ui_scroll_begin = 0; context->state.ui_scroll_end = 0; context->state.ui_direct_text_flag = 0; context->state.ui_direct_slow_flag = 0; context->state.ui_direct_fast_flag = 0; context->state.ui_font = 0; context->state.ui_font_oriented = 0; context->state.buffer_def = color_def_make_rgb_from_sizelenpos(4, 8, 16, 8, 8, 8, 0); /* BGRA */ context->state.color_map.def = 0; /* invalidate the color map */ conf_bool_register_default(cfg_context, "debug_speedmark", 0); conf_string_register_multi(cfg_context, "ui_helptag"); conf_string_register_default(cfg_context, "ui_helpimage", "auto"); conf_string_register_default(cfg_context, "ui_font", "auto"); conf_string_register_default(cfg_context, "ui_fontsize", "auto"); conf_string_register_default(cfg_context, "ui_color[interface]", "000000 ffffff"); conf_string_register_default(cfg_context, "ui_color[tag]", "247ef0 ffffff"); conf_string_register_default(cfg_context, "ui_color[select]", "000000 afffff"); conf_string_register_default(cfg_context, "ui_color[help_p1]", "000000 ffff00"); conf_string_register_default(cfg_context, "ui_color[help_p2]", "000000 00ff00"); conf_string_register_default(cfg_context, "ui_color[help_p3]", "000000 ff0000"); conf_string_register_default(cfg_context, "ui_color[help_p4]", "000000 00ffff"); conf_string_register_default(cfg_context, "ui_color[help_other]", "000000 808080"); conf_float_register_limit_default(cfg_context, "ui_translucency", 0, 1, 0.80); return 0; }
int os_main(int argc, char* argv[]) { int keyboard_id; adv_conf* context; const char* s; char* section_map[1]; const char** file_map; unsigned file_mac; int i; double latency_time; double buffer_time; double volume; unsigned rate; int attenuation; adv_bool opt_log; adv_bool opt_logsync; opt_log = 0; opt_logsync = 0; file_map = 0; file_mac = 0; context = conf_init(); if (os_init(context) != 0) goto err_conf; mixer_reg(context); conf_int_register_limit_default(context, "sound_volume", -32, 0, 0); conf_int_register_limit_default(context, "sound_samplerate", 5000, 96000, 44100); conf_float_register_limit_default(context, "sound_latency", 0.01, 2.0, 0.1); conf_float_register_limit_default(context, "sound_buffer", 0.05, 2.0, 0.1); if (conf_input_args_load(context, 0, "", &argc, argv, error_callback, 0) != 0) goto err_os; file_map = malloc(argc * sizeof(const char*)); for(i=1;i<argc;++i) { if (target_option_compare(argv[i], "log")) { opt_log = 1; } else if (target_option_compare(argv[i], "logsync")) { opt_logsync = 1; } else if (target_option_extract(argv[i]) == 0) { file_map[file_mac++] = argv[i]; } else { target_err("Unknown command line option '%s'.\n", argv[i]); goto err_os; } } if (argc <= 1 || file_mac == 0) { target_err("Syntax: advs FILES...\n"); goto err_os; } if (opt_log || opt_logsync) { const char* log = "advs.log"; remove(log); log_init(log, opt_logsync); } section_map[0] = ""; conf_section_set(context, section_map, 1); if (mixer_load(context) != 0) { goto err_os; } attenuation = conf_int_get_default(context, "sound_volume"); latency_time = conf_float_get_default(context, "sound_latency"); buffer_time = conf_float_get_default(context, "sound_buffer"); rate = conf_int_get_default(context, "sound_samplerate"); volume = 1.0; while (attenuation++ < 0) volume /= 1.122018454; /* = (10 ^ (1/20)) = 1dB */ if (os_inner_init("AdvanceSOUND") != 0) goto err_os; if (file_mac > MIXER_CHANNEL_MAX) { target_err("Too many files\n"); goto err_os_inner; } if (mixer_init(rate, file_mac, 1, buffer_time + latency_time, latency_time) != 0) { target_err("%s\n", error_get()); goto err_os_inner; } mixer_volume(volume); for(i=0;i<file_mac;++i) run(i, file_map[i]); free(file_map); signal(SIGINT, sigint); while (!done) { for(i=0;i<file_mac;++i) if (mixer_is_playing(i)) break; if (i==file_mac) break; mixer_poll(); target_idle(); } log_std(("s: shutdown\n")); mixer_done(); os_inner_done(); log_std(("s: the end\n")); if (opt_log || opt_logsync) { log_done(); } os_done(); conf_done(context); return EXIT_SUCCESS; err_os_inner: os_inner_done(); log_done(); err_os: os_done(); err_conf: conf_done(context); err: return EXIT_FAILURE; }