/** * ags_recycling_context_find: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to look up * * Find position of recycling within array. * * Returns: recycling array index * * Since: 2.0.0 */ gint ags_recycling_context_find(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { gint i; pthread_mutex_t *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return(-1); } /* get recycling context mutex */ pthread_mutex_lock(ags_recycling_context_get_class_mutex()); recycling_context_mutex = recycling_context->obj_mutex; pthread_mutex_unlock(ags_recycling_context_get_class_mutex()); /* find */ pthread_mutex_lock(recycling_context_mutex); for(i = 0; i < recycling_context->length; i++){ if(recycling_context->recycling[i] == recycling){ pthread_mutex_unlock(recycling_context_mutex); return(i); } } pthread_mutex_unlock(recycling_context_mutex); return(-1); }
/** * ags_recycling_context_find_parent: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to look up * * Find position of recycling within array. * * Returns: recycling array index * * Since: 2.0.0 */ gint ags_recycling_context_find_parent(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { AgsRecyclingContext *parent; gint i; pthread_mutex_t *recycling_context_mutex; pthread_mutex_t *parent_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return(-1); } /* get recycling context mutex */ pthread_mutex_lock(ags_recycling_context_get_class_mutex()); recycling_context_mutex = recycling_context->obj_mutex; pthread_mutex_unlock(ags_recycling_context_get_class_mutex()); /* get parent */ pthread_mutex_lock(recycling_context_mutex); parent = recycling_context->parent; pthread_mutex_unlock(recycling_context_mutex); if(parent != NULL){ /* get parent mutex */ pthread_mutex_lock(ags_recycling_context_get_class_mutex()); parent_mutex = parent->obj_mutex; pthread_mutex_unlock(ags_recycling_context_get_class_mutex()); /* find */ pthread_mutex_lock(parent_mutex); for(i = 0; i < parent->length; i++){ if(parent->recycling[i] == recycling){ pthread_mutex_unlock(parent_mutex); return(i); } } pthread_mutex_unlock(parent_mutex); } return(-1); }
/** * 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); }
/** * ags_recycling_context_find_child: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to look up * * Find position of recycling within arrays. * * Returns: recycling array index * * Since: 2.0.0 */ gint ags_recycling_context_find_child(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { GList *child_start, *child; gint i; pthread_mutex_t *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return(-1); } /* get recycling context mutex */ pthread_mutex_lock(ags_recycling_context_get_class_mutex()); recycling_context_mutex = recycling_context->obj_mutex; pthread_mutex_unlock(ags_recycling_context_get_class_mutex()); /* get child */ pthread_mutex_lock(recycling_context_mutex); child = child_start = g_list_copy(recycling_context->children); pthread_mutex_unlock(recycling_context_mutex); for(i = 0; child != NULL; i++){ if(ags_recycling_context_find(AGS_RECYCLING_CONTEXT(child->data), recycling) != -1){ g_list_free(child_start); return(i); } child = child->next; } g_list_free(child_start); return(-1); }
void ags_set_samplerate_launch(AgsTask *task) { AgsSetSamplerate *set_samplerate; GObject *gobject; set_samplerate = AGS_SET_SAMPLERATE(task); gobject = set_samplerate->gobject; if(AGS_IS_DEVOUT(gobject)){ ags_set_samplerate_devout(set_samplerate, AGS_DEVOUT(gobject)); }else if(AGS_IS_AUDIO(gobject)){ ags_set_samplerate_audio(set_samplerate, AGS_AUDIO(gobject)); }else if(AGS_IS_CHANNEL(gobject)){ ags_set_samplerate_channel(set_samplerate, AGS_CHANNEL(gobject)); }else if(AGS_IS_RECYCLING(gobject)){ ags_set_samplerate_recycling(set_samplerate, AGS_RECYCLING(gobject)); }else if(AGS_IS_AUDIO_SIGNAL(gobject)){ ags_set_samplerate_audio_signal(set_samplerate, AGS_AUDIO_SIGNAL(gobject)); } }
void ags_set_buffer_size_launch(AgsTask *task) { AgsSetBufferSize *set_buffer_size; GObject *gobject; set_buffer_size = AGS_SET_BUFFER_SIZE(task); gobject = set_buffer_size->gobject; if(AGS_IS_DEVOUT(gobject)){ ags_set_buffer_size_devout(set_buffer_size, AGS_DEVOUT(gobject)); }else if(AGS_IS_AUDIO(gobject)){ ags_set_buffer_size_audio(set_buffer_size, AGS_AUDIO(gobject)); }else if(AGS_IS_CHANNEL(gobject)){ ags_set_buffer_size_channel(set_buffer_size, AGS_CHANNEL(gobject)); }else if(AGS_IS_RECYCLING(gobject)){ ags_set_buffer_size_recycling(set_buffer_size, AGS_RECYCLING(gobject)); }else if(AGS_IS_AUDIO_SIGNAL(gobject)){ ags_set_buffer_size_audio_signal(set_buffer_size, AGS_AUDIO_SIGNAL(gobject)); } }
/** * ags_recycling_context_add: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to add * * Adds a recycling to a context. * * Since: 2.0.0 */ void ags_recycling_context_add(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { gint new_length; pthread_mutex_t *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return; } /* get recycling context mutex */ pthread_mutex_lock(ags_recycling_context_get_class_mutex()); recycling_context_mutex = recycling_context->obj_mutex; pthread_mutex_unlock(ags_recycling_context_get_class_mutex()); /* get some fields */ pthread_mutex_lock(recycling_context_mutex); new_length = recycling_context->length + 1; pthread_mutex_unlock(recycling_context_mutex); /* resize */ g_object_set(recycling_context, "length", (guint64) new_length, NULL); /* */ recycling_context->recycling[new_length - 1] = recycling; /* ref count */ g_object_ref(recycling); }
/** * ags_recycling_context_insert: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to insert * @position: the index to insert at * * Inserts a recycling to a context. * * Since: 2.0.0 */ void ags_recycling_context_insert(AgsRecyclingContext *recycling_context, AgsRecycling *recycling, gint position) { AgsRecycling **old_context; gint new_length; guint i, j; pthread_mutex_t *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return; } /* get recycling context mutex */ pthread_mutex_lock(ags_recycling_context_get_class_mutex()); recycling_context_mutex = recycling_context->obj_mutex; pthread_mutex_unlock(ags_recycling_context_get_class_mutex()); /* get some fields */ pthread_mutex_lock(recycling_context_mutex); if(recycling_context->length > 0){ old_context = (AgsRecycling **) malloc(recycling_context->length * sizeof(AgsRecycling *)); memcpy(old_context, recycling_context->recycling, recycling_context->length * sizeof(AgsRecycling *)); }else{ old_context = NULL; } new_length = recycling_context->length + 1; pthread_mutex_unlock(recycling_context_mutex); /* resize */ g_object_set(recycling_context, "length", (guint64) new_length, NULL); /* reset */ pthread_mutex_lock(recycling_context_mutex); for(i = 0, j = 0; i < new_length - 1; i++){ if(i != position){ recycling_context->recycling[i] = old_context[j]; j++; } } recycling_context->recycling[position] = recycling; pthread_mutex_unlock(recycling_context_mutex); /* ref count */ g_object_ref(recycling); if(old_context != NULL){ free(old_context); } }