/* GSequencer - Advanced GTK Sequencer
* Copyright (C) 2005-2019 Joël Krähemann
*
* This file is part of GSequencer.
*
* GSequencer is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GSequencer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GSequencer. If not, see .
*/
#include
#include
void ags_loop_channel_class_init(AgsLoopChannelClass *loop_channel);
void ags_loop_channel_init(AgsLoopChannel *loop_channel);
void ags_loop_channel_set_property(GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *param_spec);
void ags_loop_channel_get_property(GObject *gobject,
guint prop_id,
GValue *value,
GParamSpec *param_spec);
void ags_loop_channel_dispose(GObject *gobject);
void ags_loop_channel_finalize(GObject *gobject);
/**
* SECTION:ags_loop_channel
* @short_description: loops channel
* @title: AgsLoopChannel
* @section_id:
* @include: ags/audio/recall/ags_loop_channel.h
*
* The #AgsLoopChannel class provides ports to the effect processor.
*/
static gpointer ags_loop_channel_parent_class = NULL;
enum{
PROP_0,
PROP_DELAY_AUDIO,
};
GType
ags_loop_channel_get_type()
{
static volatile gsize g_define_type_id__volatile = 0;
if(g_once_init_enter (&g_define_type_id__volatile)){
GType ags_type_loop_channel = 0;
static const GTypeInfo ags_loop_channel_info = {
sizeof (AgsLoopChannelClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) ags_loop_channel_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (AgsLoopChannel),
0, /* n_preallocs */
(GInstanceInitFunc) ags_loop_channel_init,
};
ags_type_loop_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL,
"AgsLoopChannel",
&ags_loop_channel_info,
0);
g_once_init_leave(&g_define_type_id__volatile, ags_type_loop_channel);
}
return g_define_type_id__volatile;
}
void
ags_loop_channel_class_init(AgsLoopChannelClass *loop_channel)
{
GObjectClass *gobject;
AgsRecallClass *recall;
GParamSpec *param_spec;
ags_loop_channel_parent_class = g_type_class_peek_parent(loop_channel);
/* GObjectClass */
gobject = (GObjectClass *) loop_channel;
gobject->set_property = ags_loop_channel_set_property;
gobject->get_property = ags_loop_channel_get_property;
gobject->dispose = ags_loop_channel_dispose;
gobject->finalize = ags_loop_channel_finalize;
/* properties */
/**
* AgsLoopChannel:delay-audio:
*
* The assigned #AgsDelayAudio.
*
* Since: 3.0.0
*/
param_spec = g_param_spec_object("delay-audio",
"assigned delay audio",
"The delay audio it is assigned with",
AGS_TYPE_DELAY_AUDIO,
G_PARAM_READABLE | G_PARAM_WRITABLE);
g_object_class_install_property(gobject,
PROP_DELAY_AUDIO,
param_spec);
}
void
ags_loop_channel_init(AgsLoopChannel *loop_channel)
{
AGS_RECALL(loop_channel)->name = "ags-loop";
AGS_RECALL(loop_channel)->version = AGS_RECALL_DEFAULT_VERSION;
AGS_RECALL(loop_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID;
AGS_RECALL(loop_channel)->xml_type = "ags-loop-channel";
loop_channel->delay_audio = NULL;
}
void
ags_loop_channel_set_property(GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *param_spec)
{
AgsLoopChannel *loop_channel;
GRecMutex *recall_mutex;
loop_channel = AGS_LOOP_CHANNEL(gobject);
/* get recall mutex */
recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(loop_channel);
switch(prop_id){
case PROP_DELAY_AUDIO:
{
AgsDelayAudio *delay_audio;
delay_audio = (AgsDelayAudio *) g_value_get_object(value);
g_rec_mutex_lock(recall_mutex);
if(loop_channel->delay_audio == delay_audio){
g_rec_mutex_unlock(recall_mutex);
return;
}
if(loop_channel->delay_audio != NULL){
g_object_unref(G_OBJECT(loop_channel->delay_audio));
}
if(delay_audio != NULL){
g_object_ref(G_OBJECT(delay_audio));
}
loop_channel->delay_audio = delay_audio;
g_rec_mutex_unlock(recall_mutex);
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
break;
}
}
void
ags_loop_channel_get_property(GObject *gobject,
guint prop_id,
GValue *value,
GParamSpec *param_spec)
{
AgsLoopChannel *loop_channel;
GRecMutex *recall_mutex;
loop_channel = AGS_LOOP_CHANNEL(gobject);
/* get recall mutex */
recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(loop_channel);
switch(prop_id){
case PROP_DELAY_AUDIO:
{
g_rec_mutex_lock(recall_mutex);
g_value_set_object(value, loop_channel->delay_audio);
g_rec_mutex_unlock(recall_mutex);
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
break;
}
}
void
ags_loop_channel_dispose(GObject *gobject)
{
AgsLoopChannel *loop_channel;
loop_channel = AGS_LOOP_CHANNEL(gobject);
/* delay audio */
if(loop_channel->delay_audio != NULL){
g_object_unref(G_OBJECT(loop_channel->delay_audio));
loop_channel->delay_audio = NULL;
}
/* call parent */
G_OBJECT_CLASS(ags_loop_channel_parent_class)->dispose(gobject);
}
void
ags_loop_channel_finalize(GObject *gobject)
{
AgsLoopChannel *loop_channel;
loop_channel = AGS_LOOP_CHANNEL(gobject);
/* delay audio */
if(loop_channel->delay_audio != NULL){
g_object_unref(G_OBJECT(loop_channel->delay_audio));
}
/* call parent */
G_OBJECT_CLASS(ags_loop_channel_parent_class)->finalize(gobject);
}
/**
* ags_loop_channel_new:
* @source: the #AgsChannel
*
* Create a new instance of #AgsLoopChannel
*
* Returns: the new #AgsLoopChannel
*
* Since: 3.0.0
*/
AgsLoopChannel*
ags_loop_channel_new(AgsChannel *source)
{
AgsLoopChannel *loop_channel;
loop_channel = (AgsLoopChannel *) g_object_new(AGS_TYPE_LOOP_CHANNEL,
"source", source,
NULL);
return(loop_channel);
}