1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
6 * settings.c is free software.
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
17 #include <glib/gstdio.h>
21 #include "hb-backend.h"
23 void dump_settings(GHashTable *settings);
24 void ghb_pref_audio_init(signal_user_data_t *ud);
27 debug_get_object(GtkBuilder* b, const gchar *n)
29 g_message("name %s\n", n);
30 return gtk_builder_get_object(b, n);
33 static gchar *true_strings[] =
42 string_is_true(const gchar *str)
44 gint count = sizeof(true_strings) / sizeof(gchar*);
47 for (ii = 0; ii < count; ii++)
49 if (strcmp(str, true_strings[ii]) == 0)
58 delete_key(gpointer str)
60 g_debug("delete_key (%s)\n", (gchar*)str);
65 delete_value(gpointer val)
67 g_debug("delete_value (%s)\n", ((setting_value_t*)val)->svalue);
68 g_free(((setting_value_t*)val)->svalue);
69 g_free(((setting_value_t*)val)->option);
70 g_free(((setting_value_t*)val)->shortOpt);
75 ghb_free_setting_value(setting_value_t *val)
77 delete_value((gpointer)val);
85 g_debug("ghb_settings_new ()\n");
86 settings = g_hash_table_new_full(g_str_hash, g_str_equal,
87 delete_key, delete_value);
92 settings_set(GHashTable *settings, const gchar *key,
93 const gchar *str, gint val, gdouble dbl)
95 g_debug("ghb_setting_set () key (%s), svalue (%s), ivalue %d, dvalue %.2g\n", key, str, val, dbl);
96 setting_value_t *value = g_malloc(sizeof(setting_value_t));
98 value->svalue = g_strdup(str);
100 value->svalue = g_strdup("");
101 value->option = g_strdup(value->svalue);
102 value->shortOpt = g_strdup(value->svalue);
106 g_hash_table_insert(settings, g_strdup(key), value);
109 static setting_value_t*
110 copy_settings_value(const setting_value_t *value)
112 setting_value_t *copy = g_malloc(sizeof(setting_value_t));
113 copy->index = value->index;
114 copy->ivalue = value->ivalue;
115 copy->dvalue = value->dvalue;
116 copy->svalue = g_strdup(value->svalue);
117 copy->option = g_strdup(value->option);
118 copy->shortOpt = g_strdup(value->shortOpt);
123 ghb_settings_set(GHashTable *settings, const gchar *key, setting_value_t *value)
125 g_debug("ghb_settings_set () key (%s)\n", key);
126 if ((key == NULL) || (value == NULL))
128 g_debug("Bad key or value\n");
131 g_debug("\tkey (%s) -- value (%s)\n", key, value->svalue);
132 g_hash_table_insert(settings, g_strdup(key), value);
136 ghb_settings_set_string(GHashTable *settings, const gchar *key, const gchar *str)
141 if (str == NULL) str = "";
142 dvalue = g_strtod (str, &end);
143 if ((end == str) && string_is_true (str))
147 settings_set(settings, key, str, dvalue, dvalue);
151 ghb_settings_set_dbl(GHashTable *settings, const gchar *key, gdouble dvalue)
153 setting_value_t *value;
155 value = g_malloc(sizeof(setting_value_t));
157 value->dvalue = dvalue;
158 value->option = g_strdup_printf("%.8g", dvalue);
159 value->shortOpt = g_strdup(value->option);
160 value->svalue = g_strdup(value->option);
161 value->ivalue = dvalue;
162 ghb_settings_set( settings, key, value);
166 ghb_settings_copy(GHashTable *settings, const gchar *key, const setting_value_t *value)
168 setting_value_t *copy = copy_settings_value(value);
169 g_hash_table_insert(settings, g_strdup(key), copy);
172 const setting_value_t*
173 ghb_settings_get(GHashTable *settings, const gchar *key)
175 const setting_value_t* value;
176 g_debug("ghb_settings_get () key (%s)\n", key);
177 value = g_hash_table_lookup(settings, key);
182 ghb_settings_get_bool(GHashTable *settings, const gchar *key)
184 const setting_value_t* value;
185 g_debug("ghb_settings_get_bool () key (%s)\n", key);
186 value = ghb_settings_get(settings, key);
189 g_debug("\tNo value found\n");
192 g_debug("\tvalue is %d\n", value->ivalue);
193 return value->ivalue;
197 ghb_settings_get_int(GHashTable *settings, const gchar *key)
199 const setting_value_t* value;
200 g_debug("ghb_settings_get_int () key (%s)\n", key);
201 value = ghb_settings_get(settings, key);
202 if (value == NULL) return 0;
203 return value->ivalue;
207 ghb_settings_get_index(GHashTable *settings, const gchar *key)
209 const setting_value_t* value;
210 g_debug("ghb_settings_get_index () key (%s)\n", key);
211 value = ghb_settings_get(settings, key);
212 if (value == NULL) return 0;
217 ghb_settings_get_dbl(GHashTable *settings, const gchar *key)
219 const setting_value_t* value;
220 g_debug("ghb_settings_get_dbl () key (%s)\n", key);
221 value = ghb_settings_get(settings, key);
222 if (value == NULL) return 0.0;
223 return value->dvalue;
227 ghb_settings_get_string(GHashTable *settings, const gchar *key)
229 const setting_value_t* value;
230 g_debug("ghb_settings_get_string () key (%s)\n", key);
231 value = ghb_settings_get(settings, key);
232 if (value == NULL) return "";
233 return value->svalue;
238 ghb_settings_get_option(GHashTable *settings, const gchar *key)
240 const setting_value_t* value;
241 g_debug("ghb_settings_get_option () key (%s)\n", key);
242 value = ghb_settings_get(settings, key);
243 if (value == NULL) return "";
244 g_debug("option: (%s)\n", value->option);
245 return value->option;
249 ghb_settings_get_short_opt(GHashTable *settings, const gchar *key)
251 const setting_value_t* value;
252 g_debug("ghb_settings_get_short_opt () key (%s)\n", key);
253 value = ghb_settings_get(settings, key);
254 if (value == NULL) return "";
255 g_debug("shrot option: (%s)\n", value->shortOpt);
256 return value->shortOpt;
260 copy_key_val(gpointer key, gpointer val, gpointer settings)
262 g_hash_table_insert((GHashTable*)settings,
263 g_strdup((gchar*)key),
264 copy_settings_value((setting_value_t*)val));
268 ghb_settings_dup(GHashTable *settings)
270 GHashTable *dup_settings;
272 if (settings == NULL) return NULL;
273 dup_settings = ghb_settings_new();
274 g_hash_table_foreach (settings, copy_key_val, dup_settings);
278 // Map widget names to setting keys
279 // Widgets that map to settings have names
280 // of this format: s_<setting key>
282 get_setting_key(GtkWidget *widget)
286 g_debug("get_setting_key ()\n");
287 if (widget == NULL) return NULL;
288 if (GTK_IS_ACTION(widget))
289 name = gtk_action_get_name(GTK_ACTION(widget));
291 name = gtk_widget_get_name(widget);
295 // Bad widget pointer? Should never happen.
296 g_debug("Bad widget\n");
303 ghb_widget_value(GtkWidget *widget)
305 setting_value_t *value;
311 g_debug("NULL widget\n");
314 value = g_malloc(sizeof(setting_value_t));
316 type = GTK_WIDGET_TYPE(widget);
317 if (GTK_IS_ACTION(widget))
318 name = gtk_action_get_name(GTK_ACTION(widget));
320 name = gtk_widget_get_name(widget);
321 g_debug("ghb_widget_value widget (%s)\n", name);
322 if (type == GTK_TYPE_ENTRY)
324 const gchar *str = gtk_entry_get_text((GtkEntry*)widget);
325 value->option = g_strdup(str);
326 value->shortOpt = g_strdup(str);
327 value->svalue = g_strdup(str);
328 value->dvalue = g_strtod(str, NULL);
329 value->ivalue = value->dvalue;
332 else if (type == GTK_TYPE_RADIO_BUTTON)
334 g_debug("\tradio_button");
336 if (gtk_toggle_button_get_active((GtkToggleButton*)widget))
339 value->option = g_strdup("enable");
340 value->shortOpt = g_strdup("enable");
341 value->svalue = g_strdup("1");
347 g_debug("\tdisable");
348 value->option = g_strdup("disable");
349 value->shortOpt = g_strdup("disable");
350 value->svalue = g_strdup("0");
355 else if (type == GTK_TYPE_CHECK_BUTTON)
357 g_debug("\tcheck_button");
359 if (gtk_toggle_button_get_active((GtkToggleButton*)widget))
362 value->option = g_strdup("enable");
363 value->shortOpt = g_strdup("enable");
364 value->svalue = g_strdup("1");
370 g_debug("\tdisable");
371 value->option = g_strdup("disable");
372 value->shortOpt = g_strdup("disable");
373 value->svalue = g_strdup("0");
378 else if (type == GTK_TYPE_TOGGLE_ACTION)
380 g_debug("\ttoggle action");
382 if (gtk_toggle_action_get_active((GtkToggleAction*)widget))
385 value->option = g_strdup("enable");
386 value->shortOpt = g_strdup("enable");
387 value->svalue = g_strdup("1");
393 g_debug("\tdisable");
394 value->option = g_strdup("disable");
395 value->shortOpt = g_strdup("disable");
396 value->svalue = g_strdup("0");
401 else if (type == GTK_TYPE_CHECK_MENU_ITEM)
403 g_debug("\tcheck_menu_item");
405 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
408 value->option = g_strdup("enable");
409 value->shortOpt = g_strdup("enable");
410 value->svalue = g_strdup("1");
416 g_debug("\tdisable");
417 value->option = g_strdup("disable");
418 value->shortOpt = g_strdup("disable");
419 value->svalue = g_strdup("0");
424 else if (type == GTK_TYPE_COMBO_BOX)
428 gchar *shortOpt, *option, *svalue;
430 gint index = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
432 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
433 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
435 gtk_tree_model_get(store, &iter, 0, &option, 2, &shortOpt,
436 3, &ivalue, 4, &svalue, -1);
438 g_debug("\tcombo: index %d opt (%s) Short Opt (%s) value %d\n", index, option, shortOpt, ivalue);
439 value->option = option;
440 value->shortOpt = shortOpt;
441 value->svalue = svalue;
442 value->index = index;
443 value->ivalue = ivalue;
444 value->dvalue = ivalue;
448 value->option = g_strdup("");
449 value->shortOpt = g_strdup("");
450 value->svalue = g_strdup("");
456 else if (type == GTK_TYPE_SPIN_BUTTON)
459 value->dvalue = gtk_spin_button_get_value_as_int((GtkSpinButton*)widget);
460 value->option = g_strdup_printf("%.8g", value->dvalue);
461 value->shortOpt = g_strdup_printf("%.8g", value->dvalue);
462 value->svalue = g_strdup_printf("%.8g", value->dvalue);
463 value->ivalue = value->dvalue;
465 else if (type == GTK_TYPE_HSCALE)
468 value->dvalue = gtk_range_get_value((GtkRange*)widget);
469 value->option = g_strdup_printf("%.8g", value->dvalue);
470 value->shortOpt = g_strdup_printf("%.8g", value->dvalue);
471 value->svalue = g_strdup_printf("%.8g", value->dvalue);
472 value->ivalue = value->dvalue;
474 else if (type == GTK_TYPE_TEXT_VIEW)
476 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
477 GtkTextIter start, end;
478 gtk_text_buffer_get_bounds(buffer, &start, &end);
479 value->svalue = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
480 value->option = g_strdup(value->svalue);
481 value->shortOpt = g_strdup(value->svalue);
486 else if (type == GTK_TYPE_LABEL)
489 value->svalue = g_strdup(gtk_label_get_text (GTK_LABEL(widget)));
490 value->dvalue = g_strtod(value->svalue, NULL);
491 value->option = g_strdup(value->svalue);
492 value->shortOpt = g_strdup(value->svalue);
493 value->ivalue = value->dvalue;
494 g_debug("label (%s)\n", value->shortOpt);
498 g_debug("Attempt to set unknown widget type: %s\n", name);
506 ghb_widget_option(GtkWidget *widget)
508 setting_value_t *value;
511 g_debug("ghb_widget_option ()\n");
512 value = ghb_widget_value(widget);
515 str = g_strdup(value->option);
516 ghb_free_setting_value (value);
522 ghb_widget_short_opt(GtkWidget *widget)
524 setting_value_t *value;
527 g_debug("ghb_widget_short_opt ()\n");
528 value = ghb_widget_value(widget);
531 str = g_strdup(value->shortOpt);
532 ghb_free_setting_value (value);
538 ghb_widget_string(GtkWidget *widget)
540 setting_value_t *value;
543 g_debug("ghb_widget_string ()\n");
544 value = ghb_widget_value(widget);
547 g_debug("str (%s)\n", value->svalue);
548 str = g_strdup(value->svalue);
549 ghb_free_setting_value (value);
555 ghb_widget_dbl(GtkWidget *widget)
557 setting_value_t *value;
560 g_debug("ghb_widget_dbl ()\n");
561 value = ghb_widget_value(widget);
565 ghb_free_setting_value (value);
571 ghb_widget_int(GtkWidget *widget)
573 setting_value_t *value;
576 g_debug("ghb_widget_int ()\n");
577 value = ghb_widget_value(widget);
580 ivalue = value->ivalue;
581 ghb_free_setting_value (value);
587 ghb_widget_index(GtkWidget *widget)
589 setting_value_t *value;
592 g_debug("ghb_widget_index ()\n");
593 value = ghb_widget_value(widget);
596 index = value->index;
597 ghb_free_setting_value (value);
603 ghb_widget_to_setting(GHashTable *settings, GtkWidget *widget)
605 const gchar *key = NULL;
606 setting_value_t *value;
608 g_debug("ghb_widget_to_setting ()\n");
609 if (widget == NULL) return;
610 // Find corresponding setting
611 key = get_setting_key(widget);
612 if (key == NULL) return;
613 value = ghb_widget_value(widget);
616 ghb_settings_set (settings, key, value);
620 g_debug("No value found for %s\n", key);
622 //dump_settings(settings);
626 update_widget(GtkWidget *widget, const gchar *parm_svalue, gint parm_ivalue)
631 g_debug("update_widget");
632 // make a dup of setting value because the setting hash gets
633 // modified and thus the value pointer can become invalid.
634 if (parm_svalue == NULL)
636 value = g_strdup_printf ("%d", parm_ivalue);
640 value = g_strdup(parm_svalue);
642 g_debug("update widget value (%s)", value);
643 type = GTK_OBJECT_TYPE(widget);
644 if (type == GTK_TYPE_ENTRY)
647 gtk_entry_set_text((GtkEntry*)widget, value);
649 else if (type == GTK_TYPE_RADIO_BUTTON)
651 g_debug("radio button");
652 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), string_is_true(value));
654 else if (type == GTK_TYPE_CHECK_BUTTON)
656 g_debug("check button");
657 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), string_is_true(value));
659 else if (type == GTK_TYPE_TOGGLE_ACTION)
661 g_debug("toggle action");
662 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(widget), string_is_true(value));
664 else if (type == GTK_TYPE_CHECK_MENU_ITEM)
666 g_debug("check menu item");
667 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), string_is_true(value));
669 else if (type == GTK_TYPE_COMBO_BOX)
675 gboolean foundit = FALSE;
678 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
679 if (gtk_tree_model_get_iter_first (store, &iter))
683 gtk_tree_model_get(store, &iter, 2, &shortOpt, 3, &ivalue, -1);
684 if (parm_svalue == NULL && ivalue == parm_ivalue)
686 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
691 else if (strcmp(shortOpt, value) == 0)
693 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
699 } while (gtk_tree_model_iter_next (store, &iter));
703 gtk_combo_box_set_active (GTK_COMBO_BOX(widget), 0);
706 else if (type == GTK_TYPE_SPIN_BUTTON)
710 g_debug("spin (%s)", value);
711 val = g_strtod(value, NULL);
712 gtk_spin_button_set_value((GtkSpinButton*)widget, val);
714 else if (type == GTK_TYPE_HSCALE)
719 val = g_strtod(value, NULL);
720 gtk_range_set_value((GtkRange*)widget, val);
722 else if (type == GTK_TYPE_TEXT_VIEW)
724 g_debug("textview (%s)", value);
725 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
726 gtk_text_buffer_set_text (buffer, value, -1);
730 g_debug("Attempt to set unknown widget type");
736 ghb_ui_update(signal_user_data_t *ud, const gchar *name, const gchar *value)
740 g_debug("ghb_ui_update ()\n");
741 object = GHB_OBJECT(ud->builder, name);
744 g_debug("Failed to find widget for key: %s\n", name);
747 update_widget((GtkWidget*)object, value, 0);
748 // Its possible the value hasn't changed. Since settings are only
749 // updated when the value changes, I'm initializing settings here as well.
750 ghb_widget_to_setting(ud->settings, (GtkWidget*)object);
755 ghb_ui_update_int(signal_user_data_t *ud, const gchar *name, gint ivalue)
759 g_debug("ghb_ui_update_int ()\n");
760 object = GHB_OBJECT(ud->builder, name);
763 g_debug("Failed to find widget for key: %s\n", name);
766 update_widget((GtkWidget*)object, NULL, ivalue);
767 // Its possible the value hasn't changed. Since settings are only
768 // updated when the value changes, I'm initializing settings here as well.
769 ghb_widget_to_setting(ud->settings, (GtkWidget*)object);
774 show_setting(gpointer key, gpointer value, gpointer user_data)
776 printf("key (%s) -- value (%s)\n", (gchar*)key, (gchar*)value);
780 dump_settings(GHashTable *settings)
782 printf("------------------------------------\n");
783 g_hash_table_foreach(settings, show_setting, NULL);
786 // This is a bit hackish, but effective
787 const gchar defaultSettings[] =
788 #include "internal_defaults.h"
800 static GKeyFile *standardKeyFile;
801 static GKeyFile *customKeyFile;
802 static GKeyFile *internalKeyFile;
803 static GKeyFile *prefsKeyFile;
804 static GList *presetsList;
807 search_group(const gchar *name, gchar **groups)
811 //g_debug("search_group\n");
812 if (groups == NULL) return -1;
813 for (ii = 0; groups[ii] != NULL; ii++)
815 //g_debug("%s cmp %s\n", name, groups[ii]);
816 if (strcmp(name, groups[ii]) == 0)
825 presets_list_search(GList *list, const gchar *name)
830 presets_data_t *data;
831 data = (presets_data_t*)link->data;
832 g_debug("search -- %s\n", data->name);
833 if (strcmp(name, data->name) == 0)
837 link = g_list_next(link);
843 ghb_set_preset_default(GHashTable *settings)
846 presets_data_t *data;
848 preset = ghb_settings_get_string (settings, "default_preset");
849 data = presets_list_search(presetsList, preset);
852 data->defalt = FALSE;
854 preset = ghb_settings_get_string (settings, "preset");
855 data = presets_list_search(presetsList, preset);
860 ghb_settings_set_string(settings, "default_preset", preset);
861 ghb_prefs_save(settings);
865 ghb_presets_list_index(const gchar *name)
867 GList *link = presetsList;
871 presets_data_t *data;
872 data = (presets_data_t*)link->data;
873 if (strcmp(name, data->name) == 0)
877 link = g_list_next(link);
884 ghb_preset_flags(const gchar *name, gint *index)
886 GList *link = presetsList;
890 presets_data_t *data;
891 data = (presets_data_t*)link->data;
892 if (strcmp(name, data->name) == 0)
897 ret = (data->custom ? PRESET_CUSTOM : 0);
898 ret |= (data->defalt ? PRESET_DEFAULT : 0);
901 link = g_list_next(link);
909 ghb_presets_get_names()
912 GList *link = presetsList;
915 g_debug("ghb_presets_get_names()\n");
916 result = g_malloc((g_list_length(presetsList)+1) * sizeof(gchar*));
919 presets_data_t *data;
920 data = (presets_data_t*)link->data;
921 result[ii++] = g_strdup(data->name);
922 link = g_list_next(link);
929 ghb_presets_get_descriptions()
932 GList *link = presetsList;
935 g_debug("ghb_presets_get_names()\n");
936 result = g_malloc((g_list_length(presetsList)+1) * sizeof(gchar*));
939 presets_data_t *data;
940 data = (presets_data_t*)link->data;
941 result[ii++] = g_strdup(data->description);
942 link = g_list_next(link);
949 ghb_presets_get_name(gint index)
951 gchar *result = NULL;
952 GList *link = presetsList;
955 g_debug("ghb_presets_get_name()\n");
956 while ((link != NULL) && (ii < index))
958 link = g_list_next(link);
963 presets_data_t *data;
964 data = (presets_data_t*)link->data;
971 init_presets_hash_from_key_file(signal_user_data_t *ud, const gchar *name, GKeyFile *keyFile)
977 // Get key list from internal default presets. This way we do not
978 // load any unknown keys.
979 keys = g_key_file_get_keys(internalKeyFile, "Presets", &length, NULL);
983 for (ii = 0; keys[ii] != NULL; ii++)
985 g_debug("key (%s)\n", keys[ii]);
987 if (name != NULL && keyFile != NULL)
989 str = g_key_file_get_string(keyFile, name, keys[ii], NULL);
990 g_debug("(%s, %s)\n", keys[ii], str);
994 str = g_key_file_get_string(internalKeyFile, "Presets", keys[ii], NULL);
998 g_debug("name (%s): key (%s) -- str (%s)\n", name, keys[ii], str);
999 ghb_settings_set_string(ud->settings, keys[ii], str);
1000 ghb_ui_update(ud, keys[ii], str);
1011 preset_to_ui(signal_user_data_t *ud, presets_data_t *data)
1013 g_debug("preset_to_settings()\n");
1014 // Initialize the ui from presets file.
1018 init_presets_hash_from_key_file(ud, NULL, NULL);
1023 g_debug("preset name (%s)\n", data->name);
1024 // Initialize from preset
1025 init_presets_hash_from_key_file(ud, data->name, data->keyFile);
1030 preset_update_ui(signal_user_data_t *ud, presets_data_t *data, const gchar *key)
1034 g_debug("preset_update_settings()\n");
1035 // Initialize the ui from presets file.
1036 if (data == NULL) return;
1037 str = g_key_file_get_string(data->keyFile, data->name, key, NULL);
1040 str = g_key_file_get_string(internalKeyFile, "Presets", key, NULL);
1044 ghb_ui_update(ud, key, str);
1050 ghb_set_preset(signal_user_data_t *ud, const gchar *name)
1052 presets_data_t *data;
1054 g_debug("ghb_set_preset() %s\n", name);
1057 name = ghb_presets_get_name(0);
1061 preset_to_ui(ud, NULL);
1065 data = presets_list_search(presetsList, name);
1066 preset_to_ui(ud, data);
1067 ghb_settings_set_string(ud->settings, "preset", name);
1069 ghb_pref_audio_init(ud);
1073 ghb_update_from_preset(
1074 signal_user_data_t *ud,
1078 presets_data_t *data;
1080 g_debug("ghb_update_from_preset() %s %s\n", name, key);
1081 if (name == NULL) return;
1082 data = presets_list_search(presetsList, name);
1083 preset_update_ui(ud, data, key);
1087 build_presets_list(GHashTable *settings)
1089 GList *link = presetsList;
1090 presets_data_t *data;
1091 gchar **custom, **standard;
1092 gsize clength, slength;
1095 g_debug("build_presets_list ()\n");
1096 // First clear out the old presets list
1097 while (link != NULL)
1099 data = (presets_data_t*)link->data;
1101 if (data->description != NULL)
1102 g_free(data->description);
1104 link = g_list_delete_link (link, link);
1108 // Now build up the new list
1109 const gchar *def_name = ghb_settings_get_string(settings, "default_preset");
1110 custom = g_key_file_get_groups(customKeyFile, &clength);
1111 standard = g_key_file_get_groups(standardKeyFile, &slength);
1112 if ((slength + clength) <= 0) return;
1114 for (ii = 0; ii < slength; ii++)
1116 if (search_group(standard[ii], custom) < 0)
1119 data = g_malloc(sizeof(presets_data_t));
1120 data->name = g_strdup(standard[ii]);
1121 data->keyFile = standardKeyFile;
1122 data->custom = FALSE;
1123 data->defalt = FALSE;
1124 if ((def_name != NULL) && (strcmp(def_name, data->name) == 0))
1126 data->defalt = TRUE;
1128 desc = g_key_file_get_string(standardKeyFile, standard[ii], "preset_description", NULL);
1129 data->description = desc;
1130 presetsList = g_list_append(presetsList, data);
1133 for (ii = 0; ii < clength; ii++)
1136 data = g_malloc(sizeof(presets_data_t));
1137 data->name = g_strdup(custom[ii]);
1138 data->keyFile = customKeyFile;
1139 data->custom = TRUE;
1140 data->defalt = FALSE;
1141 if ((def_name != NULL) && (strcmp(def_name, data->name) == 0))
1143 data->defalt = TRUE;
1145 desc = g_key_file_get_string(customKeyFile, custom[ii], "preset_description", NULL);
1146 data->description = desc;
1147 presetsList = g_list_append(presetsList, data);
1150 g_strfreev(standard);
1154 store_key_file(GKeyFile *key_file, const gchar *name)
1156 gchar *settingsString;
1162 g_debug("store_key_file ()\n");
1163 settingsString = g_key_file_to_data(key_file, &length, NULL);
1165 dir = g_get_user_config_dir();
1166 config = g_strdup_printf ("%s/ghb", dir);
1167 if (!g_file_test(config, G_FILE_TEST_IS_DIR))
1169 g_mkdir (config, 0755);
1172 config = g_strdup_printf ("%s/ghb/%s", dir, name);
1173 fd = g_open(config, O_RDWR|O_CREAT|O_TRUNC, 0777);
1174 write(fd, settingsString, length);
1176 g_debug("prefs:\n%s\n", settingsString);
1177 g_free(settingsString);
1181 ghb_prefs_to_ui(signal_user_data_t *ud)
1185 str = ghb_settings_get_string(ud->settings, "default_source");
1186 ghb_settings_set_string (ud->settings, "source", str);
1187 str = ghb_settings_get_string(ud->settings, "destination_dir");
1189 gchar *path = g_strdup_printf ("%s/new_video.mp4", str);
1190 ghb_ui_update(ud, "destination", path);
1194 static gboolean prefs_initializing = FALSE;
1197 ghb_prefs_save(GHashTable *settings)
1204 if (prefs_initializing) return;
1205 keys = g_key_file_get_keys(internalKeyFile, "Preferences", &length, NULL);
1208 for (ii = 0; keys[ii] != NULL; ii++)
1210 value = ghb_settings_get_string(settings, keys[ii]);
1213 g_key_file_set_value(prefsKeyFile, "Preferences", keys[ii], value);
1217 store_key_file(prefsKeyFile, "preferences");
1222 ghb_pref_save(GHashTable *settings, const gchar *key)
1226 if (prefs_initializing) return;
1227 value = ghb_settings_get_string(settings, key);
1230 g_key_file_set_value(prefsKeyFile, "Preferences", key, value);
1231 store_key_file(prefsKeyFile, "preferences");
1237 dump_key_file(GKeyFile *keyFile, const gchar *section)
1243 // Get defaults from internal defaults
1244 keys = g_key_file_get_keys(keyFile, section, &length, NULL);
1247 for (ii = 0; keys[ii] != NULL; ii++)
1251 str = g_key_file_get_string(keyFile, section, keys[ii], NULL);
1254 g_message("Preference: key (%s) -- str (%s)\n", keys[ii], str);
1259 g_message("Preference: key (%s) -- str **none**\n", keys[ii]);
1266 g_message("no keys");
1272 ghb_prefs_load(signal_user_data_t *ud)
1282 prefs_initializing = TRUE;
1283 internalKeyFile = g_key_file_new();
1284 res = g_key_file_load_from_data( internalKeyFile, defaultSettings,
1285 sizeof(defaultSettings), G_KEY_FILE_NONE, NULL);
1287 g_warning("Failed to initialize internal defaults\n");
1289 keys = g_key_file_get_keys(internalKeyFile, "Initialization", &length, NULL);
1293 for (ii = 0; keys[ii] != NULL; ii++)
1297 g_debug("key (%s)\n", keys[ii]);
1298 str = g_key_file_get_string(internalKeyFile, "Initialization", keys[ii], NULL);
1301 g_debug("Initialization: key (%s) -- str (%s)\n", keys[ii], str);
1302 ghb_settings_set_string(ud->settings, keys[ii], str);
1303 ghb_ui_update(ud, keys[ii], str);
1309 prefsKeyFile = g_key_file_new();
1310 dir = g_get_user_config_dir();
1311 config = g_strdup_printf ("%s/ghb/preferences", dir);
1312 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1314 g_key_file_load_from_file( prefsKeyFile, config, G_KEY_FILE_KEEP_COMMENTS, NULL);
1316 value = g_key_file_get_value(prefsKeyFile, "Preferences", "version", NULL);
1321 // Get defaults from internal defaults
1322 keys = g_key_file_get_keys(internalKeyFile, "Preferences", &length, NULL);
1325 for (ii = 0; keys[ii] != NULL; ii++)
1329 str = g_key_file_get_string(internalKeyFile, "Preferences", keys[ii], NULL);
1332 g_debug("Preference: key (%s) -- str (%s)\n", keys[ii], str);
1333 g_key_file_set_value(prefsKeyFile, "Preferences", keys[ii], str);
1339 const gchar *dir = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS);
1340 g_key_file_set_value(prefsKeyFile, "Preferences", "destination_dir", dir);
1341 store_key_file(prefsKeyFile, "preferences");
1344 keys = g_key_file_get_keys(internalKeyFile, "Preferences", &length, NULL);
1347 for (ii = 0; keys[ii] != NULL; ii++)
1349 value = g_key_file_get_value(prefsKeyFile, "Preferences", keys[ii], NULL);
1352 ghb_settings_set_string(ud->settings, keys[ii], value);
1353 ghb_ui_update(ud, keys[ii], value);
1358 value = g_key_file_get_value(internalKeyFile, "Preferences", keys[ii], NULL);
1361 ghb_settings_set_string(ud->settings, keys[ii], value);
1362 ghb_ui_update(ud, keys[ii], value);
1369 gint bval = ghb_settings_get_int(ud->settings, "show_presets");
1370 ghb_ui_update_int(ud, "show_presets", bval);
1371 if (ghb_settings_get_bool(ud->settings, "hbfd_feature"))
1374 bval = ghb_settings_get_int(ud->settings, "hbfd");
1375 ghb_ui_update_int(ud, "hbfd", bval);
1376 action = GHB_ACTION (ud->builder, "hbfd");
1377 gtk_action_set_visible(action, TRUE);
1381 ghb_ui_update_int(ud, "hbfd", 0);
1383 prefs_initializing = FALSE;
1387 ghb_presets_load(signal_user_data_t *ud)
1391 GHashTable *settings = ud->settings;
1393 g_debug("ghb_presets_load()\n");
1394 customKeyFile = g_key_file_new();
1395 standardKeyFile = g_key_file_new();
1396 dir = g_get_user_config_dir();
1397 config = g_strdup_printf ("%s/ghb/custom_presets", dir);
1398 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1400 g_key_file_load_from_file( customKeyFile, config,
1401 G_KEY_FILE_KEEP_COMMENTS, NULL);
1404 // Try current dir first. Makes testing prior to installation easier
1405 if (g_file_test("./standard_presets", G_FILE_TEST_IS_REGULAR))
1407 g_key_file_load_from_file( standardKeyFile, "./standard_presets",
1408 G_KEY_FILE_KEEP_COMMENTS, NULL);
1412 // Try users config dir
1413 config = g_strdup_printf ("%s/ghb/standard_presets", dir);
1414 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1416 g_key_file_load_from_file( standardKeyFile, config,
1417 G_KEY_FILE_KEEP_COMMENTS, NULL);
1422 const gchar* const *dirs;
1425 dirs = g_get_system_data_dirs();
1428 for (ii = 0; dirs[ii] != NULL; ii++)
1430 config = g_strdup_printf("%s/ghb/standard_presets", dirs[ii]);
1431 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1433 g_key_file_load_from_file( standardKeyFile, config,
1434 G_KEY_FILE_KEEP_COMMENTS, NULL);
1442 build_presets_list(settings);
1448 g_debug("presets_store ()\n");
1449 store_key_file(customKeyFile, "custom_presets");
1460 store_to_key_file(gpointer xkey, gpointer xvalue, gpointer xski)
1462 store_key_info_t *ski = (store_key_info_t*)xski;
1463 setting_value_t *value = (setting_value_t *)xvalue;
1464 gchar *key = (gchar*)xkey;
1467 if (!ski->autoscale)
1469 if (strcmp(key, "scale_width"))
1473 if (strcmp(key, "scale_height"))
1478 str = g_key_file_get_string(internalKeyFile, "Presets", key, NULL);
1481 g_debug("Setting (%s) is not in defaults\n", (gchar*)key);
1484 g_debug("comparing: key (%s) -- (%s) == (%s)\n", (gchar*)key, str, value->svalue);
1485 if (strcmp(str, value->shortOpt) != 0)
1487 // Differs from default value. Store it.
1488 g_debug("storing: key (%s) -- (%s)\n", (gchar*)key, value->shortOpt);
1489 gchar *tmp = g_strescape (value->shortOpt, NULL);
1490 g_key_file_set_value(ski->keyFile, ski->name, (gchar*)key, tmp);
1495 // Remove it if it exists already in keyfile
1496 g_key_file_remove_key (ski->keyFile, ski->name, (gchar*)key, NULL);
1502 ghb_settings_save(signal_user_data_t *ud, const gchar *name)
1504 store_key_info_t ski;
1506 g_debug("ghb_settings_save ()\n");
1508 ski.keyFile = customKeyFile;
1509 ski.autoscale = ghb_settings_get_bool (ud->settings, "autoscale");
1510 g_hash_table_foreach(ud->settings, store_to_key_file, &ski);
1512 build_presets_list(ud->settings);
1513 ud->dont_clear_presets = TRUE;
1514 ghb_set_preset (ud, name);
1515 ud->dont_clear_presets = FALSE;
1518 // Checks to see if the preset is in standard presets
1519 // I allow standard to be overridden by adding a preset with the
1520 // same name to the custom list. So to determine if the named
1521 // preset is standard, I must first check to see if is in the
1524 ghb_presets_is_standard(const gchar *name)
1526 g_debug("ghb_presets_is_standard()\n");
1527 if (g_key_file_has_group(customKeyFile, name))
1529 // The preset is in the custom list, so it
1530 // can not be a standard.
1533 return g_key_file_has_group(standardKeyFile, name);
1536 // This function will not remove presets from the standard preset list.
1537 // Return false if attempt is made.
1539 ghb_presets_remove(GHashTable *settings, const gchar *name)
1541 g_debug("ghb_presets_remove()\n");
1542 if (g_key_file_has_group(customKeyFile, name))
1544 g_debug("\t removing %s\n", name);
1545 g_key_file_remove_group(customKeyFile, name, NULL);
1547 build_presets_list(settings);
1561 struct x264_opt_map_s
1570 static gchar *x264_ref_syns[] = {"ref", "frameref", NULL};
1571 static gchar *x264_mixed_syns[] = {"mixed-refs", NULL};
1572 static gchar *x264_bframes_syns[] = {"bframes", NULL};
1573 static gchar *x264_direct_syns[] = {"direct", "direct-pred", NULL};
1574 static gchar *x264_weightb_syns[] = {"weightb", "weight-b", NULL};
1575 static gchar *x264_brdo_syns[] = {"brdo", "b-rdo", NULL};
1576 static gchar *x264_bime_syns[] = {"bime", NULL};
1577 static gchar *x264_bpyramid_syns[] = {"b-pyramid", NULL};
1578 static gchar *x264_me_syns[] = {"me", NULL};
1579 static gchar *x264_merange_syns[] = {"merange", "me-range", NULL};
1580 static gchar *x264_subme_syns[] = {"subme", "subq", NULL};
1581 static gchar *x264_analyse_syns[] = {"analyse", "partitions", NULL};
1582 static gchar *x264_8x8dct_syns[] = {"8x8dct", NULL};
1583 static gchar *x264_deblock_syns[] = {"deblock", "filter", NULL};
1584 static gchar *x264_trellis_syns[] = {"trellis", NULL};
1585 static gchar *x264_pskip_syns[] = {"no-fast-pskip", NULL};
1586 static gchar *x264_decimate_syns[] = {"no-dct-decimate", NULL};
1587 static gchar *x264_cabac_syns[] = {"cabac", NULL};
1590 find_syn_match(const gchar *opt, gchar **syns)
1593 for (ii = 0; syns[ii] != NULL; ii++)
1595 if (strcmp(opt, syns[ii]) == 0)
1601 struct x264_opt_map_s x264_opt_map[] =
1603 {x264_ref_syns, "x264_refs", "1", X264_OPT_INT},
1604 {x264_mixed_syns, "x264_mixed_refs", "0", X264_OPT_BOOL},
1605 {x264_bframes_syns, "x264_bframes", "0", X264_OPT_INT},
1606 {x264_direct_syns, "x264_direct", "spatial", X264_OPT_COMBO},
1607 {x264_weightb_syns, "x264_weighted_bframes", "0", X264_OPT_BOOL},
1608 {x264_brdo_syns, "x264_brdo", "0", X264_OPT_BOOL},
1609 {x264_bime_syns, "x264_bime", "0", X264_OPT_BOOL},
1610 {x264_bpyramid_syns, "x264_bpyramid", "0", X264_OPT_BOOL},
1611 {x264_me_syns, "x264_me", "hex", X264_OPT_COMBO},
1612 {x264_merange_syns, "x264_merange", "16", X264_OPT_INT},
1613 {x264_subme_syns, "x264_subme", "5", X264_OPT_COMBO},
1614 {x264_analyse_syns, "x264_analyse", "some", X264_OPT_COMBO},
1615 {x264_8x8dct_syns, "x264_8x8dct", "0", X264_OPT_BOOL},
1616 {x264_deblock_syns, "x264_deblock_alpha", "0,0", X264_OPT_DEBLOCK},
1617 {x264_deblock_syns, "x264_deblock_beta", "0,0", X264_OPT_DEBLOCK},
1618 {x264_trellis_syns, "x264_trellis", "0", X264_OPT_COMBO},
1619 {x264_pskip_syns, "x264_no_fast_pskip", "0", X264_OPT_BOOL},
1620 {x264_decimate_syns, "x264_no_dct_decimate", "0", X264_OPT_BOOL},
1621 {x264_cabac_syns, "x264_cabac", "1", X264_OPT_BOOL},
1623 #define X264_OPT_MAP_SIZE (sizeof(x264_opt_map)/sizeof(struct x264_opt_map_s))
1626 x264_opt_get_default(const gchar *opt)
1629 for (jj = 0; jj < X264_OPT_MAP_SIZE; jj++)
1631 if (find_syn_match(opt, x264_opt_map[jj].opt_syns) >= 0)
1633 return x264_opt_map[jj].def_val;
1640 x264_update_int(signal_user_data_t *ud, const gchar *name, const gchar *val)
1645 if (val == NULL) return;
1646 dvalue = g_strtod (val, &end);
1647 ghb_ui_update_int(ud, name, dvalue);
1651 x264_update_bool(signal_user_data_t *ud, const gchar *name, const gchar *val)
1654 ghb_ui_update(ud, name, "1");
1656 ghb_ui_update(ud, name, val);
1660 x264_update_combo(signal_user_data_t *ud, const gchar *name, const gchar *val)
1662 GtkTreeModel *store;
1666 gboolean foundit = FALSE;
1669 if (val == NULL) return;
1670 widget = GHB_WIDGET(ud->builder, name);
1673 g_debug("Failed to find widget for key: %s\n", name);
1676 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
1677 if (gtk_tree_model_get_iter_first (store, &iter))
1681 gtk_tree_model_get(store, &iter, 2, &shortOpt, 3, &ivalue, -1);
1682 if (strcmp(shortOpt, val) == 0)
1684 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
1690 } while (gtk_tree_model_iter_next (store, &iter));
1694 if (gtk_tree_model_get_iter_first (store, &iter))
1698 gtk_tree_model_get(store, &iter, 2, &shortOpt, 3, &ivalue, -1);
1699 if (strcmp(shortOpt, "custom") == 0)
1701 gtk_list_store_set(GTK_LIST_STORE(store), &iter, 4, val, -1);
1702 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
1708 } while (gtk_tree_model_iter_next (store, &iter));
1711 // Its possible the value hasn't changed. Since settings are only
1712 // updated when the value changes, I'm initializing settings here as well.
1713 ghb_widget_to_setting(ud->settings, widget);
1717 x264_update_deblock(signal_user_data_t *ud, const gchar *xval)
1719 gdouble avalue, bvalue;
1724 if (xval == NULL) return;
1725 val = g_strdup(xval);
1726 bvalue = avalue = 0;
1729 gchar *pos = strchr(val, ',');
1735 avalue = g_strtod (val, &end);
1738 bvalue = g_strtod (bval, &end);
1742 ghb_ui_update_int(ud, "x264_deblock_alpha", avalue);
1743 ghb_ui_update_int(ud, "x264_deblock_beta", bvalue);
1747 ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
1749 gchar **split = g_strsplit(options, ":", -1);
1750 if (split == NULL) return;
1755 for (jj = 0; jj < X264_OPT_MAP_SIZE; jj++)
1756 x264_opt_map[jj].found = FALSE;
1758 for (ii = 0; split[ii] != NULL; ii++)
1761 gchar *pos = strchr(split[ii], '=');
1767 for (jj = 0; jj < X264_OPT_MAP_SIZE; jj++)
1769 if (find_syn_match(split[ii], x264_opt_map[jj].opt_syns) >= 0)
1771 x264_opt_map[jj].found = TRUE;
1772 switch(x264_opt_map[jj].type)
1775 x264_update_int(ud, x264_opt_map[jj].name, val);
1778 x264_update_bool(ud, x264_opt_map[jj].name, val);
1780 case X264_OPT_COMBO:
1781 x264_update_combo(ud, x264_opt_map[jj].name, val);
1783 case X264_OPT_DEBLOCK:
1784 // dirty little hack. mark deblock_beta found as well
1785 x264_opt_map[jj+1].found = TRUE;
1786 x264_update_deblock(ud, val);
1793 // For any options not found in the option string, set ui to
1795 for (jj = 0; jj < X264_OPT_MAP_SIZE; jj++)
1797 if (!x264_opt_map[jj].found)
1799 gchar *val = strdup(x264_opt_map[jj].def_val);
1800 switch(x264_opt_map[jj].type)
1803 x264_update_int(ud, x264_opt_map[jj].name, val);
1806 x264_update_bool(ud, x264_opt_map[jj].name, val);
1808 case X264_OPT_COMBO:
1809 x264_update_combo(ud, x264_opt_map[jj].name, val);
1811 case X264_OPT_DEBLOCK:
1812 x264_update_deblock(ud, val);
1815 x264_opt_map[jj].found = TRUE;
1823 get_deblock_val(signal_user_data_t *ud)
1825 const gchar *alpha, *beta;
1827 alpha = ghb_settings_get_string(ud->settings, "x264_deblock_alpha");
1828 beta = ghb_settings_get_string(ud->settings, "x264_deblock_beta");
1829 result = g_strdup_printf("%s,%s", alpha, beta);
1834 ghb_x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
1837 const gchar *name = gtk_widget_get_name(widget);
1838 gchar **opt_syns = NULL;
1839 const gchar *def_val = NULL;
1842 for (jj = 0; jj < X264_OPT_MAP_SIZE; jj++)
1844 if (strcmp(name, x264_opt_map[jj].name) == 0)
1846 // found the options that needs updating
1847 opt_syns = x264_opt_map[jj].opt_syns;
1848 def_val = x264_opt_map[jj].def_val;
1849 type = x264_opt_map[jj].type;
1853 if (opt_syns != NULL)
1855 GString *x264opts = g_string_new("");
1856 const gchar *options;
1857 options = ghb_settings_get_string(ud->settings, "x264_options");
1858 gchar **split = g_strsplit(options, ":", -1);
1860 gboolean foundit = FALSE;
1862 if (split == NULL) return;
1863 for (ii = 0; split[ii] != NULL; ii++)
1867 gchar *pos = strchr(split[ii], '=');
1873 syn = find_syn_match(split[ii], opt_syns);
1875 { // Updating this option
1878 if (type == X264_OPT_DEBLOCK)
1879 val = get_deblock_val(ud);
1881 val = ghb_widget_string(widget);
1882 if (strcmp(def_val, val) != 0)
1884 g_string_append_printf(x264opts, "%s=%s:", opt_syns[syn], val);
1888 else if (val != NULL)
1889 g_string_append_printf(x264opts, "%s=%s:", split[ii], val);
1891 g_string_append_printf(x264opts, "%s:", split[ii]);
1897 if (type == X264_OPT_DEBLOCK)
1898 val = get_deblock_val(ud);
1900 val = ghb_widget_string(widget);
1901 if (strcmp(def_val, val) != 0)
1903 g_string_append_printf(x264opts, "%s=%s:", opt_syns[0], val);
1907 // Update the options value
1908 // strip the trailing ":"
1911 result = g_string_free(x264opts, FALSE);
1912 len = strlen(result);
1913 if (len > 0) result[len - 1] = 0;
1914 ghb_ui_update(ud, "x264_options", result);
1919 x264_remove_opt(gchar **opts, gchar **opt_syns)
1922 for (ii = 0; opts[ii] != NULL; ii++)
1925 opt = g_strdup(opts[ii]);
1926 gchar *pos = strchr(opt, '=');
1931 if (find_syn_match(opt, opt_syns) >= 0)
1940 // Construct the x264 options string
1941 // The result is allocated, so someone must free it at some point.
1943 ghb_sanitize_x264opts(signal_user_data_t *ud, const gchar *options)
1945 GString *x264opts = g_string_new("");
1946 gchar **split = g_strsplit(options, ":", -1);
1948 // Remove entries that match the defaults
1950 for (ii = 0; split[ii] != NULL; ii++)
1953 gchar *opt = g_strdup(split[ii]);
1954 gchar *pos = strchr(opt, '=');
1964 const gchar *def_val = x264_opt_get_default(opt);
1965 if (strcmp(val, def_val) == 0)
1967 // Matches the default, so remove it
1972 gint refs = ghb_settings_get_int(ud->settings, "x264_refs");
1975 x264_remove_opt(split, x264_mixed_syns);
1977 gint subme = ghb_settings_get_int(ud->settings, "x264_subme");
1980 x264_remove_opt(split, x264_brdo_syns);
1982 gint bframes = ghb_settings_get_int(ud->settings, "x264_bframes");
1985 x264_remove_opt(split, x264_weightb_syns);
1986 x264_remove_opt(split, x264_brdo_syns);
1987 x264_remove_opt(split, x264_bime_syns);
1991 x264_remove_opt(split, x264_bpyramid_syns);
1993 const gchar *me = ghb_settings_get_string(ud->settings, "x264_me");
1994 if (!(strcmp(me, "umh") == 0 || strcmp(me, "esa") == 0))
1996 x264_remove_opt(split, x264_merange_syns);
1998 if (!ghb_settings_get_bool(ud->settings, "x264_cabac"))
2000 x264_remove_opt(split, x264_trellis_syns);
2002 gint analyse = ghb_settings_get_int(ud->settings, "x264_analyse");
2005 x264_remove_opt(split, x264_direct_syns);
2007 for (ii = 0; split[ii] != NULL; ii++)
2009 if (split[ii][0] != 0)
2010 g_string_append_printf(x264opts, "%s:", split[ii]);
2012 // strip the trailing ":"
2015 result = g_string_free(x264opts, FALSE);
2016 len = strlen(result);
2017 if (len > 0) result[len - 1] = 0;
2021 static gint pref_acodec[8];
2022 static gint pref_bitrate[8];
2023 static gint pref_rate[8];
2024 static gint pref_mix[8];
2025 static gdouble pref_drc[8];
2026 static gint pref_audio_count = 0;
2029 ghb_pref_audio_init(signal_user_data_t *ud)
2031 const gchar *acodec, *bitrate, *rate, *mix, *drc;
2032 gchar **split_acodec, **split_bitrate, **split_rate;
2033 gchar **split_mix, **split_drc;
2035 acodec = ghb_settings_get_string(ud->settings, "pref_audio_codec");
2036 bitrate = ghb_settings_get_string(ud->settings, "pref_audio_bitrate");
2037 rate = ghb_settings_get_string(ud->settings, "pref_audio_rate");
2038 mix = ghb_settings_get_string(ud->settings, "pref_audio_mix");
2039 drc = ghb_settings_get_string(ud->settings, "pref_audio_drc");
2040 split_acodec = g_strsplit(acodec, ",", 8);
2041 split_bitrate = g_strsplit(bitrate, ",", 8);
2042 split_rate = g_strsplit(rate, ",", 8);
2043 split_mix = g_strsplit(mix, ",", 8);
2044 split_drc = g_strsplit(drc, ",", 8);
2045 if (split_acodec == NULL)
2046 { // This should never happen, but just in case...
2047 split_acodec = g_strsplit("faac", ",", -1);
2050 for (ii = 0; split_acodec[ii]; ii++)
2052 pref_acodec[ii] = ghb_lookup_acodec(split_acodec[ii]);
2054 pref_audio_count = ii;
2055 for (ii = 0; split_bitrate && split_bitrate[ii]; ii++)
2057 pref_bitrate[ii] = ghb_lookup_bitrate(split_bitrate[ii]);
2059 for (ii = 0; ii < pref_audio_count; ii++)
2061 pref_bitrate[ii] = pref_bitrate[0];
2063 for (ii = 0; split_rate && split_rate[ii]; ii++)
2065 pref_rate[ii] = ghb_lookup_rate(split_rate[ii]);
2067 for (ii = 0; ii < pref_audio_count; ii++)
2069 pref_rate[ii] = pref_rate[0];
2071 for (ii = 0; split_mix && split_mix[ii]; ii++)
2073 pref_mix[ii] = ghb_lookup_mix(split_mix[ii]);
2075 for (ii = 0; ii < pref_audio_count; ii++)
2077 pref_mix[ii] = pref_mix[0];
2079 for (ii = 0; split_drc && split_drc[ii]; ii++)
2081 pref_drc[ii] = ghb_lookup_drc(split_drc[ii]);
2083 for (ii = 0; ii < pref_audio_count; ii++)
2085 pref_drc[ii] = pref_drc[0];
2092 return pref_audio_count;
2096 ghb_pref_acodec(gint index)
2098 if (index >= pref_audio_count)
2100 return pref_acodec[index];
2104 ghb_pref_bitrate(gint index)
2106 if (index >= pref_audio_count)
2108 return pref_bitrate[index];
2112 ghb_pref_rate(gint index)
2114 if (index >= pref_audio_count)
2116 return pref_rate[index];
2120 ghb_pref_mix(gint index)
2122 if (index >= pref_audio_count)
2124 return pref_mix[index];
2128 ghb_pref_drc(gint index)
2130 if (index >= pref_audio_count)
2132 return pref_drc[index];