/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
 *
 *
 *  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_SINK_H
#define __GST_AVDTP_SINK_H

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

G_BEGIN_DECLS
#define GST_TYPE_AVDTP_SINK \
	(gst_avdtp_sink_get_type())
#define GST_AVDTP_SINK(obj) \
	(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVDTP_SINK,\
		GstAvdtpSink))
#define GST_AVDTP_SINK_CLASS(klass) \
	(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVDTP_SINK,\
		GstAvdtpSinkClass))
#define GST_IS_AVDTP_SINK(obj) \
	(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVDTP_SINK))
#define GST_IS_AVDTP_SINK_CLASS(obj) \
	(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVDTP_SINK))
typedef struct _GstAvdtpSink GstAvdtpSink;
typedef struct _GstAvdtpSinkClass GstAvdtpSinkClass;

struct _GstAvdtpSink
{
  GstBaseSink sink;

  GstAvdtpConnection conn;

  gboolean autoconnect;

  /* mp3 stream data (outside caps data) */
  gint mp3_using_crc;
  gint channel_mode;

  /* stream connection data */
  GstCaps *stream_caps;

  GstCaps *dev_caps;

  GMutex sink_lock;

  guint watch_id;
};

struct _GstAvdtpSinkClass
{
  GstBaseSinkClass parent_class;
};

GType gst_avdtp_sink_get_type (void);

GstCaps *gst_avdtp_sink_get_device_caps (GstAvdtpSink * sink);
gboolean gst_avdtp_sink_set_device_caps (GstAvdtpSink * sink, GstCaps * caps);

guint gst_avdtp_sink_get_link_mtu (GstAvdtpSink * sink);

void gst_avdtp_sink_set_device (GstAvdtpSink * sink, const gchar * device);

void gst_avdtp_sink_set_transport (GstAvdtpSink * sink,
    const gchar * transport);

gchar *gst_avdtp_sink_get_device (GstAvdtpSink * sink);

gchar *gst_avdtp_sink_get_transport (GstAvdtpSink * sink);

gboolean gst_avdtp_sink_plugin_init (GstPlugin * plugin);

void gst_avdtp_sink_set_crc (GstAvdtpSink * self, gboolean crc);

void gst_avdtp_sink_set_channel_mode (GstAvdtpSink * self, const gchar * mode);


G_END_DECLS
#endif /* __GST_AVDTP_SINK_H */
