/** * ags_recall_find_type: * @recall_i a #GList containing recalls * @provider a #GObject * Returns: a #GList containing recalls, or #NULL if not found * * Finds next matching recall for type which has @provider. The @provider may be either an #AgsChannel * or an #AgsAudio object. This function tries to find the corresponding #AgsRecallChannel and #AgsRecallAudio * objects of a #AgsRecall to find. If these recalls contains the @provider, the function will return. */ GList* ags_recall_find_provider(GList *recall_i, GObject *provider) { AgsRecall *recall; while(recall_i != NULL){ recall = AGS_RECALL(recall_i->data); if(AGS_IS_AUDIO(provider)){ if(AGS_IS_RECALL_AUDIO(recall)){ if(((GObject *) AGS_RECALL_AUDIO(recall)->audio) == provider) return(recall_i); }else if(AGS_IS_RECALL_AUDIO_RUN(recall)){ AgsRecallAudio *recall_audio; recall_audio = AGS_RECALL_AUDIO_RUN(recall)->recall_audio; if(recall_audio != NULL && ((GObject *) recall_audio->audio) == provider){ return(recall_i); } } }else if(AGS_IS_CHANNEL(provider)){ if(AGS_IS_RECALL_CHANNEL(recall)){ if(((GObject *) AGS_RECALL_CHANNEL(recall)->source) == provider) return(recall_i); }else if(AGS_IS_RECALL_CHANNEL_RUN(recall)){ if(((GObject *) AGS_RECALL_CHANNEL_RUN(recall)->source) == provider){ return(recall_i); } } }else if(AGS_IS_RECYCLING(provider)){ if(AGS_IS_RECALL_RECYCLING(recall)){ if(((GObject *) AGS_RECALL_RECYCLING(recall)->source) == provider){ return(recall_i); } } }else if(AGS_IS_AUDIO_SIGNAL(provider)){ if(AGS_IS_RECALL_AUDIO_SIGNAL(recall)){ if(((GObject *) AGS_RECALL_AUDIO_SIGNAL(recall)->source) == provider){ return(recall_i); } } } recall_i = recall_i->next; } return(NULL); }
void ags_audiorec_map_recall(AgsMachine *machine) { AgsWindow *window; AgsAudiorec *audiorec; AgsAudio *audio; AgsPlayWaveAudioRun *play_wave_audio_run; AgsCaptureWaveAudioRun *capture_wave_audio_run; GList *start_play, *play; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } audiorec = AGS_AUDIOREC(machine); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); audio = machine->audio; /* ags-play-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-wave", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_WAVE_AUDIO_RUN); if(play != NULL){ GValue value = {0,}; play_wave_audio_run = play->data; /* wave loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_PLAY_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(play_wave_audio_run)->recall_audio)->wave_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * window->navigation->loop_left_tact->adjustment->value); ags_port_safe_write(AGS_PLAY_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(play_wave_audio_run)->recall_audio)->wave_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * window->navigation->loop_right_tact->adjustment->value); ags_port_safe_write(AGS_PLAY_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(play_wave_audio_run)->recall_audio)->wave_loop_end, &value); } g_list_free_full(start_play, g_object_unref); /* ags-capture-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-capture-wave", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN); if(play != NULL){ GValue value = {0,}; capture_wave_audio_run = play->data; /* wave loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_CAPTURE_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(capture_wave_audio_run)->recall_audio)->wave_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * window->navigation->loop_left_tact->adjustment->value); ags_port_safe_write(AGS_CAPTURE_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(capture_wave_audio_run)->recall_audio)->wave_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * window->navigation->loop_right_tact->adjustment->value); ags_port_safe_write(AGS_CAPTURE_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(capture_wave_audio_run)->recall_audio)->wave_loop_end, &value); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_audiorec_input_map_recall(audiorec, 0); /* depending on destination */ ags_audiorec_output_map_recall(audiorec, 0); /* call parent */ AGS_MACHINE_CLASS(ags_audiorec_parent_class)->map_recall(machine); }
void ags_recall_dependency_test_find_dependency_by_provider() { AgsChannel *channel[3]; AgsAudio *audio[3]; AgsRecall *recall; AgsRecallAudio *recall_audio; AgsRecallDependency *recall_dependency[6]; GList *list, *current; list = NULL; /* dependency #0 */ audio[0] = g_object_new(AGS_TYPE_AUDIO, NULL); recall_audio = g_object_new(AGS_TYPE_RECALL_AUDIO, "audio", audio[0], NULL); recall = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, "recall-audio", recall_audio, NULL); recall_dependency[0] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[0]); /* dependency #1 */ channel[0] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, "source", channel[0], NULL); recall_dependency[1] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[1]); /* dependency #2 */ channel[1] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, "source", channel[1], NULL); recall_dependency[2] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[2]); /* dependency #3 */ audio[1] = g_object_new(AGS_TYPE_AUDIO, NULL); recall_audio = g_object_new(AGS_TYPE_RECALL_AUDIO, "audio", audio[1], NULL); recall = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, "recall-audio", recall_audio, NULL); recall_dependency[3] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[3]); /* dependency #4 */ audio[2] = g_object_new(AGS_TYPE_AUDIO, NULL); recall_audio = g_object_new(AGS_TYPE_RECALL_AUDIO, "audio", audio[2], NULL); recall = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, "recall-audio", recall_audio, NULL); recall_dependency[4] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[4]); /* dependency #5 */ channel[2] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, "source", channel[2], NULL); recall_dependency[5] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[5]); /* find and assert - audio */ CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, audio[0])) != NULL && AGS_RECALL_AUDIO_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->recall_audio->audio == audio[0]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, audio[1])) != NULL && AGS_RECALL_AUDIO_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->recall_audio->audio == audio[1]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, audio[2])) != NULL && AGS_RECALL_AUDIO_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->recall_audio->audio == audio[2]); /* find and assert - channel */ CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, channel[0])) != NULL && AGS_RECALL_CHANNEL_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->source == channel[0]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, channel[1])) != NULL && AGS_RECALL_CHANNEL_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->source == channel[1]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, channel[2])) != NULL && AGS_RECALL_CHANNEL_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->source == channel[2]); }