void ags_drum_set_pattern(AgsDrum *drum) { AgsLine *selected_line; GList *list, *line; guint index0, index1, offset; gboolean set_active; guint i; if(drum->selected_pad == NULL){ g_message("no selected pad\n\0"); return; } for(i = 0; i < 4 && drum->selected0 != drum->index0[i]; i++); index0 = i; for(i = 0; i < 12 && drum->selected1 != drum->index1[i]; i++); index1 = i; list = gtk_container_get_children((GtkContainer *) drum->offset); for(i = 0; i < 4 && ! GTK_TOGGLE_BUTTON(list->data)->active; i++) list = list->next; offset = i * 16; list = gtk_container_get_children((GtkContainer *) drum->pattern); drum->flags |= AGS_DRUM_BLOCK_PATTERN; for(i = 0; i < 16; i++){ set_active = TRUE; line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(drum->selected_pad)->expander_set)); while((line = ags_line_find_next_grouped(line)) != NULL){ selected_line = AGS_LINE(line->data); if(!ags_pattern_get_bit((AgsPattern *) selected_line->channel->pattern->data, index0, index1, offset + i)){ set_active = FALSE; break; } line = line->next; } gtk_toggle_button_set_active((GtkToggleButton *) list->data, set_active); list = list->next; } drum->flags &= (~AGS_DRUM_BLOCK_PATTERN); }
void ags_drum_pad_callback(GtkWidget *toggle_button, AgsDrum *drum) { AgsLine *selected_line; AgsPattern *pattern; AgsTogglePatternBit *toggle_pattern_bit; GList *list, *line; GList *tasks; guint i, index0, index1, offset; if(drum->selected_pad == NULL){ return; } if((AGS_DRUM_BLOCK_PATTERN & (drum->flags)) != 0){ #ifdef AGS_DEBUG g_message("AgsDrum pattern is blocked\n\0"); #endif return; } list = gtk_container_get_children((GtkContainer *) drum->pattern); for(i = 0; i < 16 && toggle_button != list->data; i++) list = list->next; offset = i; for(i = 0; i < 4 && drum->selected0 != drum->index0[i]; i++); index0 = i; for(i = 0; i < 12 && drum->selected1 != drum->index1[i]; i++); index1 = i; list = gtk_container_get_children((GtkContainer *) drum->offset); for(i = 0; i < 4 && ! GTK_TOGGLE_BUTTON(list->data)->active; i++) list = list->next; offset += (i * 16); line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(drum->selected_pad)->expander_set)); tasks = NULL; while((line = ags_line_find_next_grouped(line)) != NULL){ selected_line = AGS_LINE(line->data); toggle_pattern_bit = ags_toggle_pattern_bit_new(selected_line->channel->pattern->data, selected_line->channel->line, index0, index1, offset); tasks = g_list_prepend(tasks, toggle_pattern_bit); line = line->next; } /* append AgsTogglePatternBit */ ags_task_thread_append_tasks(AGS_TASK_THREAD(AGS_AUDIO_LOOP(AGS_MAIN(AGS_DEVOUT(AGS_MACHINE(drum)->audio->devout)->ags_main)->main_loop)->task_thread), tasks); }
void ags_drum_input_pad_open_response_callback(GtkWidget *widget, gint response, AgsDrumInputPad *drum_input_pad) { AgsWindow *window; GtkFileChooserDialog *file_chooser; GtkSpinButton *spin_button; AgsAudioFile *audio_file; AgsOpenSingleFile *open_single_file; AgsThread *gui_thread; AgsApplicationContext *application_context; GList *task; char *name0, *name1; pthread_mutex_t *application_mutex; window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) drum_input_pad, AGS_TYPE_WINDOW); file_chooser = drum_input_pad->file_chooser; application_context = (AgsApplicationContext *) window->application_context; gui_thread = ags_ui_provider_get_gui_thread(AGS_UI_PROVIDER(application_context)); if(response == GTK_RESPONSE_ACCEPT){ name0 = gtk_file_chooser_get_filename((GtkFileChooser *) file_chooser); name1 = (char *) g_object_get_data((GObject *) file_chooser, AGS_DRUM_INPUT_PAD_OPEN_AUDIO_FILE_NAME); spin_button = (GtkSpinButton *) g_object_get_data((GObject *) file_chooser, AGS_DRUM_INPUT_PAD_OPEN_SPIN_BUTTON); /* open audio file and read audio signal */ if(g_strcmp0(name0, name1)){ if(name1 != NULL){ audio_file = (AgsAudioFile *) g_object_get_data((GObject *) file_chooser, g_type_name(AGS_TYPE_AUDIO_FILE)); g_object_unref(G_OBJECT(audio_file)); } } /* task */ task = NULL; if(AGS_PAD(drum_input_pad)->group->active){ AgsChannel *current, *next_pad, *next_current; guint i; current = AGS_PAD(drum_input_pad)->channel; if(current != NULL) { g_object_ref(current); } next_pad = ags_channel_next_pad(current); next_current = NULL; for(i = 0; current != next_pad; i++){ open_single_file = ags_open_single_file_new(current, name0, i); task = g_list_prepend(task, open_single_file); /* iterate */ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } if(next_pad != NULL){ g_object_unref(next_pad); } if(next_current != NULL){ g_object_unref(next_current); } }else{ AgsLine *line; GList *list; list = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(drum_input_pad)->expander_set)); line = AGS_LINE(ags_line_find_next_grouped(list)->data); open_single_file = ags_open_single_file_new(line->channel, name0, (guint) spin_button->adjustment->value); task = g_list_prepend(task, open_single_file); g_list_free(list); } ags_gui_thread_schedule_task_list((AgsGuiThread *) gui_thread, task); gtk_widget_destroy((GtkWidget *) file_chooser); }else if(response == GTK_RESPONSE_CANCEL){ audio_file = (AgsAudioFile *) g_object_get_data((GObject *) file_chooser, g_type_name(AGS_TYPE_AUDIO_FILE)); if(audio_file != NULL){ g_object_unref(G_OBJECT(audio_file)); } gtk_widget_destroy((GtkWidget *) file_chooser); } drum_input_pad->file_chooser = NULL; }