GList*
ags_copy_pattern_channel_template_find_source_and_destination(GList *recall,
							      AgsChannel *destination,
							      AgsChannel *source)
{
  AgsCopyPatternChannel *copy_pattern_channel;

  while(recall != NULL){
    recall = ags_recall_template_find_type(recall, AGS_TYPE_COPY_PATTERN_CHANNEL);

    if(recall == NULL)
      break;

    copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(recall->data);

    if(AGS_RECALL_CHANNEL(copy_pattern_channel)->destination == destination &&
       AGS_RECALL_CHANNEL(copy_pattern_channel)->source == source)
      break;

    recall = recall->next;
  }

  return(recall);
}
void
ags_panel_input_line_map_recall(AgsLine *line,
				guint output_pad_start)
{
  AgsPanel *panel;
  AgsPanelInputLine *panel_input_line;

  AgsAudio *audio;
  AgsChannel *source;
  AgsChannel *current;
  AgsPlayChannel *play_channel;
  AgsPlayChannelRunMaster *play_channel_run;

  GList *list;

  if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0 ||
     (AGS_LINE_PREMAPPED_RECALL & (line->flags)) != 0){
    return;
  }
  
  panel_input_line = AGS_PANEL_INPUT_LINE(line);

  audio = AGS_AUDIO(line->channel->audio);

  panel = AGS_PANEL(audio->machine_widget);

  source = line->channel;

  /* ags-play */
  ags_recall_factory_create(audio,
			    NULL, NULL,
			    "ags-play-master\0",
			    source->audio_channel, source->audio_channel + 1,
			    source->pad, source->pad + 1,
			    (AGS_RECALL_FACTORY_INPUT,
			     AGS_RECALL_FACTORY_PLAY |
			     AGS_RECALL_FACTORY_ADD),
			    0);

  /* set audio channel */
  list = source->play;

  while((list = ags_recall_template_find_type(list,
					      AGS_TYPE_PLAY_CHANNEL)) != NULL){
    GValue audio_channel_value = {0,};

    play_channel = AGS_PLAY_CHANNEL(list->data);

    g_value_init(&audio_channel_value, G_TYPE_UINT64);
    g_value_set_uint64(&audio_channel_value,
		       source->audio_channel);
    ags_port_safe_write(play_channel->audio_channel,
			&audio_channel_value);

    list = list->next;
  }

  /* call parent */
  AGS_LINE_CLASS(ags_panel_input_line_parent_class)->map_recall(line,
								output_pad_start);
}
void
ags_osc_renew_controller_test_set_data()
{
  AgsChannel *channel;
  
  AgsOscConnection *osc_connection;

  AgsOscRenewController *osc_renew_controller;

  GList *osc_response;

  unsigned char *message;
  unsigned char *magnitude_message;

  gdouble *magnitude_buffer;
  
  guint magnitude_message_size;
  guint cache_buffer_size;
  guint length;
  guint padding;
  guint i, j;
  gboolean success;
  
  GValue value = {0,};
  
  static const unsigned char *mute_message = "/renew\x00\x00,sf\x00/AgsSoundProvider/AgsAudio[\"test-panel\"]/AgsInput[0-1]/AgsMuteChannel[0]/AgsPort[\"./muted[0]\"]:value\x00\x00\x00\x00\x00\x00";
  static const unsigned char *magnitude_path = "/AgsSoundProvider/AgsAudio[\"test-spectrometer\"]/AgsInput[0-1]/AgsAnalyseChannel[0]/AgsPort[\"./magnitude-buffer[0]\"]:value";

  static const guint mute_message_size = 120;
  
  osc_connection = ags_osc_connection_new(NULL);
  
  osc_renew_controller = ags_osc_renew_controller_new();

  /* panel */
  message = (unsigned char *) malloc(mute_message_size * sizeof(unsigned char));
  memcpy(message, mute_message, mute_message_size * sizeof(unsigned char));

  ags_osc_buffer_util_put_float(message + mute_message_size - 4,
				1.0);
  
  g_value_init(&value,
	       G_TYPE_FLOAT);

  g_object_get(panel,
	       "input", &channel,
	       NULL);
  success = TRUE;

  for(i = 0; i < 2 && success; i++){
    GList *start_play, *play;
    GList *start_port, *port;

    g_object_get(channel,
		 "play", &start_play,
		 NULL);

    play = ags_recall_template_find_type(start_play,
					 AGS_TYPE_MUTE_CHANNEL);

    g_object_get(play->data,
		 "port", &start_port,
		 NULL);

    port = ags_port_find_specifier(start_port,
				   "./muted[0]");

    ags_port_safe_read(port->data,
		       &value);

    if(g_value_get_float(&value) == 1.0){
      success = FALSE;

      break;
    }
    
    g_object_get(channel,
		 "next", &channel,
		 NULL);
  }
  
  CU_ASSERT(success);
  
  osc_response = ags_osc_renew_controller_set_data(osc_renew_controller,
						   osc_connection,
						   message, mute_message_size);

  CU_ASSERT(osc_response != NULL);
  
  g_object_get(panel,
	       "input", &channel,
	       NULL);
  success = TRUE;

  for(i = 0; i < 2 && success; i++){
    GList *start_play, *play;
    GList *start_port, *port;

    g_object_get(channel,
		 "play", &start_play,
		 NULL);

    play = ags_recall_template_find_type(start_play,
					 AGS_TYPE_MUTE_CHANNEL);

    g_object_get(play->data,
		 "port", &start_port,
		 NULL);

    port = ags_port_find_specifier(start_port,
				   "./muted[0]");

    ags_port_safe_read(port->data,
		       &value);

    if(g_value_get_float(&value) != 1.0){
      success = FALSE;

      break;
    }
    
    g_object_get(channel,
		 "next", &channel,
		 NULL);
  }
  
  CU_ASSERT(success);

  /* spectrometer */
  magnitude_message = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char));

  cache_buffer_size = ags_soundcard_helper_config_get_buffer_size(ags_config_get_instance()) / 2;

  memcpy(magnitude_message, "/renew\x00\x00,s[", 11 * sizeof(unsigned char));
  magnitude_message_size = 11;

  for(i = 0; i < cache_buffer_size; i++){
    magnitude_message[11 + i] = 'd';
  }

  magnitude_message[11 + i] = ']';
  magnitude_message_size += (cache_buffer_size + 1);

  padding = (4 * (guint) ceil((cache_buffer_size + 5) / 4.0)) - (cache_buffer_size + 4);

  for(i = 0; i < padding; i++){
    magnitude_message[magnitude_message_size + i] = '\x00';
  }

  magnitude_message_size += padding;

  length = strlen(magnitude_path);
  memcpy(magnitude_message + magnitude_message_size, magnitude_path, (length) * sizeof(unsigned char));

  padding = (4 * (guint) ceil((length + 1) / 4.0)) - length;

  magnitude_message_size += length;
  
  for(i = 0; i < padding; i++){
    magnitude_message[magnitude_message_size + i] = '\x00';
  }
  
  magnitude_message_size += padding;
  
  for(i = 0; i < cache_buffer_size; i++){
    ags_osc_buffer_util_put_double(magnitude_message + magnitude_message_size + (i * 8),
				   4.0);
  }

  magnitude_message_size += (cache_buffer_size * 8);

  g_value_unset(&value);
  g_value_init(&value,
	       G_TYPE_POINTER);

  magnitude_buffer = (gdouble *) malloc(cache_buffer_size * sizeof(gdouble));
  g_value_set_pointer(&value,
		      magnitude_buffer);
  
  g_object_get(spectrometer,
	       "input", &channel,
	       NULL);
  success = TRUE;

  for(i = 0; i < 2 && success; i++){
    GList *start_play, *play;
    GList *start_port, *port;
    
    g_object_get(channel,
		 "play", &start_play,
		 NULL);

    play = ags_recall_template_find_type(start_play,
					 AGS_TYPE_ANALYSE_CHANNEL);

    g_object_get(play->data,
		 "port", &start_port,
		 NULL);

    port = ags_port_find_specifier(start_port,
				   "./magnitude-buffer[0]");
    
    ags_port_safe_read(port->data,
		       &value);

    for(j = 0; j < cache_buffer_size; j++){
      if(magnitude_buffer[j] != 0.0){
	success = FALSE;

	break;
      }
    }
    
    g_object_get(channel,
		 "next", &channel,
		 NULL);
  }
  
  CU_ASSERT(success);
  
  osc_response = ags_osc_renew_controller_set_data(osc_renew_controller,
						   osc_connection,
						   magnitude_message, magnitude_message_size);
  
  g_object_get(spectrometer,
	       "input", &channel,
	       NULL);
  success = TRUE;

  for(i = 0; i < 2 && success; i++){
    GList *start_play, *play;
    GList *start_port, *port;

    g_object_get(channel,
		 "play", &start_play,
		 NULL);

    play = ags_recall_template_find_type(start_play,
					 AGS_TYPE_ANALYSE_CHANNEL);

    g_object_get(play->data,
		 "port", &start_port,
		 NULL);

    port = ags_port_find_specifier(start_port,
				   "./magnitude-buffer[0]");

    ags_port_safe_read(port->data,
		       &value);

    for(j = 0; j < cache_buffer_size; j++){
      if(magnitude_buffer[j] != 4.0){
	success = FALSE;
	
	break;
      }
    }
    
    g_object_get(channel,
		 "next", &channel,
		 NULL);
  }
  
  CU_ASSERT(success);
}
Ejemplo n.º 4
0
void
ags_matrix_map_recall(AgsMachine *machine)
{
  AgsMatrix *matrix;

  AgsAudio *audio;
  AgsChannel *channel;
  AgsPattern *pattern;

  AgsDelayAudio *play_delay_audio;
  AgsDelayAudioRun *play_delay_audio_run;
  AgsCountBeatsAudio *play_count_beats_audio;
  AgsCountBeatsAudioRun *play_count_beats_audio_run;
  AgsCopyPatternAudio *recall_copy_pattern_audio;
  AgsCopyPatternAudioRun *recall_copy_pattern_audio_run;
  AgsPlayNotationAudio  *play_notation;
  AgsCopyPatternChannel *copy_pattern_channel;

  GList *notation;
  GList *list;

  guint i, j;

  GValue value = {0,};

  if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 ||
     (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){
    return;
  }

  audio = machine->audio;
  matrix = AGS_MATRIX(machine);

  /* ags-delay */
  ags_recall_factory_create(audio,
			    NULL, NULL,
			    "ags-delay\0",
			    0, 0,
			    0, 0,
			    (AGS_RECALL_FACTORY_OUTPUT |
			     AGS_RECALL_FACTORY_ADD |
			     AGS_RECALL_FACTORY_PLAY),
			    0);

  list = ags_recall_find_type(audio->play, AGS_TYPE_DELAY_AUDIO_RUN);

  if(list != NULL){
    play_delay_audio_run = AGS_DELAY_AUDIO_RUN(list->data);
    //    AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT;
  }
  
  /* ags-count-beats */
  ags_recall_factory_create(audio,
			    NULL, NULL,
			    "ags-count-beats\0",
			    0, 0,
			    0, 0,
			    (AGS_RECALL_FACTORY_OUTPUT |
			     AGS_RECALL_FACTORY_ADD |
			     AGS_RECALL_FACTORY_PLAY),
			    0);
  
  list = ags_recall_find_type(audio->play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN);

  if(list != NULL){
    play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(list->data);

    /* set dependency */  
    g_object_set(G_OBJECT(play_count_beats_audio_run),
		 "delay-audio-run\0", play_delay_audio_run,
		 NULL);
  }

  /* ags-copy-pattern */
  ags_recall_factory_create(audio,
			    NULL, NULL,
			    "ags-copy-pattern\0",
			    0, audio->audio_channels,
			    0, audio->input_lines,
			    (AGS_RECALL_FACTORY_INPUT |
			     AGS_RECALL_FACTORY_ADD |
			     AGS_RECALL_FACTORY_RECALL),
			    0);

  list = ags_recall_find_type(audio->recall, AGS_TYPE_COPY_PATTERN_AUDIO_RUN);

  if(list != NULL){
    recall_copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(list->data);

    /* set dependency */
    g_object_set(G_OBJECT(recall_copy_pattern_audio_run),
		 "delay-audio-run\0", play_delay_audio_run,
		 "count-beats-audio-run\0", play_count_beats_audio_run,
		 NULL);

  }

  /* set pattern object on port */
  channel = ags_channel_pad_nth(audio->input, 0);
      
  for(i = 0; i < audio->input_pads; i++){
    for(j = 0; j < audio->audio_channels; j++){
      list = ags_recall_template_find_type(channel->recall, AGS_TYPE_COPY_PATTERN_CHANNEL);
      copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(list->data);

      list = channel->pattern;
      pattern = AGS_PATTERN(list->data);

      copy_pattern_channel->pattern->port_value.ags_port_object = (GObject *) pattern;
	  
      ags_portlet_set_port(AGS_PORTLET(pattern), copy_pattern_channel->pattern);
	  
      channel = channel->next;
    }
  }

  /*  */
  list = audio->recall;

  while((list = ags_recall_find_type(list,
				     AGS_TYPE_PLAY_NOTATION_AUDIO)) != NULL){
    play_notation = AGS_PLAY_NOTATION_AUDIO(list->data);

    ags_port_safe_read(play_notation->notation,
		       &value);

    if(g_value_get_object(&value) == NULL){
      notation = audio->notation;
	
      while(notation != NULL){
	g_object_set(G_OBJECT(play_notation),
		     "notation\0", notation->data,
		     NULL);
	
	notation = notation->next;
      }
    }
	
    list = list->next;
  }


  /* depending on destination */
  ags_matrix_input_map_recall(matrix, 0);

  /* depending on destination */
  ags_matrix_output_map_recall(matrix, 0);

  AGS_MACHINE_CLASS(ags_matrix_parent_class)->map_recall(machine);
}