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