/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2012  Collabora Ltd.
 *
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifndef __GST_AVDTP_SRC_H
#define __GST_AVDTP_SRC_H

#include <gst/gst.h>
#include <gst/base/gstbasesrc.h>
#include "gstavdtputil.h"

G_BEGIN_DECLS
#define GST_TYPE_AVDTP_SRC \
	(gst_avdtp_src_get_type())
#define GST_AVDTP_SRC(obj) \
	(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVDTP_SRC, GstAvdtpSrc))
#define GST_AVDTP_SRC_CLASS(klass) \
	(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVDTP_SRC, GstAvdtpSrc))
#define GST_IS_AVDTP_SRC(obj) \
	(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVDTP_SRC))
#define GST_IS_AVDTP_SRC_CLASS(obj) \
	(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVDTP_SRC))
typedef struct _GstAvdtpSrc GstAvdtpSrc;
typedef struct _GstAvdtpSrcClass GstAvdtpSrcClass;

struct _GstAvdtpSrcClass
{
  GstBaseSrcClass parentclass;
};

struct _GstAvdtpSrc
{
  GstBaseSrc basesrc;

  GstAvdtpConnection conn;
  GstCaps *dev_caps;

  GstPoll *poll;
  GstPollFD pfd;
  volatile gint unlocked;
};

GType gst_avdtp_src_get_type (void);

gboolean gst_avdtp_src_plugin_init (GstPlugin * plugin);

G_END_DECLS
#endif
