diff options
author | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2013-03-14 18:04:55 +0530 |
---|---|---|
committer | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2013-03-28 16:50:26 +0000 |
commit | a3713f7be16ef1cc6d361419b3899d39beea996f (patch) | |
tree | 1412129c476aa429eca5b0231220e81e550a678d /sys/bluez | |
parent | adc9d39710b52815af80b06d7a16be91ca627aec (diff) | |
download | gstreamer-plugins-bad-a3713f7be16ef1cc6d361419b3899d39beea996f.tar.gz |
bluez: Compile fixes for avdtpsrc/a2dpsrc code against 1.x
Diffstat (limited to 'sys/bluez')
-rw-r--r-- | sys/bluez/gsta2dpsrc.c | 32 | ||||
-rw-r--r-- | sys/bluez/gstavdtpsrc.c | 95 | ||||
-rw-r--r-- | sys/bluez/gstavdtputil.c | 4 |
3 files changed, 72 insertions, 59 deletions
diff --git a/sys/bluez/gsta2dpsrc.c b/sys/bluez/gsta2dpsrc.c index 8f00c5eb6..183b56235 100644 --- a/sys/bluez/gsta2dpsrc.c +++ b/sys/bluez/gsta2dpsrc.c @@ -33,7 +33,8 @@ enum PROP_TRANSPORT }; -GST_BOILERPLATE (GstA2dpSrc, gst_a2dp_src, GstBin, GST_TYPE_BIN); +#define parent_class gst_a2dp_src_parent_class +G_DEFINE_TYPE (GstA2dpSrc, gst_a2dp_src, GST_TYPE_BIN); static void gst_a2dp_src_finalize (GObject * object); static void gst_a2dp_src_get_property (GObject * object, guint prop_id, @@ -54,24 +55,12 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, "bitpool = (int) [ 2, " TEMPLATE_MAX_BITPOOL_STR " ]")); static void -gst_a2dp_src_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_a2dp_src_template)); - - gst_element_class_set_details_simple (element_class, - "Bluetooth A2DP Source", - "Source/Audio/Network", - "Receives and depayloads audio from an A2DP device", - "Arun Raghavan <arun.raghavan@collabora.co.uk>"); -} - -static void gst_a2dp_src_class_init (GstA2dpSrcClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_a2dp_src_finalize); gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_a2dp_src_set_property); @@ -81,12 +70,21 @@ gst_a2dp_src_class_init (GstA2dpSrcClass * klass) g_param_spec_string ("transport", "Transport", "Use configured transport", NULL, G_PARAM_READWRITE)); + gst_element_class_set_static_metadata (element_class, + "Bluetooth A2DP Source", + "Source/Audio/Network", + "Receives and depayloads audio from an A2DP device", + "Arun Raghavan <arun.raghavan@collabora.co.uk>"); + GST_DEBUG_CATEGORY_INIT (a2dpsrc_debug, "a2dpsrc", 0, "Bluetooth A2DP Source"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_a2dp_src_template)); } static void -gst_a2dp_src_init (GstA2dpSrc * a2dpsrc, GstA2dpSrcClass * klass) +gst_a2dp_src_init (GstA2dpSrc * a2dpsrc) { GstBin *bin = GST_BIN (a2dpsrc); GstElement *depay = NULL; diff --git a/sys/bluez/gstavdtpsrc.c b/sys/bluez/gstavdtpsrc.c index 2c34108f3..9d5d5e2e6 100644 --- a/sys/bluez/gstavdtpsrc.c +++ b/sys/bluez/gstavdtpsrc.c @@ -42,7 +42,8 @@ enum PROP_TRANSPORT }; -GST_BOILERPLATE (GstAvdtpSrc, gst_avdtp_src, GstBaseSrc, GST_TYPE_BASE_SRC); +#define parent_class gst_avdtp_src_parent_class +G_DEFINE_TYPE (GstAvdtpSrc, gst_avdtp_src, GST_TYPE_BASE_SRC); static GstStaticPadTemplate gst_avdtp_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, @@ -59,7 +60,7 @@ static void gst_avdtp_src_get_property (GObject * object, guint prop_id, static void gst_avdtp_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static GstCaps *gst_avdtp_src_getcaps (GstPad * pad); +static GstCaps *gst_avdtp_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter); static gboolean gst_avdtp_src_start (GstBaseSrc * bsrc); static gboolean gst_avdtp_src_stop (GstBaseSrc * bsrc); static GstFlowReturn gst_avdtp_src_create (GstBaseSrc * bsrc, guint64 offset, @@ -68,26 +69,14 @@ static gboolean gst_avdtp_src_unlock (GstBaseSrc * bsrc); static gboolean gst_avdtp_src_unlock_stop (GstBaseSrc * bsrc); static void -gst_avdtp_src_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_avdtp_src_template)); - - gst_element_class_set_details_simple (element_class, - "Bluetooth AVDTP Source", - "Source/Audio/Network/RTP", - "Receives audio from an A2DP device", - "Arun Raghavan <arun.raghavan@collabora.co.uk>"); -} - -static void gst_avdtp_src_class_init (GstAvdtpSrcClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseSrcClass *basesrc_class = GST_BASE_SRC_CLASS (klass); + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_avdtp_src_finalize); gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_avdtp_src_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_avdtp_src_get_property); @@ -97,26 +86,33 @@ gst_avdtp_src_class_init (GstAvdtpSrcClass * klass) basesrc_class->create = GST_DEBUG_FUNCPTR (gst_avdtp_src_create); basesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_avdtp_src_unlock); basesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_avdtp_src_unlock_stop); + basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_avdtp_src_getcaps); g_object_class_install_property (gobject_class, PROP_TRANSPORT, g_param_spec_string ("transport", "Transport", "Use configured transport", NULL, G_PARAM_READWRITE)); + gst_element_class_set_static_metadata (element_class, + "Bluetooth AVDTP Source", + "Source/Audio/Network/RTP", + "Receives audio from an A2DP device", + "Arun Raghavan <arun.raghavan@collabora.co.uk>"); + GST_DEBUG_CATEGORY_INIT (avdtpsrc_debug, "avdtpsrc", 0, "Bluetooth AVDTP Source"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_avdtp_src_template)); } static void -gst_avdtp_src_init (GstAvdtpSrc * avdtpsrc, GstAvdtpSrcClass * klass) +gst_avdtp_src_init (GstAvdtpSrc * avdtpsrc) { avdtpsrc->poll = gst_poll_new (TRUE); gst_base_src_set_format (GST_BASE_SRC (avdtpsrc), GST_FORMAT_TIME); gst_base_src_set_live (GST_BASE_SRC (avdtpsrc), TRUE); gst_base_src_set_do_timestamp (GST_BASE_SRC (avdtpsrc), TRUE); - - gst_pad_set_getcaps_function (GST_BASE_SRC_PAD (avdtpsrc), - GST_DEBUG_FUNCPTR (gst_avdtp_src_getcaps)); } static void @@ -167,10 +163,10 @@ gst_avdtp_src_set_property (GObject * object, guint prop_id, } static GstCaps * -gst_avdtp_src_getcaps (GstPad * pad) +gst_avdtp_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter) { - GstAvdtpSrc *avdtpsrc = GST_AVDTP_SRC (gst_pad_get_parent_element (pad)); - GstCaps *ret = NULL; + GstAvdtpSrc *avdtpsrc = GST_AVDTP_SRC (bsrc); + GstCaps *caps = NULL, *ret = NULL; if (avdtpsrc->dev_caps) { const GValue *value; @@ -183,7 +179,7 @@ gst_avdtp_src_getcaps (GstPad * pad) if (g_str_equal (format, "audio/x-sbc")) { /* FIXME: we can return a fixed payload type once we * are in PLAYING */ - ret = gst_caps_new_simple ("application/x-rtp", + caps = gst_caps_new_simple ("application/x-rtp", "media", G_TYPE_STRING, "audio", "payload", GST_TYPE_INT_RANGE, 96, 127, "encoding-name", G_TYPE_STRING, "SBC", NULL); @@ -198,9 +194,16 @@ gst_avdtp_src_getcaps (GstPad * pad) } rate = g_value_get_int (value); - gst_caps_set_simple (ret, "clock-rate", G_TYPE_INT, rate, NULL); + gst_caps_set_simple (caps, "clock-rate", G_TYPE_INT, rate, NULL); + + if (filter) { + ret = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + } else + ret = caps; } else { - ret = gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad))); + GST_DEBUG_OBJECT (avdtpsrc, "device not open, using template caps"); + ret = GST_BASE_SRC_CLASS (parent_class)->get_caps (bsrc, filter); } return ret; @@ -282,22 +285,23 @@ gst_avdtp_src_stop (GstBaseSrc * bsrc) } static GstFlowReturn -gst_avdtp_src_create (GstBaseSrc * bsrc, guint64 offset, - guint length, GstBuffer ** outbuf) +gst_avdtp_src_create (GstBaseSrc * bsrc, guint64 offset, guint length, + GstBuffer ** outbuf) { GstAvdtpSrc *avdtpsrc = GST_AVDTP_SRC (bsrc); GstBuffer *buf = NULL; + GstMapInfo info; int ret; if (g_atomic_int_get (&avdtpsrc->unlocked)) - return GST_FLOW_WRONG_STATE; + return GST_FLOW_FLUSHING; /* We don't operate in GST_FORMAT_BYTES, so offset is ignored */ while ((ret = gst_poll_wait (avdtpsrc->poll, GST_CLOCK_TIME_NONE))) { if (g_atomic_int_get (&avdtpsrc->unlocked)) /* We're unlocked, time to gtfo */ - return GST_FLOW_WRONG_STATE; + return GST_FLOW_FLUSHING; if (ret < 0) /* Something went wrong */ @@ -308,8 +312,15 @@ gst_avdtp_src_create (GstBaseSrc * bsrc, guint64 offset, break; } - buf = gst_buffer_new_and_alloc (length); - ret = read (avdtpsrc->pfd.fd, GST_BUFFER_DATA (buf), length); + ret = GST_BASE_SRC_CLASS (parent_class)->alloc (bsrc, offset, length, outbuf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto alloc_failed; + + buf = *outbuf; + + gst_buffer_map (buf, &info, GST_MAP_WRITE); + + ret = read (avdtpsrc->pfd.fd, info.data, length); if (ret < 0) goto read_error; @@ -320,21 +331,25 @@ gst_avdtp_src_create (GstBaseSrc * bsrc, guint64 offset, goto eof; } + if (ret < length) + gst_buffer_set_size (buf, ret); + GST_LOG_OBJECT (avdtpsrc, "Read %d bytes", ret); - if (ret < (gint) length) { - /* Create a subbuffer for as much as we've actually read */ - *outbuf = gst_buffer_create_sub (buf, 0, ret); - gst_buffer_unref (buf); - } else - *outbuf = buf; + gst_buffer_unmap (buf, &info); + *outbuf = buf; return GST_FLOW_OK; +alloc_failed: + { + GST_DEBUG_OBJECT (bsrc, "alloc failed: %s", gst_flow_get_name (ret)); + return ret; + } + read_error: GST_ERROR_OBJECT (avdtpsrc, "Error while reading audio data: %s", strerror (errno)); - eof: gst_buffer_unref (buf); diff --git a/sys/bluez/gstavdtputil.c b/sys/bluez/gstavdtputil.c index bf23803db..b216ad8d4 100644 --- a/sys/bluez/gstavdtputil.c +++ b/sys/bluez/gstavdtputil.c @@ -319,7 +319,7 @@ gst_avdtp_util_parse_sbc_raw (void *config) GValue *list; gboolean mono, stereo; - structure = gst_structure_empty_new ("audio/x-sbc"); + structure = gst_structure_new_empty ("audio/x-sbc"); value = g_value_init (g_new0 (GValue, 1), G_TYPE_STRING); list = g_value_init (g_new0 (GValue, 1), GST_TYPE_LIST); @@ -490,7 +490,7 @@ gst_avdtp_util_parse_mpeg_raw (void *config) gboolean valid_layer = FALSE; gboolean mono, stereo; - structure = gst_structure_empty_new ("audio/mpeg"); + structure = gst_structure_new_empty ("audio/mpeg"); value = g_new0 (GValue, 1); g_value_init (value, G_TYPE_INT); |