diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2002-01-13 22:27:25 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2002-01-13 22:27:25 +0000 |
commit | 97454065ce4921877100d0f829d4638438424dfe (patch) | |
tree | b7fba2905e195b55f136e65332777fb96fee3d65 /sys | |
parent | 1ea946d2d26998d7056d233548d88b57322ffdcf (diff) |
Bring the plugins in sync with the new core capsnego system.
Original commit message from CVS:
Bring the plugins in sync with the new core capsnego system.
Added some features, enhancements...
Diffstat (limited to 'sys')
-rw-r--r-- | sys/oss/gstossgst.c | 2 | ||||
-rw-r--r-- | sys/oss/gstosssink.c | 102 | ||||
-rw-r--r-- | sys/oss/gstosssrc.c | 2 |
3 files changed, 50 insertions, 56 deletions
diff --git a/sys/oss/gstossgst.c b/sys/oss/gstossgst.c index 332f8214..ddaecaaa 100644 --- a/sys/oss/gstossgst.c +++ b/sys/oss/gstossgst.c @@ -276,7 +276,7 @@ gst_ossgst_get (GstPad *pad) cmd.cmd.format.stereo, cmd.cmd.format.rate); - gst_pad_set_caps (ossgst->srcpad, caps); + gst_pad_try_set_caps (ossgst->srcpad, caps); } break; default: diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c index 5c06d043..86d07e28 100644 --- a/sys/oss/gstosssink.c +++ b/sys/oss/gstosssink.c @@ -47,9 +47,9 @@ static void gst_osssink_finalize (GObject *object); static gboolean gst_osssink_open_audio (GstOssSink *sink); static void gst_osssink_close_audio (GstOssSink *sink); -static void gst_osssink_sync_parms (GstOssSink *osssink); +static gboolean gst_osssink_sync_parms (GstOssSink *osssink); static GstElementStateReturn gst_osssink_change_state (GstElement *element); -static GstPadNegotiateReturn gst_osssink_negotiate (GstPad *pad, GstCaps **caps, gpointer *user_data); +static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps); static void gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -87,9 +87,9 @@ GST_PADTEMPLATE_FACTORY (osssink_sink_factory, "law", GST_PROPS_INT (0), "endianness", GST_PROPS_INT (G_BYTE_ORDER), "signed", GST_PROPS_LIST ( - GST_PROPS_BOOLEAN (FALSE), - GST_PROPS_BOOLEAN (TRUE) - ), + GST_PROPS_BOOLEAN (FALSE), + GST_PROPS_BOOLEAN (TRUE) + ), "width", GST_PROPS_LIST ( GST_PROPS_INT (8), GST_PROPS_INT (16) @@ -220,7 +220,7 @@ gst_osssink_init (GstOssSink *osssink) osssink->sinkpad = gst_pad_new_from_template ( GST_PADTEMPLATE_GET (osssink_sink_factory), "sink"); gst_element_add_pad (GST_ELEMENT (osssink), osssink->sinkpad); - gst_pad_set_negotiate_function (osssink->sinkpad, gst_osssink_negotiate); + gst_pad_set_connect_function (osssink->sinkpad, gst_osssink_sinkconnect); gst_pad_set_bufferpool_function (osssink->sinkpad, gst_osssink_get_bufferpool); gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); @@ -245,20 +245,22 @@ gst_osssink_init (GstOssSink *osssink) GST_FLAG_SET (osssink, GST_ELEMENT_THREAD_SUGGESTED); } -static gboolean -gst_osssink_parse_caps (GstOssSink *osssink, GstCaps *caps) +static GstPadConnectReturn +gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps) { gint law, endianness, width, depth; gboolean sign; gint format = -1; + GstOssSink *osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - // deal with the case where there are no props... - if (gst_caps_get_props(caps) == NULL) return FALSE; + if (!GST_CAPS_IS_FIXED (caps)) + return GST_PAD_CONNECT_DELAYED; width = gst_caps_get_int (caps, "width"); depth = gst_caps_get_int (caps, "depth"); - if (width != depth) return FALSE; + if (width != depth) + return GST_PAD_CONNECT_REFUSED; law = gst_caps_get_int (caps, "law"); endianness = gst_caps_get_int (caps, "endianness"); @@ -290,69 +292,51 @@ gst_osssink_parse_caps (GstOssSink *osssink, GstCaps *caps) } if (format == -1) - return FALSE; + return GST_PAD_CONNECT_REFUSED; osssink->format = format; osssink->channels = gst_caps_get_int (caps, "channels"); osssink->frequency = gst_caps_get_int (caps, "rate"); - return TRUE; -} - -static GstPadNegotiateReturn -gst_osssink_negotiate (GstPad *pad, GstCaps **caps, gpointer *user_data) -{ - GstOssSink *osssink; - - g_return_val_if_fail (pad != NULL, GST_PAD_NEGOTIATE_FAIL); - g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_NEGOTIATE_FAIL); - - osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - - GST_INFO (GST_CAT_NEGOTIATION, "osssink: negotiate"); - // we decide - if (user_data == NULL) { - *caps = NULL; - return GST_PAD_NEGOTIATE_TRY; + if (!gst_osssink_sync_parms (osssink)) { + return GST_PAD_CONNECT_REFUSED; } - // have we got caps? - else if (*caps) { - if (gst_osssink_parse_caps (osssink, *caps)) { - gst_osssink_sync_parms (osssink); - - return GST_PAD_NEGOTIATE_AGREE; - } - - // FIXME check if the sound card was really set to these caps, - // else send out another caps.. - - return GST_PAD_NEGOTIATE_FAIL; - } - - return GST_PAD_NEGOTIATE_FAIL; + return GST_PAD_CONNECT_OK; } -static void +static gboolean gst_osssink_sync_parms (GstOssSink *osssink) { audio_buf_info ospace; int frag; + gint target_format; + gint target_channels; + gint target_frequency; g_return_if_fail (osssink != NULL); g_return_if_fail (GST_IS_OSSSINK (osssink)); - if (osssink->fd == -1) return; + if (osssink->fd == -1) + return FALSE; if (osssink->fragment >> 16) frag = osssink->fragment; else frag = 0x7FFF0000 | osssink->fragment; + GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: trying to set sound card to %dHz %d bit %s (%08x fragment)", + osssink->frequency, osssink->format, + (osssink->channels == 2) ? "stereo" : "mono",frag); + ioctl (osssink->fd, SNDCTL_DSP_SETFRAGMENT, &frag); ioctl (osssink->fd, SNDCTL_DSP_RESET, 0); + target_format = osssink->format; + target_channels = osssink->channels; + target_frequency = osssink->frequency; + ioctl (osssink->fd, SNDCTL_DSP_SETFMT, &osssink->format); ioctl (osssink->fd, SNDCTL_DSP_CHANNELS, &osssink->channels); ioctl (osssink->fd, SNDCTL_DSP_SPEED, &osssink->frequency); @@ -360,15 +344,26 @@ gst_osssink_sync_parms (GstOssSink *osssink) ioctl (osssink->fd, SNDCTL_DSP_GETBLKSIZE, &frag); ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &ospace); - /* - g_warning ("osssink: setting sound card to %dHz %d bit %s (%d bytes buffer, %d fragment)\n", - osssink->frequency, osssink->format, - (osssink->channels == 2) ? "stereo" : "mono", ospace.bytes, frag); - */ - GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: setting sound card to %dHz %d bit %s (%d bytes buffer, %d fragment)", + GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: set sound card to %dHz %d bit %s (%d bytes buffer, %08x fragment)", osssink->frequency, osssink->format, (osssink->channels == 2) ? "stereo" : "mono", ospace.bytes, frag); + gst_element_send_event (GST_ELEMENT (osssink), + gst_event_new_info ("samplerate", GST_PROPS_INT (osssink->frequency), NULL)); + gst_element_send_event (GST_ELEMENT (osssink), + gst_event_new_info ("channels", GST_PROPS_INT (osssink->channels), NULL)); + gst_element_send_event (GST_ELEMENT (osssink), + gst_event_new_info ("bits", GST_PROPS_INT (osssink->format), NULL)); + + if (target_format != osssink->format || + target_channels != osssink->channels || + target_frequency != osssink->frequency) + { + g_warning ("could not configure oss with required parameters, enjoy the noise :)"); + /* we could eventually return FALSE here, or just do some additional tests + * to see that the frequencies don't differ too much etc.. */ + } + return TRUE; } static void @@ -554,7 +549,6 @@ gst_osssink_open_audio (GstOssSink *sink) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: opened audio (%s) with fd=%d", sink->device, sink->fd); GST_FLAG_SET (sink, GST_OSSSINK_OPEN); - gst_osssink_sync_parms (sink); return TRUE; } diff --git a/sys/oss/gstosssrc.c b/sys/oss/gstosssrc.c index f0f98492..8bf48144 100644 --- a/sys/oss/gstosssrc.c +++ b/sys/oss/gstosssrc.c @@ -385,7 +385,7 @@ gst_osssrc_sync_parms (GstOssSrc *osssrc) (osssrc->channels == 2) ? "stereo" : "mono", ispace.bytes, frag); /* set caps on src pad */ - gst_pad_set_caps (osssrc->srcpad, gst_caps_new ( + gst_pad_try_set_caps (osssrc->srcpad, gst_caps_new ( "oss_src", "audio/raw", gst_props_new ( |