void ags_stream_audio_signal_run_init_pre(AgsRecall *recall) { void (*parent_class_run_init_pre)(AgsRecall *recall); /* get parent class */ pthread_mutex_lock(ags_recall_get_class_mutex()); parent_class_run_init_pre = AGS_RECALL_CLASS(ags_stream_audio_signal_parent_class)->run_init_pre; pthread_mutex_unlock(ags_recall_get_class_mutex()); /* call parent */ parent_class_run_init_pre(recall); AGS_STREAM_AUDIO_SIGNAL(recall)->dispose_source = (GObject *) AGS_RECALL_AUDIO_SIGNAL(recall)->source; }
void ags_stream_audio_signal_finalize(GObject *gobject) { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) AGS_STREAM_AUDIO_SIGNAL(gobject)->dispose_source; if(audio_signal != NULL){ AgsRecycling *recycling; AgsDestroyWorker *destroy_worker; recycling = (AgsRecycling *) audio_signal->recycling; #ifdef AGS_DEBUG g_message("%d %x -> %x", g_atomic_int_get(&(G_OBJECT(audio_signal)->ref_count)), audio_signal, AGS_RECALL_ID(audio_signal->recall_id)->recycling_context->parent); #endif if(recycling != NULL){ ags_recycling_remove_audio_signal(recycling, audio_signal); } if(TRUE){ destroy_worker = ags_destroy_worker_get_instance(); ags_destroy_worker_add(destroy_worker, audio_signal, ags_destroy_util_dispose_and_unref); }else{ g_object_run_dispose(audio_signal); g_object_unref(audio_signal); } } /* call parent */ G_OBJECT_CLASS(ags_stream_audio_signal_parent_class)->finalize(gobject); }
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); } }