/*
 *  GStreamer pulseaudio plugin
 *
 *  Copyright (c) 2004-2008 Lennart Poettering
 *
 *  gst-pulse 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.
 *
 *  gst-pulse 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 gst-pulse; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 *  USA.
 */

#ifndef __GST_PULSEPROBE_H__
#define __GST_PULSEPROBE_H__

#include <gst/gst.h>

G_BEGIN_DECLS

#include <gst/interfaces/propertyprobe.h>
#include <pulse/pulseaudio.h>
#include <pulse/thread-mainloop.h>

typedef struct _GstPulseProbe GstPulseProbe;

struct _GstPulseProbe
{
  GObject *object;
  gchar *server;
  GList *devices;
  gboolean devices_valid;

  pa_threaded_mainloop *mainloop;
  pa_context *context;

  GList *properties;
  guint prop_id;

  int enumerate_sinks, enumerate_sources;
  int operation_success;
};

GstPulseProbe *gst_pulseprobe_new (GObject *object, GObjectClass * klass,
    guint prop_id, const gchar * server, gboolean sinks, gboolean sources);
void gst_pulseprobe_free (GstPulseProbe * probe);

const GList *gst_pulseprobe_get_properties (GstPulseProbe * probe);

gboolean gst_pulseprobe_needs_probe (GstPulseProbe * probe, guint prop_id,
    const GParamSpec * pspec);
void gst_pulseprobe_probe_property (GstPulseProbe * probe, guint prop_id,
    const GParamSpec * pspec);
GValueArray *gst_pulseprobe_get_values (GstPulseProbe * probe, guint prop_id,
    const GParamSpec * pspec);

void gst_pulseprobe_set_server (GstPulseProbe * c, const gchar * server);

#define GST_IMPLEMENT_PULSEPROBE_METHODS(Type, interface_as_function)           \
static const GList*                                                             \
interface_as_function ## _get_properties(GstPropertyProbe * probe)              \
{                                                                               \
  Type *this = (Type*) probe;                                                   \
                                                                                \
  g_return_val_if_fail(this != NULL, NULL);                                     \
  g_return_val_if_fail(this->probe != NULL, NULL);                              \
                                                                                \
  return gst_pulseprobe_get_properties(this->probe);                            \
}                                                                               \
static gboolean                                                                 \
interface_as_function ## _needs_probe(GstPropertyProbe *probe, guint prop_id,   \
    const GParamSpec *pspec)                                                    \
{                                                                               \
  Type *this = (Type*) probe;                                                   \
                                                                                \
  g_return_val_if_fail(this != NULL, FALSE);                                    \
  g_return_val_if_fail(this->probe != NULL, FALSE);                             \
                                                                                \
  return gst_pulseprobe_needs_probe(this->probe, prop_id, pspec);               \
}                                                                               \
static void                                                                     \
interface_as_function ## _probe_property(GstPropertyProbe *probe,               \
    guint prop_id, const GParamSpec *pspec)                                     \
{                                                                               \
  Type *this = (Type*) probe;                                                   \
                                                                                \
  g_return_if_fail(this != NULL);                                               \
  g_return_if_fail(this->probe != NULL);                                        \
                                                                                \
  gst_pulseprobe_probe_property(this->probe, prop_id, pspec);                   \
}                                                                               \
static GValueArray*                                                             \
interface_as_function ## _get_values(GstPropertyProbe *probe, guint prop_id,    \
    const GParamSpec *pspec)                                                    \
{                                                                               \
  Type *this = (Type*) probe;                                                   \
                                                                                \
  g_return_val_if_fail(this != NULL, NULL);                                     \
  g_return_val_if_fail(this->probe != NULL, NULL);                              \
                                                                                \
  return gst_pulseprobe_get_values(this->probe, prop_id, pspec);                \
}                                                                               \
static void                                                                     \
interface_as_function ## _property_probe_interface_init(GstPropertyProbeInterface *iface)\
{                                                                               \
  iface->get_properties = interface_as_function ## _get_properties;             \
  iface->needs_probe = interface_as_function ## _needs_probe;                   \
  iface->probe_property = interface_as_function ## _probe_property;             \
  iface->get_values = interface_as_function ## _get_values;                     \
}

G_END_DECLS

#endif
