sys/oss/gstosssink.*: Cache probed caps; fix debug output for SET_PARAM macros.

Original commit message from CVS:
* sys/oss/gstosssink.c: (gst_oss_sink_dispose),
(gst_oss_sink_set_property), (gst_oss_sink_getcaps),
(gst_oss_sink_prepare):
* sys/oss/gstosssink.h:
Cache probed caps; fix debug output for SET_PARAM macros.
This commit is contained in:
Tim-Philipp Müller 2005-11-07 17:35:20 +00:00
parent 8af7381d5c
commit ef3e55d3a6
3 changed files with 38 additions and 12 deletions

View File

@ -1,3 +1,11 @@
2005-11-07 Tim-Philipp Müller <tim at centricular dot net>
* sys/oss/gstosssink.c: (gst_oss_sink_dispose),
(gst_oss_sink_set_property), (gst_oss_sink_getcaps),
(gst_oss_sink_prepare):
* sys/oss/gstosssink.h:
Cache probed caps; fix debug output for SET_PARAM macros.
2005-11-07 Tim-Philipp Müller <tim at centricular dot net> 2005-11-07 Tim-Philipp Müller <tim at centricular dot net>
* ext/cairo/Makefile.am: * ext/cairo/Makefile.am:
@ -15,7 +23,7 @@
(gst_text_overlay_change_state): (gst_text_overlay_change_state):
* ext/cairo/gsttextoverlay.h: * ext/cairo/gsttextoverlay.h:
Port cairo textoverlay plugin to 0.9. Add 'shaded-background' Port cairo textoverlay plugin to 0.9. Add 'shaded-background'
property and redo position. Doesn't handle upstream renegotiation property and redo positioning. Doesn't handle upstream renegotiation
yet though. yet though.
2005-11-07 Tim-Philipp Müller <tim at centricular dot net> 2005-11-07 Tim-Philipp Müller <tim at centricular dot net>

View File

@ -129,6 +129,13 @@ gst_oss_sink_get_type (void)
static void static void
gst_oss_sink_dispose (GObject * object) gst_oss_sink_dispose (GObject * object)
{ {
GstOssSink *osssink = GST_OSSSINK (object);
if (osssink->probed_caps) {
gst_caps_unref (osssink->probed_caps);
osssink->probed_caps = NULL;
}
G_OBJECT_CLASS (parent_class)->dispose (object); G_OBJECT_CLASS (parent_class)->dispose (object);
} }
@ -199,6 +206,10 @@ gst_oss_sink_set_property (GObject * object, guint prop_id,
case PROP_DEVICE: case PROP_DEVICE:
g_free (sink->device); g_free (sink->device);
sink->device = g_value_dup_string (value); sink->device = g_value_dup_string (value);
if (sink->probed_caps) {
gst_caps_unref (sink->probed_caps);
sink->probed_caps = NULL;
}
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -235,8 +246,13 @@ gst_oss_sink_getcaps (GstBaseSink * bsink)
if (osssink->fd == -1) { if (osssink->fd == -1) {
caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD
(bsink))); (bsink)));
} else if (osssink->probed_caps) {
caps = gst_caps_copy (osssink->probed_caps);
} else { } else {
caps = gst_oss_helper_probe_caps (osssink->fd); caps = gst_oss_helper_probe_caps (osssink->fd);
if (caps && !gst_caps_is_empty (caps)) {
osssink->probed_caps = gst_caps_copy (caps);
}
} }
return caps; return caps;
@ -259,24 +275,24 @@ ilog2 (gint x)
return (x & 0x0000003f) - 1; return (x & 0x0000003f) - 1;
} }
#define SET_PARAM(_oss, _name, _val) \ #define SET_PARAM(_oss, _name, _val, _detail) \
G_STMT_START { \ G_STMT_START { \
int _tmp = _val; \ int _tmp = _val; \
if (ioctl(_oss->fd, _name, &_tmp) == -1) { \ if (ioctl(_oss->fd, _name, &_tmp) == -1) { \
GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, \ GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, \
("Unable to set param "G_STRINGIFY (_name)": %s", \ ("Unable to set param " _detail ": %s", \
g_strerror (errno)), \ g_strerror (errno)), \
(NULL)); \ (NULL)); \
return FALSE; \ return FALSE; \
} \ } \
GST_DEBUG(G_STRINGIFY (name) " %d", _tmp); \ GST_DEBUG(_detail " %d", _tmp); \
} G_STMT_END } G_STMT_END
#define GET_PARAM(_oss, _name, _val) \ #define GET_PARAM(_oss, _name, _val, _detail) \
G_STMT_START { \ G_STMT_START { \
if (ioctl(oss->fd, _name, _val) == -1) { \ if (ioctl(oss->fd, _name, _val) == -1) { \
GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, \ GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, \
("Unable to get param "G_STRINGIFY (_name)": %s", \ ("Unable to get param " _detail ": %s", \
g_strerror (errno)), \ g_strerror (errno)), \
(NULL)); \ (NULL)); \
return FALSE; \ return FALSE; \
@ -381,19 +397,19 @@ gst_oss_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
if (spec->width != 16 && spec->width != 8) if (spec->width != 16 && spec->width != 8)
goto dodgy_width; goto dodgy_width;
SET_PARAM (oss, SNDCTL_DSP_SETFMT, tmp); SET_PARAM (oss, SNDCTL_DSP_SETFMT, tmp, "SETFMT");
if (spec->channels == 2) if (spec->channels == 2)
SET_PARAM (oss, SNDCTL_DSP_STEREO, 1); SET_PARAM (oss, SNDCTL_DSP_STEREO, 1, "STEREO");
SET_PARAM (oss, SNDCTL_DSP_CHANNELS, spec->channels); SET_PARAM (oss, SNDCTL_DSP_CHANNELS, spec->channels, "CHANNELS");
SET_PARAM (oss, SNDCTL_DSP_SPEED, spec->rate); SET_PARAM (oss, SNDCTL_DSP_SPEED, spec->rate, "SPEED");
tmp = ilog2 (spec->segsize); tmp = ilog2 (spec->segsize);
tmp = ((spec->segtotal & 0x7fff) << 16) | tmp; tmp = ((spec->segtotal & 0x7fff) << 16) | tmp;
GST_DEBUG ("set segsize: %d, segtotal: %d, value: %08x", spec->segsize, GST_DEBUG ("set segsize: %d, segtotal: %d, value: %08x", spec->segsize,
spec->segtotal, tmp); spec->segtotal, tmp);
SET_PARAM (oss, SNDCTL_DSP_SETFRAGMENT, tmp); SET_PARAM (oss, SNDCTL_DSP_SETFRAGMENT, tmp, "SETFRAGMENT");
GET_PARAM (oss, SNDCTL_DSP_GETOSPACE, &info); GET_PARAM (oss, SNDCTL_DSP_GETOSPACE, &info, "GETOSPACE");
spec->segsize = info.fragsize; spec->segsize = info.fragsize;
spec->segtotal = info.fragstotal; spec->segtotal = info.fragstotal;

View File

@ -47,6 +47,8 @@ struct _GstOssSink {
gchar *device; gchar *device;
gint fd; gint fd;
gint bytes_per_sample; gint bytes_per_sample;
GstCaps *probed_caps;
}; };
struct _GstOssSinkClass { struct _GstOssSinkClass {