Пример #1
0
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);
}
Пример #2
0
/**
 * 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);
}
Пример #3
0
void
ags_play_channel_run_run_post(AgsRecall *recall)
{
  AgsStreamChannelRun *stream_channel_run;
  AgsChannel *source;
  GList *list;
  GList *recall_recycling_list, *recall_audio_signal_list;
  gboolean found;

  AGS_RECALL_CLASS(ags_play_channel_run_parent_class)->run_post(recall);

  if((AGS_PLAY_CHANNEL_RUN_INITIAL_RUN & (AGS_PLAY_CHANNEL_RUN(recall)->flags)) == 0){
    return;
  }

  AGS_PLAY_CHANNEL_RUN(recall)->flags &= (~AGS_PLAY_CHANNEL_RUN_INITIAL_RUN);

  /* connect done */
  source = AGS_RECALL_CHANNEL_RUN(recall)->source;
  found = FALSE;

  list = ags_recall_find_type_with_recycling_container(source->play,
						       AGS_TYPE_STREAM_CHANNEL_RUN,
						       recall->recall_id->recycling_container);
  stream_channel_run = AGS_STREAM_CHANNEL_RUN(list->data);
  
  recall_recycling_list = AGS_RECALL(stream_channel_run)->children;

  while(recall_recycling_list != NULL){
    recall_audio_signal_list = AGS_RECALL(recall_recycling_list->data)->children;
      
    while(recall_audio_signal_list != NULL){
      found = TRUE;
      g_signal_connect_after(G_OBJECT(recall_audio_signal_list->data), "done\0",
			     G_CALLBACK(ags_play_channel_run_stream_audio_signal_done_callback), recall);


      recall_audio_signal_list = recall_audio_signal_list->next;
    }

    recall_recycling_list = recall_recycling_list->next;
  }

  if(!found){
    ags_play_channel_run_stop(recall);
  }
}
Пример #4
0
void
ags_play_audio_signal_run_inter(AgsRecall *recall)
{
  AgsDevout *devout;
  AgsRecycling *recycling;
  AgsAudioSignal *source;
  AgsPlayChannel *play_channel;
  AgsPlayAudioSignal *play_audio_signal;
  GList *stream;
  signed short *buffer0, *buffer1;
  guint audio_channel;
  gboolean muted;
  GValue muted_value = {0,};
  GValue audio_channel_value = {0,};

  play_audio_signal = AGS_PLAY_AUDIO_SIGNAL(recall);

  devout = AGS_DEVOUT(AGS_RECALL(play_audio_signal)->devout);
  source = AGS_AUDIO_SIGNAL(AGS_RECALL_AUDIO_SIGNAL(play_audio_signal)->source);
  stream = source->stream_current;

  if(devout == NULL){
    g_warning("no devout\0");
    return;
  }

  if(stream == NULL){
    ags_recall_done(recall);

    return;
  }

  if((AGS_DEVOUT_BUFFER0 & devout->flags) != 0){
    buffer0 = devout->buffer[1];
    buffer1 = devout->buffer[2];
  }else if((AGS_DEVOUT_BUFFER1 & devout->flags) != 0){
    buffer0 = devout->buffer[2];
    buffer1 = devout->buffer[3];
  }else if((AGS_DEVOUT_BUFFER2 & devout->flags) != 0){
    buffer0 = devout->buffer[3];
    buffer1 = devout->buffer[0];
  }else if((AGS_DEVOUT_BUFFER3 & devout->flags) != 0){
    buffer0 = devout->buffer[0];
    buffer1 = devout->buffer[1];
  }else{
    g_warning("no output buffer\0");
    return;
  }

  play_channel = AGS_PLAY_CHANNEL(AGS_RECALL_CHANNEL_RUN(recall->parent->parent)->recall_channel);

  g_value_init(&muted_value, G_TYPE_BOOLEAN);
  ags_port_safe_read(play_channel->muted,
		     &muted_value);

  muted = g_value_get_boolean(&muted_value);

  if(muted){
    return;
  }

  g_value_init(&audio_channel_value, G_TYPE_UINT);
  ags_port_safe_read(play_channel->audio_channel,
		     &audio_channel_value);

  audio_channel = g_value_get_uint(&audio_channel_value);

  if((AGS_RECALL_INITIAL_RUN & (AGS_RECALL_AUDIO_SIGNAL(recall)->flags)) != 0){
    AGS_RECALL_AUDIO_SIGNAL(recall)->flags &= (~AGS_RECALL_INITIAL_RUN);
    ags_audio_signal_copy_buffer_to_buffer(&(buffer0[audio_channel + source->attack * devout->pcm_channels]),
					   devout->pcm_channels,
					   (signed short *) stream->data, 1,
					   AGS_DEVOUT_DEFAULT_BUFFER_SIZE - source->attack);
  }else{
    ags_audio_signal_copy_buffer_to_buffer(&(buffer0[audio_channel]), devout->pcm_channels,
					   (signed short *) stream->data, 1,
					   devout->buffer_size);
  }

  /* call parent */
  AGS_RECALL_CLASS(ags_play_audio_signal_parent_class)->run_inter(recall);
}
Пример #5
0
void
ags_stream_audio_signal_run_post(AgsRecall *recall)
{
  AgsStreamChannel *stream_channel;
  AgsStreamChannelRun *stream_channel_run;
  AgsStreamAudioSignal *stream_audio_signal;

  stream_audio_signal = AGS_STREAM_AUDIO_SIGNAL(recall);
  
  if(recall->parent != NULL &&
     recall->parent->parent != NULL){
    stream_channel_run = recall->parent->parent;
    stream_channel = AGS_RECALL_CHANNEL_RUN(stream_channel_run)->recall_channel;
  }else{
    stream_channel_run = NULL;
    stream_channel = NULL;
  }
  
  if(AGS_RECALL_AUDIO_SIGNAL(recall)->source->stream_current != NULL){
    if(stream_channel != NULL &&
       AGS_RECALL_AUDIO_SIGNAL(recall)->source->stream_current->next == NULL){
      GValue value = {0,};
      
      g_value_init(&value, G_TYPE_BOOLEAN);
      ags_port_safe_read(stream_channel->auto_sense,
			 &value);

      if(g_value_get_boolean(&value)){
	signed short *buffer;
	guint buffer_size;
	guint i;
	gboolean add_stream;

	buffer = AGS_RECALL_AUDIO_SIGNAL(recall)->source->stream_current->data;
	
	buffer_size = AGS_RECALL_AUDIO_SIGNAL(recall)->source->buffer_size;
	add_stream = FALSE;
	
	for(i = buffer_size - 1; i > buffer_size / 2; i--){
	  if(buffer[i] != 0){
	    add_stream = TRUE;
	    break;
	  }
	}
	
	if(add_stream){
	  ags_audio_signal_add_stream(AGS_RECALL_AUDIO_SIGNAL(recall)->source);
	}
      }
    }
    
    AGS_RECALL_AUDIO_SIGNAL(recall)->source->stream_current = AGS_RECALL_AUDIO_SIGNAL(recall)->source->stream_current->next;

    /* call parent */
    AGS_RECALL_CLASS(ags_stream_audio_signal_parent_class)->run_post(recall);
  }else{
    /* call parent */
    AGS_RECALL_CLASS(ags_stream_audio_signal_parent_class)->run_post(recall);

    if(recall->parent != NULL){
      ags_recycling_remove_audio_signal(AGS_RECALL_RECYCLING(recall->parent)->source,
					AGS_RECALL_AUDIO_SIGNAL(recall)->source);
    }

    ags_recall_done(recall);
  }
}
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]);
}
Пример #7
0
  AgsChannel *channel;
  AgsRecall *template;
  AgsLoopChannelRun *loop_channel_run;
  AgsRecallDependency *recall_dependency;
  AgsCountBeatsAudioRun *count_beats_audio_run;
  GList *list;
  AgsRecallID *recall_id;
  guint i, i_stop;

  loop_channel_run = AGS_LOOP_CHANNEL_RUN(recall);

  template = AGS_RECALL(ags_recall_find_template(AGS_RECALL_CONTAINER(recall->container)->recall_channel_run)->data);

  list = template->dependencies;

  channel = AGS_RECALL_CHANNEL_RUN(loop_channel_run)->source;
  audio = AGS_AUDIO(channel->audio);

  recall_id = recall->recall_id;

  count_beats_audio_run = NULL;
  i_stop = 1;

  for(i = 0; i < i_stop && list != NULL;){
    recall_dependency = AGS_RECALL_DEPENDENCY(list->data);

    if(AGS_IS_COUNT_BEATS_AUDIO_RUN(recall_dependency->dependency)){
      count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id);

      i++;
    }