40#include "mp3splt-gtk.h"
49static gpointer split_collected_files(
ui_for_split *ui_fs);
50static gboolean collect_files_to_split(
ui_state *ui);
54 set_is_splitting_safe(TRUE, ui);
55 if (!collect_files_to_split(ui))
57 set_is_splitting_safe(FALSE, ui);
61 gtk_widget_set_sensitive(ui->gui->cancel_button, TRUE);
65 ui_fs->pat = get_splitpoints_and_tags_for_mp3splt_state(ui);
67 create_thread_and_unref((GThreadFunc)split_collected_files,
68 (gpointer) ui_fs, ui,
"split");
71static gboolean collect_files_to_split(
ui_state *ui)
74 GPtrArray *files_to_split = ui->files_to_split;
75 if (files_to_split && files_to_split->len > 0)
77 gint length = files_to_split->len;
79 for (i = 0;i < length;i++)
81 g_free(g_ptr_array_index(files_to_split, i));
83 g_ptr_array_free(ui->files_to_split, TRUE);
85 ui->files_to_split = g_ptr_array_new();
88 if (get_split_file_mode(ui) == FILE_MODE_SINGLE)
92 else if (ui->infos->multiple_files_tree_number > 0)
94 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(ui->gui->multiple_files_tree));
96 while (row_number < ui->infos->multiple_files_tree_number)
98 GtkTreePath *path = gtk_tree_path_new_from_indices(row_number ,-1);
101 gtk_tree_model_get_iter(model, &iter, path);
103 gchar *filename = NULL;
104 gtk_tree_model_get(model, &iter, MULTIPLE_COL_FILENAME, &filename, -1);
106 g_ptr_array_add(ui->files_to_split, filename);
120static gboolean split_collected_files_end(
ui_with_err *ui_err)
122 gint err = ui_err->err;
125 gtk_widget_set_sensitive(ui->gui->cancel_button, FALSE);
129 gtk_progress_bar_set_fraction(ui->gui->percent_progress_bar, 1.0);
130 gtk_progress_bar_set_text(ui->gui->percent_progress_bar, _(
" finished"));
133 set_is_splitting_safe(FALSE, ui);
135 set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
142static gint get_stop_split_safe(
ui_state *ui)
144 lock_mutex(&ui->variables_mutex);
145 gint stop_split = ui->status->stop_split;
146 unlock_mutex(&ui->variables_mutex);
151static gpointer split_collected_files(
ui_for_split *ui_fs)
155 set_process_in_progress_and_wait_safe(TRUE, ui);
159 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_DEFAULT);
160 if (!ui_fs->is_checked_output_radio_box)
162 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_FORMAT);
165 mp3splt_set_path_of_split(ui->mp3splt_state, ui_fs->output_directory);
167 gint err = mp3splt_erase_all_splitpoints(ui->mp3splt_state);
168 err = mp3splt_erase_all_tags(ui->mp3splt_state);
170 gint split_mode = mp3splt_get_int_option(ui->mp3splt_state, SPLT_OPT_SPLIT_MODE, &err);
171 print_status_bar_confirmation_in_idle(err, ui);
173 err = mp3splt_set_oformat(ui->mp3splt_state, ui_fs->output_format);
175 if (mp3splt_get_int_option(ui->mp3splt_state, SPLT_OPT_SPLIT_MODE, &err) == SPLT_OPTION_NORMAL_MODE &&
176 ui_fs->split_file_mode == FILE_MODE_SINGLE)
178 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_CUSTOM);
181 if (split_mode == SPLT_OPTION_NORMAL_MODE)
184 for (i = 0;i < ui_fs->pat->splitpoints->len; i++)
186 splt_point *point = g_ptr_array_index(ui_fs->pat->splitpoints, i);
187 mp3splt_append_splitpoint(ui->mp3splt_state, point);
188 splt_tags *tags = g_ptr_array_index(ui_fs->pat->tags, i);
189 mp3splt_append_tags(ui->mp3splt_state, tags);
192 err = mp3splt_remove_tags_of_skippoints(ui->mp3splt_state);
193 print_status_bar_confirmation_in_idle(err, ui);
196 gint selected_split_mode = ui_fs->selected_split_mode;
197 gboolean is_single_file_mode = FALSE;
198 if (ui_fs->split_file_mode == FILE_MODE_SINGLE)
200 is_single_file_mode = TRUE;
205 GPtrArray *files_to_split = ui->files_to_split;
206 gint length = files_to_split->len;
208 for (i = 0;i < length;i++)
210 gint output_filenames = mp3splt_get_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, &err);
212 gchar *filename = g_ptr_array_index(files_to_split, i);
216 mp3splt_set_filename_to_split(ui->mp3splt_state, filename);
218 if (!is_single_file_mode)
220 if (selected_split_mode == SELECTED_SPLIT_INTERNAL_SHEET)
222 err = mp3splt_import(ui->mp3splt_state, PLUGIN_INTERNAL_IMPORT, filename);
223 print_status_bar_confirmation_in_idle(err, ui);
224 if (err < 0) {
continue; }
226 else if ((selected_split_mode == SELECTED_SPLIT_CUE_FILE) ||
227 (selected_split_mode == SELECTED_SPLIT_CDDB_FILE))
229 gchar *cue_or_cddb = g_strdup(filename);
230 gchar *last_ext = g_strrstr(cue_or_cddb,
".");
233 GString *cue_or_cddb_file = g_string_new(cue_or_cddb);
236 if (selected_split_mode == SELECTED_SPLIT_CUE_FILE) {
237 g_string_append(cue_or_cddb_file,
".cue");
238 err = mp3splt_import(ui->mp3splt_state, CUE_IMPORT, cue_or_cddb_file->str);
241 splt_point *splitpoint = mp3splt_point_new(LONG_MAX, NULL);
242 err = mp3splt_append_splitpoint(ui->mp3splt_state, splitpoint);
247 g_string_append(cue_or_cddb_file,
".cddb");
248 err = mp3splt_import(ui->mp3splt_state, CDDB_IMPORT, cue_or_cddb_file->str);
251 print_status_bar_confirmation_in_idle(err, ui);
252 g_string_free(cue_or_cddb_file, SPLT_TRUE);
253 if (err < 0) {
continue; }
256 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_CUSTOM);
260 err = mp3splt_split(ui->mp3splt_state);
261 print_status_bar_confirmation_in_idle(err, ui);
263 err = mp3splt_erase_all_tags(ui->mp3splt_state);
264 print_status_bar_confirmation_in_idle(err, ui);
266 err = mp3splt_erase_all_splitpoints(ui->mp3splt_state);
267 print_status_bar_confirmation_in_idle(err, ui);
269 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, output_filenames);
271 if (get_stop_split_safe(ui))
273 set_stop_split_safe(FALSE, ui);
278 free_ui_for_split(ui_fs);
284 add_idle(G_PRIORITY_HIGH_IDLE, (GSourceFunc)split_collected_files_end, ui_err, NULL);
289static gpointer thread_wrapper_function(gpointer data)
294 set_process_in_progress_and_wait_safe(TRUE, ui);
297 if (ui_wd->filename_to_split != NULL)
299 mp3splt_set_filename_to_split(ui->mp3splt_state, ui_wd->filename_to_split);
302 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_DEBUG_MODE, ui->infos->debug_is_active);
303 if (ui_wd->is_checked_output_radio_box)
305 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_FORMAT);
309 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_DEFAULT);
312 set_process_in_progress_and_wait_safe(FALSE, ui);
314 gpointer returned_value = ui_wd->thread(ui_wd->data);
316 if (ui_wd->filename_to_split) { g_free(ui_wd->filename_to_split); }
319 return returned_value;
322GThread *create_thread(GThreadFunc func, gpointer data,
ui_state *ui,
const char *name)
327 ui_wd->thread = func;
330 if (input_filename != NULL)
332 ui_wd->filename_to_split = g_strdup(input_filename);
334 return g_thread_new(name, thread_wrapper_function, ui_wd);
337void create_thread_and_unref(GThreadFunc func, gpointer data,
ui_state *ui,
const char *name)
339 g_thread_unref(create_thread(func, data, ui, name));
342void add_idle(gint priority, GSourceFunc function, gpointer data, GDestroyNotify notify)
344 gdk_threads_add_idle_full(priority, function, data, notify);
347gboolean exit_application(GtkWidget *widget, GdkEvent *event, gpointer data)
351 ui_save_preferences(NULL, ui);
353 if (get_is_splitting_safe(ui))
355 lmanager_stop_split(ui);
364 g_application_quit(G_APPLICATION(ui->gui->application));
369static gboolean sigint_called = FALSE;
370static void sigint_handler(gint sig)
374 sigint_called = TRUE;
375 exit_application(NULL, NULL, ui);
380static void sigpipe_handler(gint sig)
383 ui->infos->selected_player == PLAYER_SNACKAMP)
390static void register_application_signals()
392 signal(SIGINT, sigint_handler);
394 signal(SIGPIPE, sigpipe_handler);
398static void init_i18n_and_plugin_paths(gchar *argv[],
ui_state *ui)
400 setlocale(LC_ALL,
"");
401 textdomain(
"mp3splt-gtk");
404 char mp3splt_uninstall_file[2048] = {
'\0' };
405 DWORD dwType, dwSize =
sizeof(mp3splt_uninstall_file) - 1;
406 SHGetValue(HKEY_LOCAL_MACHINE,
407 TEXT(
"SOFTWARE\\mp3splt-gtk"),
408 TEXT(
"UninstallString"),
410 mp3splt_uninstall_file,
413 gchar *end = strrchr(mp3splt_uninstall_file, SPLT_DIRCHAR);
414 if (end) { *end =
'\0'; }
416 gchar *executable_dir = NULL;
417 gchar *executable = strdup(argv[0]);
419 end = strrchr(executable, SPLT_DIRCHAR);
423 executable_dir = executable;
427 if (mp3splt_uninstall_file[0] !=
'\0')
429 executable_dir = mp3splt_uninstall_file;
433 bindtextdomain(LIBMP3SPLT_WITH_SONAME,
"translations");
434 bindtextdomain(
"mp3splt-gtk",
"translations");
435 bind_textdomain_codeset(
"mp3splt-gtk",
"UTF-8");
437 bindtextdomain(
"mp3splt-gtk", LOCALEDIR);
438 bind_textdomain_codeset(
"mp3splt-gtk", nl_langinfo(CODESET));
442 if (executable != NULL)
444 if (executable[0] !=
'\0')
446 g_setenv(
"GST_PLUGIN_PATH",
".\\", TRUE);
447 mp3splt_append_plugins_scan_dir(ui->mp3splt_state, executable);
456static void set_language_env_variable_from_preferences()
458 GKeyFile *key_file = g_key_file_new();
461 g_key_file_load_from_file(key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
469 gchar *lang = g_key_file_get_string(key_file,
"general",
"language", NULL);
471 gchar lang_env[32] = {
'\0' };
472 g_snprintf(lang_env, 32,
"LANG=%s", lang);
476 g_key_file_free(key_file);
503gint
main(gint argc, gchar **argv, gchar **envp)
510 register_application_signals();
511 init_i18n_and_plugin_paths(argv, ui);
513 gtk_init(&argc, &argv);
515 lmanager_init_and_find_plugins(ui);
518 set_language_env_variable_from_preferences();
521 create_application(ui);
522 int application_code =
523 g_application_run(G_APPLICATION(ui->gui->application), argc, argv);
525 gint return_code = ui->return_code;
528 if (application_code != 0)
530 return application_code;
gchar * get_input_filename(gui_state *gui)
Get the name of the input file.
void put_status_message(const gchar *text, ui_state *ui)
Output a info message to the status message bar.
gint main(gint argc, gchar **argv, gchar **envp)
The traditional C main function.
void put_options_from_preferences(ui_for_split *ui_fs)
Update the ui->mp3splt_state structure.
gint player_quit(ui_state *ui)
quits the player
gint player_is_running(ui_state *ui)
returns FALSE if the player is not running, else TRUE
gchar * get_preferences_filename()
Get the name of the preferences file.
gboolean get_checked_output_radio_box(ui_state *ui)
returns the checked output radio box
gint disconnect_snackamp(ui_state *ui)
disconnecting with the player possibly returns an error
void remove_all_split_rows(ui_state *ui)
removes all rows from the split files table
void print_processing_file(gchar *filename, ui_state *ui)
Issues the message "Processing file <filename>" into the message bar.