static gboolean gst_avdtp_src_start (GstBaseSrc * bsrc) { GstAvdtpSrc *avdtpsrc = GST_AVDTP_SRC (bsrc); /* None of this can go into prepare() since we need to set up the * connection to figure out what format the device is going to send us. */ if (!gst_avdtp_connection_acquire (&avdtpsrc->conn, FALSE)) { GST_ERROR_OBJECT (avdtpsrc, "Failed to acquire connection"); return FALSE; } if (!gst_avdtp_connection_get_properties (&avdtpsrc->conn)) { GST_ERROR_OBJECT (avdtpsrc, "Failed to get transport properties"); goto fail; } if (!gst_avdtp_connection_conf_recv_stream_fd (&avdtpsrc->conn)) { GST_ERROR_OBJECT (avdtpsrc, "Failed to configure stream fd"); goto fail; } GST_DEBUG_OBJECT (avdtpsrc, "Setting block size to link MTU (%d)", avdtpsrc->conn.data.link_mtu); gst_base_src_set_blocksize (GST_BASE_SRC (avdtpsrc), avdtpsrc->conn.data.link_mtu); avdtpsrc->dev_caps = gst_avdtp_connection_get_caps (&avdtpsrc->conn); if (!avdtpsrc->dev_caps) { GST_ERROR_OBJECT (avdtpsrc, "Failed to get device caps"); goto fail; } gst_poll_fd_init (&avdtpsrc->pfd); avdtpsrc->pfd.fd = g_io_channel_unix_get_fd (avdtpsrc->conn.stream); gst_poll_add_fd (avdtpsrc->poll, &avdtpsrc->pfd); gst_poll_fd_ctl_read (avdtpsrc->poll, &avdtpsrc->pfd, TRUE); gst_poll_set_flushing (avdtpsrc->poll, FALSE); g_atomic_int_set (&avdtpsrc->unlocked, FALSE); /* The life time of the connection is shorter than the src object, so we * don't need to worry about memory management */ gst_avdtp_connection_notify_volume (&avdtpsrc->conn, G_OBJECT (avdtpsrc), "transport-volume"); gst_avdtp_src_start_avrcp (avdtpsrc); return TRUE; fail: gst_avdtp_connection_release (&avdtpsrc->conn); return FALSE; }
static gboolean gst_avdtp_src_stop (GstBaseSrc * bsrc) { GstAvdtpSrc *avdtpsrc = GST_AVDTP_SRC (bsrc); gst_poll_remove_fd (avdtpsrc->poll, &avdtpsrc->pfd); gst_poll_set_flushing (avdtpsrc->poll, TRUE); gst_avdtp_connection_release (&avdtpsrc->conn); if (avdtpsrc->dev_caps) { gst_caps_unref (avdtpsrc->dev_caps); avdtpsrc->dev_caps = NULL; } return TRUE; }