static void gst_spectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSpectrum *filter = GST_SPECTRUM (object); switch (prop_id) { case PROP_MESSAGE: case PROP_POST_MESSAGES: filter->post_messages = g_value_get_boolean (value); break; case PROP_MESSAGE_MAGNITUDE: filter->message_magnitude = g_value_get_boolean (value); break; case PROP_MESSAGE_PHASE: filter->message_phase = g_value_get_boolean (value); break; case PROP_INTERVAL:{ guint64 interval = g_value_get_uint64 (value); if (filter->interval != interval) { GST_BASE_TRANSFORM_LOCK (filter); filter->interval = interval; gst_spectrum_reset_state (filter); GST_BASE_TRANSFORM_UNLOCK (filter); } } break; case PROP_BANDS:{ guint bands = g_value_get_uint (value); if (filter->bands != bands) { GST_BASE_TRANSFORM_LOCK (filter); filter->bands = bands; gst_spectrum_reset_state (filter); GST_BASE_TRANSFORM_UNLOCK (filter); } } break; case PROP_THRESHOLD: filter->threshold = g_value_get_int (value); break; case PROP_MULTI_CHANNEL:{ gboolean multi_channel = g_value_get_boolean (value); if (filter->multi_channel != multi_channel) { GST_BASE_TRANSFORM_LOCK (filter); filter->multi_channel = multi_channel; gst_spectrum_reset_state (filter); GST_BASE_TRANSFORM_UNLOCK (filter); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static gboolean gst_spectrum_stop (GstBaseTransform * trans) { GstSpectrum *spectrum = GST_SPECTRUM (trans); gst_spectrum_reset_state (spectrum); return TRUE; }
static void gst_spectrum_finalize (GObject * object) { GstSpectrum *spectrum = GST_SPECTRUM (object); gst_spectrum_reset_state (spectrum); G_OBJECT_CLASS (parent_class)->finalize (object); }
static gboolean gst_spectrum_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstSpectrum *spectrum = GST_SPECTRUM (base); guint width = format->width / 8; gboolean is_float = (format->type == GST_BUFTYPE_FLOAT); /* max_value will be 0 when depth is 1, * interpret -1 and 0 as -1 and +1 if that's the case. */ guint max_value = (1UL << (format->depth - 1)) - 1; gboolean multi_channel = spectrum->multi_channel; GstSpectrumInputData input_data = NULL; if (is_float) { if (width == 4) { input_data = multi_channel ? input_data_float : input_data_mixed_float; } else if (width == 8) { input_data = multi_channel ? input_data_double : input_data_mixed_double; } else { g_assert_not_reached (); } } else { if (width == 4) { if (max_value) { input_data = multi_channel ? input_data_int32_max : input_data_mixed_int32_max; } else { input_data = multi_channel ? input_data_int32 : input_data_mixed_int32; } } else if (width == 3) { if (max_value) { input_data = multi_channel ? input_data_int24_max : input_data_mixed_int24_max; } else { input_data = multi_channel ? input_data_int24 : input_data_mixed_int24; } } else if (width == 2) { if (max_value) { input_data = multi_channel ? input_data_int16_max : input_data_mixed_int16_max; } else { input_data = multi_channel ? input_data_int16 : input_data_mixed_int16; } } else { g_assert_not_reached (); } } spectrum->input_data = input_data; gst_spectrum_reset_state (spectrum); return TRUE; }
static gboolean gst_spectrum_setup (GstAudioFilter * base, const GstAudioInfo * info) { GstSpectrum *spectrum = GST_SPECTRUM (base); gboolean multi_channel = spectrum->multi_channel; GstSpectrumInputData input_data = NULL; g_mutex_lock (&spectrum->lock); switch (GST_AUDIO_INFO_FORMAT (info)) { case GST_AUDIO_FORMAT_S16: input_data = multi_channel ? input_data_int16_max : input_data_mixed_int16_max; break; case GST_AUDIO_FORMAT_S24: input_data = multi_channel ? input_data_int24_max : input_data_mixed_int24_max; break; case GST_AUDIO_FORMAT_S32: input_data = multi_channel ? input_data_int32_max : input_data_mixed_int32_max; break; case GST_AUDIO_FORMAT_F32: input_data = multi_channel ? input_data_float : input_data_mixed_float; break; case GST_AUDIO_FORMAT_F64: input_data = multi_channel ? input_data_double : input_data_mixed_double; break; default: g_assert_not_reached (); break; } spectrum->input_data = input_data; gst_spectrum_reset_state (spectrum); g_mutex_unlock (&spectrum->lock); return TRUE; }