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;
}
예제 #5
0
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;
}