static void gst_audio_dynamic_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (object); switch (prop_id) { case PROP_CHARACTERISTICS: filter->characteristics = g_value_get_enum (value); gst_audio_dynamic_set_process_function (filter, GST_AUDIO_FILTER_INFO (filter)); break; case PROP_MODE: filter->mode = g_value_get_enum (value); gst_audio_dynamic_set_process_function (filter, GST_AUDIO_FILTER_INFO (filter)); break; case PROP_THRESHOLD: filter->threshold = g_value_get_float (value); break; case PROP_RATIO: filter->ratio = g_value_get_float (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static GstFlowReturn gst_audio_filter_template_filter_inplace (GstBaseTransform * base_transform, GstBuffer * buf) { GstAudioFilterTemplate *filter = GST_AUDIO_FILTER_TEMPLATE (base_transform); GstFlowReturn flow = GST_FLOW_OK; GstMapInfo map; GST_LOG_OBJECT (filter, "transform buffer in place"); /* FIXME: do something interesting here. Doing nothing means the input * buffer is simply pushed out as is without any modification */ if (gst_buffer_map (buf, &map, GST_MAP_READWRITE)) { #if 0 switch (GST_AUDIO_FILTER_FORMAT (filter)) { case GST_AUDIO_FORMAT_S16LE: case GST_AUDIO_FORMAT_S16BE: { gint16 *samples = map.data; guint n_samples = map.size / sizeof (gint16); guint i; for (i = 0; i < n; ++n) { samples[i] = samples[i]; } break; } default: g_warning ("Unexpected audio format %s!", GST_AUDIO_INFO_NAME (GST_AUDIO_FILTER_INFO(filter))); flow = GST_FLOW_ERROR; break; } #endif gst_buffer_unmap (buf, &map); } return flow; }
void gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count) { guint old_count, i; gdouble freq0, freq1, step; gchar name[20]; if (equ->freq_band_count == new_count) return; BANDS_LOCK (equ); if (G_UNLIKELY (equ->freq_band_count == new_count)) { BANDS_UNLOCK (equ); return; } old_count = equ->freq_band_count; equ->freq_band_count = new_count; GST_DEBUG ("bands %u -> %u", old_count, new_count); if (old_count < new_count) { /* add new bands */ equ->bands = g_realloc (equ->bands, sizeof (GstObject *) * new_count); for (i = old_count; i < new_count; i++) { /* otherwise they get names like 'iirequalizerband5' */ sprintf (name, "band%u", i); equ->bands[i] = g_object_new (GST_TYPE_IIR_EQUALIZER_BAND, "name", name, NULL); GST_DEBUG ("adding band[%d]=%p", i, equ->bands[i]); gst_object_set_parent (GST_OBJECT (equ->bands[i]), GST_OBJECT (equ)); gst_child_proxy_child_added (GST_CHILD_PROXY (equ), G_OBJECT (equ->bands[i]), name); } } else { /* free unused bands */ for (i = new_count; i < old_count; i++) { GST_DEBUG ("removing band[%d]=%p", i, equ->bands[i]); gst_child_proxy_child_removed (GST_CHILD_PROXY (equ), G_OBJECT (equ->bands[i]), GST_OBJECT_NAME (equ->bands[i])); gst_object_unparent (GST_OBJECT (equ->bands[i])); equ->bands[i] = NULL; } } alloc_history (equ, GST_AUDIO_FILTER_INFO (equ)); /* set center frequencies and name band objects * FIXME: arg! we can't change the name of parented objects :( * application should read band->freq to get the name */ step = pow (HIGHEST_FREQ / LOWEST_FREQ, 1.0 / new_count); freq0 = LOWEST_FREQ; for (i = 0; i < new_count; i++) { freq1 = freq0 * step; if (i == 0) equ->bands[i]->type = BAND_TYPE_LOW_SHELF; else if (i == new_count - 1) equ->bands[i]->type = BAND_TYPE_HIGH_SHELF; else equ->bands[i]->type = BAND_TYPE_PEAK; equ->bands[i]->freq = freq0 + ((freq1 - freq0) / 2.0); equ->bands[i]->width = freq1 - freq0; GST_DEBUG ("band[%2d] = '%lf'", i, equ->bands[i]->freq); g_object_notify (G_OBJECT (equ->bands[i]), "bandwidth"); g_object_notify (G_OBJECT (equ->bands[i]), "freq"); g_object_notify (G_OBJECT (equ->bands[i]), "type"); /* if(equ->bands[i]->freq<10000.0) sprintf (name,"%dHz",(gint)equ->bands[i]->freq); else sprintf (name,"%dkHz",(gint)(equ->bands[i]->freq/1000.0)); gst_object_set_name( GST_OBJECT (equ->bands[i]), name); GST_DEBUG ("band[%2d] = '%s'",i,name); */ freq0 = freq1; } equ->need_new_coefficients = TRUE; BANDS_UNLOCK (equ); }