1 /* GSequencer - Advanced GTK Sequencer
2  * Copyright (C) 2005-2019 Joël Krähemann
3  *
4  * This file is part of GSequencer.
5  *
6  * GSequencer is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSequencer is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <ags/audio/recall/ags_analyse_audio_signal.h>
21 
22 #include <ags/audio/ags_recall_channel_run.h>
23 
24 #include <ags/audio/recall/ags_analyse_channel.h>
25 #include <ags/audio/recall/ags_analyse_channel_run.h>
26 #include <ags/audio/recall/ags_analyse_recycling.h>
27 
28 #include <ags/i18n.h>
29 
30 void ags_analyse_audio_signal_class_init(AgsAnalyseAudioSignalClass *analyse_audio_signal);
31 void ags_analyse_audio_signal_init(AgsAnalyseAudioSignal *analyse_audio_signal);
32 void ags_analyse_audio_signal_finalize(GObject *gobject);
33 
34 void ags_analyse_audio_signal_run_inter(AgsRecall *recall);
35 
36 /**
37  * SECTION:ags_analyse_audio_signal
38  * @short_description: analyses audio signal
39  * @title: AgsAnalyseAudioSignal
40  * @section_id:
41  * @include: ags/audio/recall/ags_analyse_audio_signal.h
42  *
43  * The #AgsAnalyseAudioSignal class analyses the audio signal.
44  */
45 
46 static gpointer ags_analyse_audio_signal_parent_class = NULL;
47 
48 GType
ags_analyse_audio_signal_get_type()49 ags_analyse_audio_signal_get_type()
50 {
51   static volatile gsize g_define_type_id__volatile = 0;
52 
53   if(g_once_init_enter (&g_define_type_id__volatile)){
54     GType ags_type_analyse_audio_signal = 0;
55 
56     static const GTypeInfo ags_analyse_audio_signal_info = {
57       sizeof (AgsAnalyseAudioSignalClass),
58       NULL, /* base_init */
59       NULL, /* base_finalize */
60       (GClassInitFunc) ags_analyse_audio_signal_class_init,
61       NULL, /* class_finalize */
62       NULL, /* class_data */
63       sizeof (AgsAnalyseAudioSignal),
64       0,    /* n_preallocs */
65       (GInstanceInitFunc) ags_analyse_audio_signal_init,
66     };
67 
68     ags_type_analyse_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL,
69 							   "AgsAnalyseAudioSignal",
70 							   &ags_analyse_audio_signal_info,
71 							   0);
72 
73     g_once_init_leave(&g_define_type_id__volatile, ags_type_analyse_audio_signal);
74   }
75 
76   return g_define_type_id__volatile;
77 }
78 
79 void
ags_analyse_audio_signal_class_init(AgsAnalyseAudioSignalClass * analyse_audio_signal)80 ags_analyse_audio_signal_class_init(AgsAnalyseAudioSignalClass *analyse_audio_signal)
81 {
82   GObjectClass *gobject;
83   AgsRecallClass *recall;
84 
85   ags_analyse_audio_signal_parent_class = g_type_class_peek_parent(analyse_audio_signal);
86 
87   /* GObjectClass */
88   gobject = (GObjectClass *) analyse_audio_signal;
89 
90   gobject->finalize = ags_analyse_audio_signal_finalize;
91 
92   /* properties */
93 
94   /* AgsRecallClass */
95   recall = (AgsRecallClass *) analyse_audio_signal;
96 
97   recall->run_inter = ags_analyse_audio_signal_run_inter;
98 }
99 
100 void
ags_analyse_audio_signal_init(AgsAnalyseAudioSignal * analyse_audio_signal)101 ags_analyse_audio_signal_init(AgsAnalyseAudioSignal *analyse_audio_signal)
102 {
103   AGS_RECALL(analyse_audio_signal)->child_type = G_TYPE_NONE;
104 }
105 
106 void
ags_analyse_audio_signal_finalize(GObject * gobject)107 ags_analyse_audio_signal_finalize(GObject *gobject)
108 {
109   /* call parent */
110   G_OBJECT_CLASS(ags_analyse_audio_signal_parent_class)->finalize(gobject);
111 }
112 
113 void
ags_analyse_audio_signal_run_inter(AgsRecall * recall)114 ags_analyse_audio_signal_run_inter(AgsRecall *recall)
115 {
116   AgsAudioSignal *source;
117 
118   AgsAnalyseAudioSignal *analyse_audio_signal;
119 
120   void (*parent_class_run_inter)(AgsRecall *recall);
121 
122   analyse_audio_signal = AGS_ANALYSE_AUDIO_SIGNAL(recall);
123 
124   /* get parent class */
125   parent_class_run_inter = AGS_RECALL_CLASS(ags_analyse_audio_signal_parent_class)->run_inter;
126 
127   /* call parent */
128   parent_class_run_inter(recall);
129 
130   /* get some fields */
131   g_object_get(analyse_audio_signal,
132 	       "source", &source,
133 	       NULL);
134 
135   if(source->stream_current != NULL){
136     AgsAnalyseChannel *analyse_channel;
137     AgsAnalyseChannelRun *analyse_channel_run;
138     AgsAnalyseRecycling *analyse_recycling;
139 
140     guint samplerate;
141     guint buffer_size;
142     guint format;
143 
144     g_object_get(analyse_audio_signal,
145 		 "parent", &analyse_recycling,
146 		 NULL);
147 
148     g_object_get(analyse_recycling,
149 		 "parent", &analyse_channel_run,
150 		 NULL);
151 
152     g_object_get(analyse_channel_run,
153 		 "recall-channel", &analyse_channel,
154 		 NULL);
155 
156     g_object_get(source,
157 		 "samplerate", &samplerate,
158 		 "buffer-size", &buffer_size,
159 		 "format", &format,
160 		 NULL);
161 
162     ags_analyse_channel_buffer_add(analyse_channel,
163 				   source->stream_current->data,
164 				   samplerate,
165 				   buffer_size,
166 				   format);
167 
168     g_object_unref(analyse_recycling);
169 
170     g_object_unref(analyse_channel);
171 
172     g_object_unref(analyse_channel_run);
173   }else{
174     ags_recall_done(recall);
175   }
176 
177   g_object_unref(source);
178 }
179 
180 /**
181  * ags_analyse_audio_signal_new:
182  * @source: the source #AgsAudioSignal
183  *
184  * Create a new instance of #AgsAnalyseAudioSignal
185  *
186  * Returns: the new #AgsAnalyseAudioSignal
187  *
188  * Since: 3.0.0
189  */
190 AgsAnalyseAudioSignal*
ags_analyse_audio_signal_new(AgsAudioSignal * source)191 ags_analyse_audio_signal_new(AgsAudioSignal *source)
192 {
193   AgsAnalyseAudioSignal *analyse_audio_signal;
194 
195   analyse_audio_signal = (AgsAnalyseAudioSignal *) g_object_new(AGS_TYPE_ANALYSE_AUDIO_SIGNAL,
196 								"source", source,
197 								NULL);
198 
199   return(analyse_audio_signal);
200 }
201