void ags_recycling_test_remove_audio_signal() { AgsRecycling *recycling; AgsAudioSignal *audio_signal; /* instantiate recycling */ recycling = ags_recycling_new(G_OBJECT(devout)); /* instantiate audio signal */ audio_signal = ags_audio_signal_new(G_OBJECT(devout), recycling, NULL); /* add audio signal */ ags_recycling_add_audio_signal(recycling, audio_signal); /* assert if audio signal available in recycling */ CU_ASSERT(g_list_find(recycling->audio_signal, audio_signal) != NULL); /* add audio signal */ ags_recycling_remove_audio_signal(recycling, audio_signal); /* assert if no audio signal in recycling */ CU_ASSERT(g_list_find(recycling->audio_signal, audio_signal) == NULL); }
void ags_play_channel_run_run_pre(AgsRecall *recall) { AgsChannel *source; AgsDevout *devout; AgsRecycling *recycling; AgsAudioSignal *audio_signal; gdouble delay; guint attack; guint tic_counter_incr; devout = AGS_DEVOUT(recall->devout); // g_message("ags_copy_pattern_channel_run_sequencer_alloc_callback - playing channel: %u; playing pattern: %u\0", // AGS_RECALL_CHANNEL(copy_pattern_channel)->source->line, // copy_pattern_audio_run->count_beats_audio_run->sequencer_counter); /* get source */ source = AGS_RECALL_CHANNEL_RUN(recall)->source; /* create new audio signals */ recycling = source->first_recycling; tic_counter_incr = devout->tic_counter + 1; //TODO:JK: unclear attack = 0; //devout->attack[((tic_counter_incr == AGS_NOTATION_TICS_PER_BEAT) ? // 0: // tic_counter_incr)]; delay = 0.0; // devout->delay[((tic_counter_incr == AGS_NOTATION_TICS_PER_BEAT) ? // 0: // tic_counter_incr)]; if(recycling != NULL){ while(recycling != source->last_recycling->next){ audio_signal = ags_audio_signal_new((GObject *) recall->devout, (GObject *) recycling, (GObject *) recall->recall_id); ags_recycling_create_audio_signal_with_defaults(recycling, audio_signal, delay, attack); audio_signal->stream_current = audio_signal->stream_beginning; ags_audio_signal_connect(audio_signal); /* * emit add_audio_signal on AgsRecycling */ ags_recycling_add_audio_signal(recycling, audio_signal); /* */ recycling = recycling->next; } } /* call parent */ AGS_RECALL_CLASS(ags_play_channel_run_parent_class)->run_pre(recall); }
void ags_drum_output_line_set_channel(AgsLine *line, AgsChannel *channel) { AgsDrumOutputLine *drum_output_line; AGS_LINE_CLASS(ags_drum_output_line_parent_class)->set_channel(line, channel); drum_output_line = AGS_DRUM_OUTPUT_LINE(line); if(line->channel != NULL){ line->flags &= (~AGS_LINE_MAPPED_RECALL); } if(channel != NULL){ AgsDevout *devout; AgsAudioSignal *audio_signal; guint stop; devout = AGS_DEVOUT(AGS_AUDIO(channel->audio)->devout); stop = (guint) ceil(16.0 * AGS_DEVOUT_DEFAULT_DELAY * exp2(8.0 - 4.0) + 1.0); audio_signal = ags_audio_signal_new(devout, channel->first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; // ags_audio_signal_stream_resize(audio_signal, // stop); ags_recycling_add_audio_signal(channel->first_recycling, audio_signal); // audio_signal = ags_audio_signal_get_template(channel->first_recycling->audio_signal); // ags_audio_signal_stream_resize(audio_signal, stop); if((AGS_LINE_PREMAPPED_RECALL & (line->flags)) == 0){ ags_drum_output_line_add_default_recall(AGS_DRUM_OUTPUT_LINE(line)); } } }
/** * ags_output_map_audio_signal: * @output: an #AgsOutput * @recall_id: the assigned #AgsRecallID * * Maps audio signal and assigning it to recall id. * * Returns: a new #GList containing #AgsAudioSignal * * Since: 0.4 */ GList* ags_output_map_audio_signal(AgsOutput *output, AgsRecallID *recall_id) { AgsDevout *devout; AgsAudioSignal *audio_signal; GList *list_destination; if(output != NULL){ list_destination = g_list_alloc(); goto ags_copy_pattern_map_destination0; }else return(NULL); devout = AGS_DEVOUT(AGS_AUDIO(AGS_CHANNEL(output)->audio)->devout); while(output != NULL){ list_destination->next = g_list_alloc(); list_destination->next->prev = list_destination; list_destination = list_destination->next; ags_copy_pattern_map_destination0: g_message("ags_output_map_audio_signal\n\0"); audio_signal = ags_audio_signal_new((GObject *) devout, (GObject *) output->channel.first_recycling, (GObject *) recall_id); ags_connectable_connect(AGS_CONNECTABLE(audio_signal)); ags_recycling_add_audio_signal(output->channel.first_recycling, audio_signal); audio_signal->stream_current = audio_signal->stream_beginning; list_destination->data = (gpointer) audio_signal; output = (AgsOutput *) output->channel.next_pad; } return(list_destination); }
void ags_audiorec_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data) { AgsAudiorec *audiorec; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint audio_channels; audiorec = AGS_AUDIOREC(machine); audio = machine->audio; if(type == AGS_TYPE_INPUT){ if(pads > pads_old){ AgsHIndicator *hindicator; guint audio_channels; guint i; /* get some fields */ g_object_get(audio, "output", &start_output, "audio-channels", &audio_channels, NULL); /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_WAVE)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } if(start_output != NULL){ g_object_unref(start_output); } for(i = 0; i < audio_channels; i++){ hindicator = ags_hindicator_new(); gtk_box_pack_start((GtkBox *) audiorec->hindicator_vbox, (GtkWidget *) hindicator, FALSE, FALSE, 8); } gtk_widget_show_all((GtkWidget *) audiorec->hindicator_vbox); /* depending on destination */ ags_audiorec_input_map_recall(audiorec, pads_old); }else{ GList *list, *list_start; list_start = list = gtk_container_get_children((GtkContainer *) audiorec->hindicator_vbox); while(list != NULL){ gtk_widget_destroy((GtkWidget *) list->data); list = list->next; } g_list_free(list_start); audiorec->mapped_input_pad = pads; } }else{ if(pads > pads_old){ /* depending on destination */ ags_audiorec_output_map_recall(audiorec, pads_old); }else{ audiorec->mapped_output_pad = pads; } } }
void ags_audiorec_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudiorec *audiorec; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint output_pads, input_pads; audiorec = AGS_AUDIOREC(machine); audio = AGS_MACHINE(audiorec)->audio; g_object_get(audio, "input-pads", &input_pads, "output-pads", &output_pads, "output", &start_output, NULL); if(audio_channels > audio_channels_old){ AgsHIndicator *hindicator; guint i; /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_pad = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel), nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_WAVE)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } if(next_pad != NULL){ g_object_unref(next_pad); } if(input_pads > 0){ } if(output_pads > 0){ /* AgsOutput */ /* ags-play-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-wave", audio_channels_old, audio_channels, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-capture-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-capture-wave", audio_channels_old, audio_channels, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-peak */ ags_recall_factory_create(audio, NULL, NULL, "ags-peak", audio_channels, audio_channels_old, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } /* widgets */ for(i = audio_channels_old; i < audio_channels; i++){ hindicator = ags_hindicator_new(); gtk_box_pack_start((GtkBox *) audiorec->hindicator_vbox, (GtkWidget *) hindicator, FALSE, FALSE, 8); } gtk_widget_show_all((GtkWidget *) audiorec->hindicator_vbox); }else{ GList *list, *list_start; list_start = list = gtk_container_get_children((GtkContainer *) audiorec->hindicator_vbox); list = g_list_nth(list_start, audio_channels); while(list != NULL){ gtk_widget_destroy((GtkWidget *) list->data); list = list->next; } g_list_free(list_start); } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } }
void ags_envelope_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_ENVELOPE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_ENVELOPE_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_ENVELOPE_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_ENVELOPE_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_envelope_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_ENVELOPE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_ENVELOPE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); }
void ags_play_wave_channel_run_run_inter(AgsRecall *recall) { AgsAudio *audio; AgsChannel *channel; AgsWave *wave; AgsPort *port; AgsRecallID *recall_id; AgsPlayWaveAudio *play_wave_audio; AgsPlayWaveAudioRun *play_wave_audio_run; AgsPlayWaveChannel *play_wave_channel; AgsPlayWaveChannelRun *play_wave_channel_run; GObject *output_soundcard; GList *start_list, *list; guint line; guint samplerate; guint buffer_size; guint format; guint64 x_offset; guint64 x_point_offset; guint64 relative_offset; gdouble delay; guint frame_count; guint attack; gboolean do_playback; gboolean do_loop; GValue do_playback_value = {0,}; GValue do_loop_value = {0,}; GValue x_offset_value = {0,}; pthread_mutex_t *audio_mutex; pthread_mutex_t *channel_mutex; auto void ags_play_wave_channel_run_run_inter_add_audio_signal(); void ags_play_wave_channel_run_run_inter_add_audio_signal(){ AgsChannel *output; AgsRecycling *first_recycling; g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_unref(first_recycling); play_wave_channel_run->audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, (GObject *) recall_id); g_object_set(play_wave_channel_run->audio_signal, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); ags_audio_signal_stream_resize(play_wave_channel_run->audio_signal, 3); play_wave_channel_run->audio_signal->stream_current = play_wave_channel_run->audio_signal->stream; ags_recycling_add_audio_signal(first_recycling, play_wave_channel_run->audio_signal); ags_connectable_connect(AGS_CONNECTABLE(play_wave_channel_run->audio_signal)); }
void ags_matrix_set_pads(AgsAudio *audio, GType type, guint pads, guint pads_old, gpointer data) { AgsMachine *machine; AgsMatrix *matrix; AgsChannel *channel, *source; AgsAudioSignal *audio_signal; guint i, j; gboolean grow; GValue value = {0,}; if(pads == pads_old){ return; } matrix = (AgsMatrix *) audio->machine_widget; machine = AGS_MACHINE(matrix); if(type == AGS_TYPE_INPUT){ if(pads < AGS_MATRIX_OCTAVE){ gtk_widget_set_size_request((GtkWidget *) matrix->drawing_area, 32 * AGS_MATRIX_CELL_WIDTH +1, pads * AGS_MATRIX_CELL_HEIGHT +1); }else if(pads_old < AGS_MATRIX_OCTAVE){ gtk_widget_set_size_request((GtkWidget *) matrix->drawing_area, 32 * AGS_MATRIX_CELL_WIDTH +1, AGS_MATRIX_OCTAVE * AGS_MATRIX_CELL_HEIGHT +1); } } if(pads_old == pads) return; if(pads_old < pads) grow = TRUE; else grow = FALSE; if(type == AGS_TYPE_INPUT){ AgsPattern *pattern; GList *list, *notation; if(grow){ /* create pattern */ source = ags_channel_nth(audio->input, pads_old); while(source != NULL){ if(source->pattern == NULL){ source->pattern = g_list_alloc(); source->pattern->data = (gpointer) ags_pattern_new(); ags_pattern_set_dim((AgsPattern *) source->pattern->data, 1, 9, 32); } source = source->next; } if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_matrix_input_map_recall(matrix, pads_old); } }else{ } }else{ if(grow){ AgsChannel *current, *output; GList *recall; GList *list; guint stop; source = ags_channel_nth(audio->output, pads_old); if(source != NULL){ AgsAudioSignal *audio_signal; AgsSoundcard *soundcard; gdouble delay; guint stop; soundcard = AGS_SOUNDCARD(AGS_AUDIO(source->audio)->soundcard); delay = ags_soundcard_get_delay(soundcard); stop = (guint) ceil(16.0 * delay * exp2(8.0 - 4.0) + 1.0); audio_signal = ags_audio_signal_new(soundcard, source->first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; // ags_audio_signal_stream_resize(audio_signal, // stop); ags_recycling_add_audio_signal(source->first_recycling, audio_signal); if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_matrix_output_map_recall(matrix, pads_old); } } }else{ } } }