static void gst_audio_fx_base_fir_filter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (object); switch (prop_id) { case PROP_LOW_LATENCY:{ gboolean low_latency; if (GST_STATE (self) >= GST_STATE_PAUSED) { g_warning ("Changing the \"low-latency\" property " "is only allowed in states < PAUSED"); return; } g_mutex_lock (&self->lock); low_latency = g_value_get_boolean (value); if (self->low_latency != low_latency) { self->low_latency = low_latency; gst_audio_fx_base_fir_filter_calculate_frequency_response (self); gst_audio_fx_base_fir_filter_select_process_function (self, GST_AUDIO_FILTER_FORMAT (self), GST_AUDIO_FILTER_CHANNELS (self)); } g_mutex_unlock (&self->lock); break; } case PROP_DRAIN_ON_CHANGES:{ g_mutex_lock (&self->lock); self->drain_on_changes = g_value_get_boolean (value); g_mutex_unlock (&self->lock); 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_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self, gdouble * kernel, guint kernel_length, guint64 latency, const GstAudioInfo * info) { gboolean latency_changed; GstAudioFormat format; gint channels; g_return_if_fail (kernel != NULL); g_return_if_fail (self != NULL); g_mutex_lock (&self->lock); latency_changed = (self->latency != latency || (!self->low_latency && self->kernel_length < FFT_THRESHOLD && kernel_length >= FFT_THRESHOLD) || (!self->low_latency && self->kernel_length >= FFT_THRESHOLD && kernel_length < FFT_THRESHOLD)); /* FIXME: If the latency changes, the buffer size changes too and we * have to drain in any case until this is fixed in the future */ if (self->buffer && (!self->drain_on_changes || latency_changed)) { gst_audio_fx_base_fir_filter_push_residue (self); self->start_ts = GST_CLOCK_TIME_NONE; self->start_off = GST_BUFFER_OFFSET_NONE; self->nsamples_out = 0; self->nsamples_in = 0; self->buffer_fill = 0; } g_free (self->kernel); if (!self->drain_on_changes || latency_changed) { g_free (self->buffer); self->buffer = NULL; self->buffer_fill = 0; self->buffer_length = 0; } self->kernel = kernel; self->kernel_length = kernel_length; if (info) { format = GST_AUDIO_INFO_FORMAT (info); channels = GST_AUDIO_INFO_CHANNELS (info); } else { format = GST_AUDIO_FILTER_FORMAT (self); channels = GST_AUDIO_FILTER_CHANNELS (self); } gst_audio_fx_base_fir_filter_calculate_frequency_response (self); gst_audio_fx_base_fir_filter_select_process_function (self, format, channels); if (latency_changed) { self->latency = latency; gst_element_post_message (GST_ELEMENT (self), gst_message_new_latency (GST_OBJECT (self))); } g_mutex_unlock (&self->lock); }