/* GStreamer
 * Copyright (C) 2013 Olivier Crete <olivier.crete@collabora.com>
 *
 * gstglobaldevicemonitor.c: Global device monitor
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */


#ifndef __GST_GLOBAL_DEVICE_MONITOR_H__
#define __GST_GLOBAL_DEVICE_MONITOR_H__

#include <gst/gstobject.h>
#include <gst/gstdevice.h>
#include <gst/gstdevicemonitor.h>
#include <gst/gstdevicemonitorfactory.h>

G_BEGIN_DECLS

typedef struct _GstGlobalDeviceMonitor GstGlobalDeviceMonitor;
typedef struct _GstGlobalDeviceMonitorPrivate GstGlobalDeviceMonitorPrivate;
typedef struct _GstGlobalDeviceMonitorClass GstGlobalDeviceMonitorClass;

#define GST_TYPE_GLOBAL_DEVICE_MONITOR                 (gst_global_device_monitor_get_type())
#define GST_IS_GLOBAL_DEVICE_MONITOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GLOBAL_DEVICE_MONITOR))
#define GST_IS_GLOBAL_DEVICE_MONITOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GLOBAL_DEVICE_MONITOR))
#define GST_GLOBAL_DEVICE_MONITOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GLOBAL_DEVICE_MONITOR, GstGlobalDeviceMonitorClass))
#define GST_GLOBAL_DEVICE_MONITOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GLOBAL_DEVICE_MONITOR, GstGlobalDeviceMonitor))
#define GST_GLOBAL_DEVICE_MONITOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GLOBAL_DEVICE_MONITOR, GstGlobalDeviceMonitorClass))
#define GST_GLOBAL_DEVICE_MONITOR_CAST(obj)            ((GstGlobalDeviceMonitor *)(obj))

/**
 * GstGlobalDeviceMonitor:
 * @parent: the parent #GstObject structure
 *
 * Opaque global device monitor object structure.
 *
 * Since: 1.4
 */
struct _GstGlobalDeviceMonitor {
  GstObject                parent;

  /*< private >*/

  GstGlobalDeviceMonitorPrivate *priv;

  gpointer _gst_reserved[GST_PADDING];
};

/**
 * GstGlobalDeviceMonitorClass:
 * @parent_class: the parent #GstObjectClass structure
 *
 * Opaque global device monitor class structure.
 *
 * Since: 1.4
 */
struct _GstGlobalDeviceMonitorClass {
  GstObjectClass           parent_class;

  /*< private >*/
  gpointer _gst_reserved[GST_PADDING];
};

GType     gst_global_device_monitor_get_type (void);

GstGlobalDeviceMonitor * gst_global_device_monitor_new  (void);

GstBus *  gst_global_device_monitor_get_bus (GstGlobalDeviceMonitor * monitor);

GList *   gst_global_device_monitor_get_devices (GstGlobalDeviceMonitor * monitor);


gboolean  gst_global_device_monitor_start (GstGlobalDeviceMonitor * monitor);

void      gst_global_device_monitor_stop  (GstGlobalDeviceMonitor * monitor);


void      gst_global_device_monitor_set_classes_filter (GstGlobalDeviceMonitor * monitor,
                                                        const gchar            * classes);

gchar *   gst_global_device_monitor_get_classes_filter (GstGlobalDeviceMonitor * monitor);


void      gst_global_device_monitor_set_caps_filter (GstGlobalDeviceMonitor * monitor,
                                                     GstCaps                * caps);

GstCaps * gst_global_device_monitor_get_caps_filter (GstGlobalDeviceMonitor * monitor);

G_END_DECLS

#endif /* __GST_GLOBAL_DEVICE_MONITOR_H__ */
