Пример #1
0
void
xfce_mixer_track_combo_set_soundcard (XfceMixerTrackCombo *combo,
                                      GstElement          *card)
{
  XfceMixerTrackType type;
  GtkTreeIter        tree_iter;
  const GList       *iter;
  GList             *cards;
  gchar             *label;
  gint               counter;
  gint               active_index = 0;

  g_return_if_fail (IS_XFCE_MIXER_TRACK_COMBO (combo));

  /* Remember card. If the card is invalid, use the first one available */
  if (GST_IS_MIXER (card))
    combo->card = card;
  else
    {
      cards = xfce_mixer_get_cards ();

      if (G_LIKELY (g_list_length (cards) > 0))
        combo->card = g_list_first (cards)->data;
    }

  /* Clear the list store data */
  gtk_list_store_clear (combo->list_store);

  for (iter = gst_mixer_list_tracks (GST_MIXER (combo->card)), counter = 0; iter != NULL; iter = g_list_next (iter))
    {
      type = xfce_mixer_track_type_new (iter->data);

      if (type == XFCE_MIXER_TRACK_TYPE_PLAYBACK || type == XFCE_MIXER_TRACK_TYPE_CAPTURE)
        {
          g_object_get (GST_MIXER_TRACK (iter->data), "label", &label, NULL);

          gtk_list_store_append (combo->list_store, &tree_iter);
          gtk_list_store_set (combo->list_store, &tree_iter, 
                              NAME_COLUMN, label, 
                              TRACK_COLUMN, GST_MIXER_TRACK (iter->data), -1);

          g_free (label);

          if (G_UNLIKELY (combo->track != NULL && combo->track == GST_MIXER_TRACK (iter->data)))
            active_index = counter;

          ++counter;
        }
    }

  gtk_combo_box_set_active (GTK_COMBO_BOX (combo), active_index);
}
Пример #2
0
static void
gst_mixer_track_get_property (GObject * object, guint prop_id, GValue * value,
    GParamSpec * pspec)
{
  GstMixerTrack *mixer_track;

  mixer_track = GST_MIXER_TRACK (object);

  switch (prop_id) {
    case ARG_LABEL:
      g_value_set_string (value, mixer_track->label);
      break;
    case ARG_UNTRANSLATED_LABEL:
      g_value_set_string (value,
          (const gchar *) g_object_get_data (G_OBJECT (mixer_track),
              MIXER_TRACK_OBJECT_DATA_KEY_UNTRANSLATED_LABEL));
      break;
    case ARG_MIN_VOLUME:
      g_value_set_int (value, mixer_track->min_volume);
      break;
    case ARG_MAX_VOLUME:
      g_value_set_int (value, mixer_track->max_volume);
      break;
    case ARG_FLAGS:
      g_value_set_uint (value, (guint32) mixer_track->flags);
      break;
    case ARG_NUM_CHANNELS:
      g_value_set_int (value, mixer_track->num_channels);
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}
Пример #3
0
static void
gst_dasf_src_dispose (GObject* object)
{
        GstDasfSrc* self = GST_DASF_SRC (object);

        G_OBJECT_CLASS (parent_class)->dispose (object);

        GSList* l;
        for (l = self->tracks; l != NULL; l = l->next)
        {
                g_object_unref (GST_MIXER_TRACK (l->data));
        }

        if (self->tracks != NULL)
        {
                g_slist_free (self->tracks);
                self->tracks = NULL;
        }


		GST_DEBUG ("GOO component refcount = %d",
				  G_OBJECT (self->peer_element)->ref_count);

		g_object_unref (self->peer_element);


        self->component = NULL;
}
Пример #4
0
static void
gst_mixer_track_dispose (GObject * object)
{
  GstMixerTrack *channel = GST_MIXER_TRACK (object);

  if (channel->label) {
    g_free (channel->label);
    channel->label = NULL;
  }

  if (parent_class->dispose)
    parent_class->dispose (object);
}
Пример #5
0
static void
gst_dasf_sink_dispose (GObject* object)
{
	GstDasfSink* self = GST_DASF_SINK (object);
	GstDasfSinkPrivate* priv = GST_DASF_SINK_GET_PRIVATE (self);

	G_OBJECT_CLASS (parent_class)->dispose (object);

	GSList* l;
	for (l = self->tracks; l != NULL; l = l->next)
	{
		g_object_unref (GST_MIXER_TRACK (l->data));
	}

	if (self->tracks != NULL)
	{
		g_slist_free (self->tracks);
		self->tracks = NULL;
	}

	if (G_LIKELY (self->clock))
	{
		GST_DEBUG ("Unrefing clock component clock refcount %d -> %d",
			G_OBJECT(self->clock)->ref_count,
			(G_OBJECT(self->clock)->ref_count - 1));

		g_object_unref (self->clock);

	}

	if (G_LIKELY (self->factory))
	{
		GST_DEBUG ("GOO factory = %d",
				G_OBJECT (self->factory)->ref_count);

		GST_DEBUG ("unrefing factory");
		g_object_unref (self->factory);
	}

	if (self->component)
	{
		GST_DEBUG ("GOO component = %d",
				G_OBJECT (self->component)->ref_count);

		GST_DEBUG ("unrefing component");
		g_object_unref (self->component);
	}
}
void
gst_sunaudiomixer_ctrl_set_option (GstSunAudioMixerCtrl * mixer,
    GstMixerOptions * options, gchar * value)
{
  struct audio_info audioinfo;
  GstMixerTrack *track;
  GstSunAudioMixerOptions *opts;
  GQuark q;
  int i;

  g_return_if_fail (mixer != NULL);
  g_return_if_fail (mixer->mixer_fd != -1);
  g_return_if_fail (value != NULL);
  g_return_if_fail (GST_IS_SUNAUDIO_MIXER_OPTIONS (options));

  track = GST_MIXER_TRACK (options);
  opts = GST_SUNAUDIO_MIXER_OPTIONS (options);

  if (opts->track_num != GST_SUNAUDIO_TRACK_RECSRC) {
    g_warning ("set_option not supported on track %s", track->label);
    return;
  }

  q = g_quark_try_string (value);
  if (q == 0) {
    g_warning ("unknown option '%s'", value);
    return;
  }

  for (i = 0; i < 8; i++) {
    if (opts->names[i] == q) {
      break;
    }
  }

  if (((1 << (i)) & opts->avail) == 0) {
    g_warning ("Record port %s not available", g_quark_to_string (q));
    return;
  }

  AUDIO_INITINFO (&audioinfo);
  audioinfo.record.port = (1 << (i));

  if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) {
    g_warning ("Error setting audio record port");
  }
}
Пример #7
0
static void
gst_mixer_track_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstMixerTrack *mixer_track;

  mixer_track = GST_MIXER_TRACK (object);

  switch (prop_id) {
    case ARG_UNTRANSLATED_LABEL:
      g_object_set_data_full (G_OBJECT (mixer_track),
          MIXER_TRACK_OBJECT_DATA_KEY_UNTRANSLATED_LABEL,
          g_value_dup_string (value), (GDestroyNotify) g_free);
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}
const gchar *
gst_sunaudiomixer_ctrl_get_option (GstSunAudioMixerCtrl * mixer,
    GstMixerOptions * options)
{
  GstMixerTrack *track;
  GstSunAudioMixerOptions *opts;
  struct audio_info audioinfo;
  int i;

  g_return_val_if_fail (mixer != NULL, NULL);
  g_return_val_if_fail (mixer->fd != -1, NULL);
  g_return_val_if_fail (GST_IS_SUNAUDIO_MIXER_OPTIONS (options), NULL);

  track = GST_MIXER_TRACK (options);
  opts = GST_SUNAUDIO_MIXER_OPTIONS (options);

  g_return_val_if_fail (opts->track_num == GST_SUNAUDIO_TRACK_RECSRC, NULL);

  if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) {
    g_warning ("Error getting audio device settings");
    return (NULL);
  }

  for (i = 0; i < 8; i++) {
    if ((1 << i) == audioinfo.record.port) {
      const gchar *s = g_quark_to_string (opts->names[i]);
      GST_DEBUG_OBJECT (mixer, "Getting value for option %d: %s",
          opts->track_num, s);
      return (s);
    }
  }

  GST_DEBUG_OBJECT (mixer, "Unable to get value for option %d",
      opts->track_num);

  g_warning ("Record port value %d seems illegal", audioinfo.record.port);
  return (NULL);
}
GstMixerOptions *
gst_sunaudiomixer_options_new (GstSunAudioMixerCtrl * mixer, gint track_num)
{
    GstMixerOptions *opts;
    GstSunAudioMixerOptions *sun_opts;
    GstMixerTrack *track;
    const gchar *label;
    gint i;
    struct audio_info audioinfo;

    if ((mixer == NULL) || (mixer->mixer_fd == -1)) {
        g_warning ("mixer not initialized");
        return NULL;
    }

    if (track_num != GST_SUNAUDIO_TRACK_RECSRC) {
        g_warning ("invalid options track");
        return (NULL);
    }

    label = N_("Record Source");

    opts = g_object_new (GST_TYPE_SUNAUDIO_MIXER_OPTIONS,
                         "untranslated-label", label, NULL);
    sun_opts = GST_SUNAUDIO_MIXER_OPTIONS (opts);
    track = GST_MIXER_TRACK (opts);

    GST_DEBUG_OBJECT (opts, "New mixer options, track %d: %s",
                      track_num, GST_STR_NULL (label));

    /* save off names for the record sources */
    sun_opts->names[0] = g_quark_from_string (_("Microphone"));
    sun_opts->names[1] = g_quark_from_string (_("Line In"));
    sun_opts->names[2] = g_quark_from_string (_("Internal CD"));
    sun_opts->names[3] = g_quark_from_string (_("SPDIF In"));
    sun_opts->names[4] = g_quark_from_string (_("AUX 1 In"));
    sun_opts->names[5] = g_quark_from_string (_("AUX 2 In"));
    sun_opts->names[6] = g_quark_from_string (_("Codec Loopback"));
    sun_opts->names[7] = g_quark_from_string (_("SunVTS Loopback"));

    /* set basic information */
    track->label = g_strdup (_(label));
    track->num_channels = 0;
    track->min_volume = 0;
    track->max_volume = 0;
    track->flags =
        GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_WHITELIST |
        GST_MIXER_TRACK_NO_RECORD;

    if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) {
        g_warning ("Error getting audio device settings");
        g_object_unref (G_OBJECT (sun_opts));
        return NULL;
    }

    sun_opts->avail = audioinfo.record.avail_ports;
    sun_opts->track_num = track_num;

    for (i = 0; i < 8; i++) {
        if ((1 << i) & audioinfo.record.avail_ports) {
            const char *s = g_quark_to_string (sun_opts->names[i]);
            opts->values = g_list_append (opts->values, g_strdup (s));
            GST_DEBUG_OBJECT (opts, "option for track %d: %s",
                              track_num, GST_STR_NULL (s));
        }
    }

    return opts;
}