40#include "mp3splt-gtk.h"
48static gpointer split_collected_files(
ui_for_split *ui_fs);
49static gboolean collect_files_to_split(
ui_state *ui);
53 set_is_splitting_safe(TRUE, ui);
54 if (!collect_files_to_split(ui))
56 set_is_splitting_safe(FALSE, ui);
60 gtk_widget_set_sensitive(ui->gui->cancel_button, TRUE);
64 ui_fs->pat = get_splitpoints_and_tags_for_mp3splt_state(ui);
66 create_thread_and_unref((GThreadFunc)split_collected_files,
67 (gpointer) ui_fs, ui,
"split");
70static gboolean collect_files_to_split(
ui_state *ui)
73 GPtrArray *files_to_split = ui->files_to_split;
74 if (files_to_split && files_to_split->len > 0)
76 gint length = files_to_split->len;
78 for (i = 0;i < length;i++)
80 g_free(g_ptr_array_index(files_to_split, i));
82 g_ptr_array_free(ui->files_to_split, TRUE);
84 ui->files_to_split = g_ptr_array_new();
87 if (get_split_file_mode(ui) == FILE_MODE_SINGLE)
91 else if (ui->infos->multiple_files_tree_number > 0)
93 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(ui->gui->multiple_files_tree));
95 while (row_number < ui->infos->multiple_files_tree_number)
97 GtkTreePath *path = gtk_tree_path_new_from_indices(row_number ,-1);
100 gtk_tree_model_get_iter(model, &iter, path);
102 gchar *filename = NULL;
103 gtk_tree_model_get(model, &iter, MULTIPLE_COL_FILENAME, &filename, -1);
105 g_ptr_array_add(ui->files_to_split, filename);
119static gboolean split_collected_files_end(
ui_with_err *ui_err)
121 gint err = ui_err->err;
124 gtk_widget_set_sensitive(ui->gui->cancel_button, FALSE);
128 gtk_progress_bar_set_fraction(ui->gui->percent_progress_bar, 1.0);
129 gtk_progress_bar_set_text(ui->gui->percent_progress_bar, _(
" finished"));
132 set_is_splitting_safe(FALSE, ui);
134 set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
141static gint get_stop_split_safe(
ui_state *ui)
143 lock_mutex(&ui->variables_mutex);
144 gint stop_split = ui->status->stop_split;
145 unlock_mutex(&ui->variables_mutex);
150static gpointer split_collected_files(
ui_for_split *ui_fs)
154 set_process_in_progress_and_wait_safe(TRUE, ui);
158 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_DEFAULT);
159 if (!ui_fs->is_checked_output_radio_box)
161 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_FORMAT);
164 mp3splt_set_path_of_split(ui->mp3splt_state, ui_fs->output_directory);
166 gint err = mp3splt_erase_all_splitpoints(ui->mp3splt_state);
167 err = mp3splt_erase_all_tags(ui->mp3splt_state);
169 gint split_mode = mp3splt_get_int_option(ui->mp3splt_state, SPLT_OPT_SPLIT_MODE, &err);
170 print_status_bar_confirmation_in_idle(err, ui);
172 err = mp3splt_set_oformat(ui->mp3splt_state, ui_fs->output_format);
174 if (mp3splt_get_int_option(ui->mp3splt_state, SPLT_OPT_SPLIT_MODE, &err) == SPLT_OPTION_NORMAL_MODE &&
175 ui_fs->split_file_mode == FILE_MODE_SINGLE)
177 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_CUSTOM);
180 if (split_mode == SPLT_OPTION_NORMAL_MODE)
183 for (i = 0;i < ui_fs->pat->splitpoints->len; i++)
185 splt_point *point = g_ptr_array_index(ui_fs->pat->splitpoints, i);
186 mp3splt_append_splitpoint(ui->mp3splt_state, point);
187 splt_tags *tags = g_ptr_array_index(ui_fs->pat->tags, i);
188 mp3splt_append_tags(ui->mp3splt_state, tags);
191 err = mp3splt_remove_tags_of_skippoints(ui->mp3splt_state);
192 print_status_bar_confirmation_in_idle(err, ui);
195 gint output_filenames = mp3splt_get_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, &err);
197 gint selected_split_mode = ui_fs->selected_split_mode;
198 gboolean is_single_file_mode = FALSE;
199 if (ui_fs->split_file_mode == FILE_MODE_SINGLE)
201 is_single_file_mode = TRUE;
206 GPtrArray *files_to_split = ui->files_to_split;
207 gint length = files_to_split->len;
209 for (i = 0;i < length;i++)
211 gchar *filename = g_ptr_array_index(files_to_split, i);
215 mp3splt_set_filename_to_split(ui->mp3splt_state, filename);
219 if (!is_single_file_mode)
221 if (selected_split_mode == SELECTED_SPLIT_INTERNAL_SHEET)
223 err = mp3splt_import(ui->mp3splt_state, PLUGIN_INTERNAL_IMPORT, filename);
224 print_status_bar_confirmation_in_idle(err, ui);
225 if (err < 0) {
continue; }
227 else if ((selected_split_mode == SELECTED_SPLIT_CUE_FILE) ||
228 (selected_split_mode == SELECTED_SPLIT_CDDB_FILE))
230 gchar *cue_or_cddb = g_strdup(filename);
231 gchar *last_ext = g_strrstr(cue_or_cddb,
".");
234 GString *cue_or_cddb_file = g_string_new(cue_or_cddb);
237 if (selected_split_mode == SELECTED_SPLIT_CUE_FILE)
239 g_string_append(cue_or_cddb_file,
".cue");
240 err = mp3splt_import(ui->mp3splt_state, CUE_IMPORT, cue_or_cddb_file->str);
244 g_string_append(cue_or_cddb_file,
".cddb");
245 err = mp3splt_import(ui->mp3splt_state, CDDB_IMPORT, cue_or_cddb_file->str);
248 print_status_bar_confirmation_in_idle(err, ui);
249 g_string_free(cue_or_cddb_file, SPLT_TRUE);
250 if (err < 0) {
continue; }
254 err = mp3splt_split(ui->mp3splt_state);
255 print_status_bar_confirmation_in_idle(err, ui);
257 err = mp3splt_erase_all_tags(ui->mp3splt_state);
258 print_status_bar_confirmation_in_idle(err, ui);
260 err = mp3splt_erase_all_splitpoints(ui->mp3splt_state);
261 print_status_bar_confirmation_in_idle(err, ui);
263 if (get_stop_split_safe(ui))
265 set_stop_split_safe(FALSE, ui);
270 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, output_filenames);
272 free_ui_for_split(ui_fs);
278 add_idle(G_PRIORITY_HIGH_IDLE, (GSourceFunc)split_collected_files_end, ui_err, NULL);
283static gpointer thread_wrapper_function(gpointer data)
288 set_process_in_progress_and_wait_safe(TRUE, ui);
291 if (ui_wd->filename_to_split != NULL)
293 mp3splt_set_filename_to_split(ui->mp3splt_state, ui_wd->filename_to_split);
296 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_DEBUG_MODE, ui->infos->debug_is_active);
297 if (ui_wd->is_checked_output_radio_box)
299 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_FORMAT);
303 mp3splt_set_int_option(ui->mp3splt_state, SPLT_OPT_OUTPUT_FILENAMES, SPLT_OUTPUT_DEFAULT);
306 set_process_in_progress_and_wait_safe(FALSE, ui);
308 gpointer returned_value = ui_wd->thread(ui_wd->data);
310 if (ui_wd->filename_to_split) { g_free(ui_wd->filename_to_split); }
313 return returned_value;
316GThread *create_thread(GThreadFunc func, gpointer data,
ui_state *ui,
const char *name)
321 ui_wd->thread = func;
324 if (input_filename != NULL)
326 ui_wd->filename_to_split = g_strdup(input_filename);
328 return g_thread_new(name, thread_wrapper_function, ui_wd);
331void create_thread_and_unref(GThreadFunc func, gpointer data,
ui_state *ui,
const char *name)
333 g_thread_unref(create_thread(func, data, ui, name));
336void add_idle(gint priority, GSourceFunc function, gpointer data, GDestroyNotify notify)
338 gdk_threads_add_idle_full(priority, function, data, notify);
341gboolean exit_application(GtkWidget *widget, GdkEvent *event, gpointer data)
345 ui_save_preferences(NULL, ui);
347 if (get_is_splitting_safe(ui))
349 lmanager_stop_split(ui);
358 g_application_quit(G_APPLICATION(ui->gui->application));
363static gboolean sigint_called = FALSE;
364static void sigint_handler(gint sig)
368 sigint_called = TRUE;
369 exit_application(NULL, NULL, ui);
374static void sigpipe_handler(gint sig)
377 ui->infos->selected_player == PLAYER_SNACKAMP)
384static void register_application_signals()
386 signal(SIGINT, sigint_handler);
388 signal(SIGPIPE, sigpipe_handler);
392static void init_i18n_and_plugin_paths(gchar *argv[],
ui_state *ui)
394 setlocale(LC_ALL,
"");
395 textdomain(
"mp3splt-gtk");
398 char mp3splt_uninstall_file[2048] = {
'\0' };
399 DWORD dwType, dwSize =
sizeof(mp3splt_uninstall_file) - 1;
400 SHGetValue(HKEY_LOCAL_MACHINE,
401 TEXT(
"SOFTWARE\\mp3splt-gtk"),
402 TEXT(
"UninstallString"),
404 mp3splt_uninstall_file,
407 gchar *end = strrchr(mp3splt_uninstall_file, SPLT_DIRCHAR);
408 if (end) { *end =
'\0'; }
410 gchar *executable_dir = NULL;
411 gchar *executable = strdup(argv[0]);
413 end = strrchr(executable, SPLT_DIRCHAR);
417 executable_dir = executable;
421 if (mp3splt_uninstall_file[0] !=
'\0')
423 executable_dir = mp3splt_uninstall_file;
427 bindtextdomain(LIBMP3SPLT_WITH_SONAME,
"translations");
428 bindtextdomain(
"mp3splt-gtk",
"translations");
429 bind_textdomain_codeset(
"mp3splt-gtk",
"UTF-8");
431 bindtextdomain(
"mp3splt-gtk", LOCALEDIR);
432 bind_textdomain_codeset(
"mp3splt-gtk", nl_langinfo(CODESET));
436 if (executable != NULL)
438 if (executable[0] !=
'\0')
440 g_setenv(
"GST_PLUGIN_PATH",
".\\", TRUE);
441 mp3splt_append_plugins_scan_dir(ui->mp3splt_state, executable);
450static void set_language_env_variable_from_preferences()
452 GKeyFile *key_file = g_key_file_new();
455 g_key_file_load_from_file(key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
463 gchar *lang = g_key_file_get_string(key_file,
"general",
"language", NULL);
465 gchar lang_env[32] = {
'\0' };
466 g_snprintf(lang_env, 32,
"LANG=%s", lang);
470 g_key_file_free(key_file);
497gint
main(gint argc, gchar **argv, gchar **envp)
504 register_application_signals();
505 init_i18n_and_plugin_paths(argv, ui);
507 gtk_init(&argc, &argv);
509 lmanager_init_and_find_plugins(ui);
512 set_language_env_variable_from_preferences();
515 create_application(ui);
516 int application_code =
517 g_application_run(G_APPLICATION(ui->gui->application), argc, argv);
519 gint return_code = ui->return_code;
522 if (application_code != 0)
524 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.