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)); } } }
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)); }