static gboolean gst_dtmf_detect_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps) { GstDtmfDetect *self = GST_DTMF_DETECT (trans); zap_dtmf_detect_init (&self->dtmf_state); return TRUE; }
static gboolean gst_dtmf_detect_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps) { GstDtmfDetect *self = GST_DTMF_DETECT (trans); gst_dtmf_detect_state_reset (self); return TRUE; }
static void gst_dtmf_detect_finalize (GObject * object) { GstDtmfDetect *self = GST_DTMF_DETECT (object); if (self->dtmf_state) dtmf_rx_free (self->dtmf_state); G_OBJECT_CLASS (gst_dtmf_detect_parent_class)->finalize (object); }
static gboolean gst_dtmf_detect_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps) { GstDtmfDetect *self = GST_DTMF_DETECT (trans); GstStructure *s = gst_caps_get_structure (incaps, 0); if (!gst_structure_get_int (s, "rate", &self->rate)) return FALSE; zap_dtmf_detect_init (&self->dtmf_state); return TRUE; }
static gboolean gst_dtmf_detect_event (GstBaseTransform * trans, GstEvent * event) { GstDtmfDetect *self = GST_DTMF_DETECT (trans); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: zap_dtmf_detect_init (&self->dtmf_state); break; default: break; } return GST_CALL_PARENT_WITH_DEFAULT (GST_BASE_TRANSFORM_CLASS, event, (trans, event), TRUE); }
static gboolean gst_dtmf_detect_sink_event (GstBaseTransform * trans, GstEvent * event) { GstDtmfDetect *self = GST_DTMF_DETECT (trans); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_dtmf_detect_state_reset (self); break; default: break; } return GST_BASE_TRANSFORM_CLASS (gst_dtmf_detect_parent_class)->sink_event (trans, event); }
static GstFlowReturn gst_dtmf_detect_transform_ip (GstBaseTransform * trans, GstBuffer * buf) { GstDtmfDetect *self = GST_DTMF_DETECT (trans); gint dtmf_count; gchar dtmfbuf[MAX_DTMF_DIGITS] = ""; gint i; if (GST_BUFFER_IS_DISCONT (buf)) zap_dtmf_detect_init (&self->dtmf_state); if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP)) return GST_FLOW_OK; zap_dtmf_detect (&self->dtmf_state, (int16_t *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf) / 2, FALSE); dtmf_count = zap_dtmf_get (&self->dtmf_state, dtmfbuf, MAX_DTMF_DIGITS); if (dtmf_count) GST_DEBUG_OBJECT (self, "Got %d DTMF events: %s", dtmf_count, dtmfbuf); else GST_LOG_OBJECT (self, "Got no DTMF events"); for (i = 0; i < dtmf_count; i++) { GstMessage *dtmf_message = NULL; GstStructure *structure; gint dtmf_payload_event; GST_DEBUG_OBJECT (self, "Got DTMF event %c", dtmfbuf[i]); switch (dtmfbuf[i]) { case '0': dtmf_payload_event = 0; break; case '1': dtmf_payload_event = 1; break; case '2': dtmf_payload_event = 2; break; case '3': dtmf_payload_event = 3; break; case '4': dtmf_payload_event = 4; break; case '5': dtmf_payload_event = 5; break; case '6': dtmf_payload_event = 6; break; case '7': dtmf_payload_event = 7; break; case '8': dtmf_payload_event = 8; break; case '9': dtmf_payload_event = 9; break; case '*': dtmf_payload_event = 10; break; case '#': dtmf_payload_event = 11; break; case 'A': dtmf_payload_event = 12; break; case 'B': dtmf_payload_event = 13; break; case 'C': dtmf_payload_event = 14; break; case 'D': dtmf_payload_event = 15; break; default: continue; } structure = gst_structure_new ("dtmf-event", "type", G_TYPE_INT, 1, "number", G_TYPE_INT, dtmf_payload_event, "method", G_TYPE_INT, 2, NULL); dtmf_message = gst_message_new_element (GST_OBJECT (self), structure); gst_element_post_message (GST_ELEMENT (self), dtmf_message); } return GST_FLOW_OK; }