void ags_open_single_file_launch(AgsTask *task) { AgsOpenSingleFile *open_single_file; AgsChannel *channel; AgsAudioSignal *old_template; AgsAudioFile *audio_file; GList *audio_signal; guint i; GError *error; open_single_file = AGS_OPEN_SINGLE_FILE(task); /* open audio file and read audio signal */ audio_file = ags_audio_file_new(open_single_file->filename, open_single_file->devout, open_single_file->start_channel, open_single_file->audio_channels); ags_audio_file_open(audio_file); ags_audio_file_read_audio_signal(audio_file); /* iterate channels */ channel = open_single_file->channel; audio_signal = audio_file->audio_signal; for(i = 0; i < open_single_file->audio_channels; i++){ /* unset link */ if(channel->link != NULL){ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_warning(error->message); } } /* mark as template */ AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; /* old source */ old_template = ags_audio_signal_get_template(channel->first_recycling->audio_signal); /* add as template */ ags_recycling_add_audio_signal(channel->first_recycling, AGS_AUDIO_SIGNAL(audio_signal->data)); /* remove old template */ ags_recycling_remove_audio_signal(channel->first_recycling, old_template); /* iterate */ channel = channel->next; audio_signal = audio_signal->next; } g_object_unref(audio_file); }
void ags_open_file_launch(AgsTask *task) { AgsOpenFile *open_file; AgsAudio *audio; AgsChannel *channel, *iter; AgsAudioFile *audio_file; AgsFileLink *file_link; GSList *current; GList *audio_signal; gchar *current_filename; guint i, i_stop; GError *error; open_file = AGS_OPEN_FILE(task); audio = open_file->audio; current = open_file->filenames; i_stop = 0; if(open_file->overwrite_channels){ channel = audio->input; i_stop = audio->input_pads; } /* */ if(open_file->create_channels){ guint pads_old; i_stop = g_slist_length(open_file->filenames); pads_old = audio->input_pads; if(open_file->overwrite_channels){ if(i_stop > audio->input_pads){ ags_audio_set_pads(audio, AGS_TYPE_INPUT, i_stop); } channel = audio->input; }else{ ags_audio_set_pads(audio, AGS_TYPE_INPUT, audio->input_pads + i_stop); channel = ags_channel_pad_nth(audio->input, pads_old); } iter = ags_channel_pad_nth(audio->input, pads_old); while(iter != NULL){ ags_connectable_connect(AGS_CONNECTABLE(iter)); iter = iter->next; } } for(i = 0; i < i_stop && current != NULL; i++){ current_filename = (gchar *) current->data; audio_file = ags_audio_file_new((gchar *) current_filename, audio->soundcard, 0, open_file->audio->audio_channels); ags_audio_file_open(audio_file); ags_audio_file_read_audio_signal(audio_file); iter = channel; audio_signal = audio_file->audio_signal; while(iter != channel->next_pad && audio_signal != NULL){ file_link = g_object_new(AGS_TYPE_FILE_LINK, "filename\0", current_filename, NULL); g_object_set(G_OBJECT(iter), "file-link", file_link, NULL); AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; if(iter->link != NULL){ error = NULL; ags_channel_set_link(iter, NULL, &error); if(error != NULL){ g_warning(error->message); } } //TODO:JK: add mutex ags_recycling_add_audio_signal(iter->first_recycling, AGS_AUDIO_SIGNAL(audio_signal->data)); audio_signal = audio_signal->next; iter = iter->next; } channel = channel->next_pad; current = current->next; } }
void ags_audio_test_link_channel() { AgsChannel *channel, *link; AgsChannel *output, *first_channel; guint i; GError *error; /* audio - master */ test_link_channel.master = ags_audio_new(devout); test_link_channel.master->flags |= AGS_AUDIO_ASYNC; ags_audio_set_audio_channels(test_link_channel.master, AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.master, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.master, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_OUTPUT_PADS, 0); /* audio - slave 0 */ test_link_channel.slave_0 = ags_audio_new(devout); test_link_channel.slave_0->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_link_channel.slave_0, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.slave_0, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.slave_0, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_OUTPUT_PADS, 0); /* audio - slave 1 */ test_link_channel.slave_1 = ags_audio_new(devout); test_link_channel.slave_1->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_link_channel.slave_1, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.slave_1, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.slave_1, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_OUTPUT_PADS, 0); /* audio - slave 2 */ test_link_channel.slave_2 = ags_audio_new(devout); test_link_channel.slave_2->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_link_channel.slave_2, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.slave_2, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.slave_2, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_OUTPUT_PADS, 0); /* setup link master to slave_0 */ /* connect callback */ channel = test_link_channel.master->input; link = test_link_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ //TODO:JK: implement me /* g_signal_connect(G_OBJECT(channel), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.master); g_signal_connect(G_OBJECT(link), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.slave_0); */ channel = channel->next; link = link->next; } /* set link */ channel = test_link_channel.master->input; link = test_link_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* assert link set */ CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); /* check recycling */ CU_ASSERT(channel->first_recycling == link->first_recycling); CU_ASSERT(channel->last_recycling == link->last_recycling); /* iterate */ channel = channel->next; link = link->next; } /* check output recycling */ output = test_link_channel.master->output; first_channel = link = test_link_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == link->first_recycling); CU_ASSERT(output->last_recycling == link->last_recycling); } /* setup link master to slave_1 */ /* connect callback */ channel = ags_channel_pad_nth(test_link_channel.master->input, 1); link = test_link_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ //TODO:JK: implement me /* g_signal_connect(G_OBJECT(channel), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.master); g_signal_connect(G_OBJECT(link), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.slave_1); */ channel = channel->next; link = link->next; } /* set link */ channel = ags_channel_pad_nth(test_link_channel.master->input, 1); link = test_link_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* assert link set */ CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); /* check recycling */ CU_ASSERT(channel->first_recycling == link->first_recycling); CU_ASSERT(channel->last_recycling == link->last_recycling); /* iterate */ channel = channel->next; link = link->next; } /* check output recycling */ output = test_link_channel.master->output; first_channel = test_link_channel.slave_0->output; link = test_link_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == first_channel->first_recycling); CU_ASSERT(output->last_recycling == link->last_recycling); output = output->next; first_channel = first_channel->next; link = link->next; } /* setup link master to slave_2 */ /* connect callback */ channel = ags_channel_pad_nth(test_link_channel.master->input, 2); link = test_link_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ //TODO:JK: implement me /* g_signal_connect(G_OBJECT(channel), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.master); g_signal_connect(G_OBJECT(link), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.slave_2); */ channel = channel->next; link = link->next; } /* set link */ channel = ags_channel_pad_nth(test_link_channel.master->input, 2); link = test_link_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* assert link set */ CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); /* check recycling */ CU_ASSERT(channel->first_recycling == link->first_recycling); CU_ASSERT(channel->last_recycling == link->last_recycling); /* iterate */ channel = channel->next; link = link->next; } /* check output recycling */ output = test_link_channel.master->output; first_channel = test_link_channel.slave_0->output; link = test_link_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == first_channel->first_recycling); CU_ASSERT(output->last_recycling == link->last_recycling); output = output->next; first_channel = first_channel->next; link = link->next; } }
void ags_audio_test_finalize_linked_channel() { AgsChannel *channel, *link; AgsChannel *output, *current, *last_channel; guint i; GError *error; /* audio - master */ test_finalize_linked_channel.master = ags_audio_new(devout); test_finalize_linked_channel.master->flags |= AGS_AUDIO_ASYNC; ags_audio_set_audio_channels(test_finalize_linked_channel.master, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.master, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.master, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_OUTPUT_PADS, 0); /* audio - slave 0 */ test_finalize_linked_channel.slave_0 = ags_audio_new(devout); test_finalize_linked_channel.slave_0->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_finalize_linked_channel.slave_0, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_OUTPUT_PADS, 0); /* audio - slave 1 */ test_finalize_linked_channel.slave_1 = ags_audio_new(devout); test_finalize_linked_channel.slave_1->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_finalize_linked_channel.slave_1, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_OUTPUT_PADS, 0); /* audio - slave 2 */ test_finalize_linked_channel.slave_2 = ags_audio_new(devout); test_finalize_linked_channel.slave_2->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_finalize_linked_channel.slave_2, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_OUTPUT_PADS, 0); /* setup link master to slave_0 */ /* set link */ channel = test_finalize_linked_channel.master->input; link = test_finalize_linked_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* iterate */ channel = channel->next; link = link->next; } /* setup link master to slave_1 */ /* set link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 1); link = test_finalize_linked_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* iterate */ channel = channel->next; link = link->next; } /* setup link master to slave_2 */ /* set link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 2); link = test_finalize_linked_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* iterate */ channel = channel->next; link = link->next; } /* asserts */ /* unset link */ channel = test_finalize_linked_channel.master->input; ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_OUTPUT, 0, 0); g_object_unref(test_finalize_linked_channel.slave_0); for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* assert link set */ CU_ASSERT(channel->link == NULL); /* check recycling */ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); /* iterate */ channel = channel->next; } /* check output recycling */ output = test_finalize_linked_channel.master->output; current = test_finalize_linked_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == current->first_recycling); output = output->next; current = current->next; } output = test_finalize_linked_channel.master->output; last_channel = test_finalize_linked_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS; i++){ CU_ASSERT(output->last_recycling == last_channel->last_recycling); output = output->next; last_channel = last_channel->next; } /* unset link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 1); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_OUTPUT, 0, 0); g_object_unref(test_finalize_linked_channel.slave_1); for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* assert link set */ CU_ASSERT(channel->link == NULL); /* check recycling */ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); /* iterate */ channel = channel->next; } /* check output recycling */ output = test_finalize_linked_channel.master->output; last_channel = test_finalize_linked_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* check recycling */ CU_ASSERT(output->first_recycling == last_channel->first_recycling); CU_ASSERT(output->last_recycling == last_channel->last_recycling); output = output->next; last_channel = last_channel->next; } /* unset link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 2); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_OUTPUT, 0, 0); g_object_unref(test_finalize_linked_channel.slave_2); for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* assert link unset */ CU_ASSERT(channel->link == NULL); /* check recycling */ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); /* iterate */ channel = channel->next; } /* check output recycling */ output = test_finalize_linked_channel.master->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == NULL); CU_ASSERT(output->last_recycling == NULL); output = output->next; } }