asdfuser pushed a commit to branch master.

commit bfc46016733657202bb94ee4a5d95a1cb12d9213
Author: Daniel Willmann <[email protected]>
Date:   Thu Apr 11 18:23:57 2013 +0100

    ecore_audio: Add new eo-based ecore_audio objects
    
    Signed-off-by: Daniel Willmann <[email protected]>
---
 src/lib/ecore_audio/ecore_audio_obj.c     | 133 +++++++++++++++++++
 src/lib/ecore_audio/ecore_audio_obj.h     |  97 ++++++++++++++
 src/lib/ecore_audio/ecore_audio_obj_in.c  | 213 ++++++++++++++++++++++++++++++
 src/lib/ecore_audio/ecore_audio_obj_in.h  | 113 ++++++++++++++++
 src/lib/ecore_audio/ecore_audio_obj_out.c | 132 ++++++++++++++++++
 src/lib/ecore_audio/ecore_audio_obj_out.h |  69 ++++++++++
 6 files changed, 757 insertions(+)

diff --git a/src/lib/ecore_audio/ecore_audio_obj.c 
b/src/lib/ecore_audio/ecore_audio_obj.c
new file mode 100644
index 0000000..fe1d261
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj.c
@@ -0,0 +1,133 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_FEATURES_H
+#include <features.h>
+#endif
+#include <ctype.h>
+#include <errno.h>
+
+#include <Eo.h>
+#include "ecore_audio_private.h"
+
+EAPI Eo_Op ECORE_AUDIO_OBJ_BASE_ID = EO_NOOP;
+
+#define MY_CLASS ECORE_AUDIO_OBJ_CLASS
+#define MY_CLASS_NAME "ecore_audio_obj"
+
+static void _name_set(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Object *obj = _pd;
+
+  const char *name = va_arg(*list, const char *);
+
+  eina_stringshare_replace(&obj->name, name);
+}
+
+static void _name_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Object *obj = _pd;
+
+  const char **name = va_arg(*list, const char **);
+
+  if (name)
+    *name = obj->name;
+}
+
+static void _paused_set(Eo *eo_obj, void *_pd, va_list *list)
+{
+  Ecore_Audio_Object *obj = _pd;
+
+  Eina_Bool paused = va_arg(*list, int);
+
+  obj->paused = paused;
+}
+
+static void _paused_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Object *obj = _pd;
+
+  Eina_Bool *ret = va_arg(*list, Eina_Bool *);
+
+  if (ret)
+    *ret = obj->paused;
+}
+
+static void _volume_set(Eo *eo_obj, void *_pd, va_list *list)
+{
+  Ecore_Audio_Object *obj = _pd;
+
+  double volume = va_arg(*list, double);
+
+  obj->volume = volume;
+}
+
+static void _volume_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Object *obj = _pd;
+
+  double *ret = va_arg(*list, double *);
+
+  if (ret)
+    *ret = obj->volume;
+}
+
+static void _constructor(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
+{
+  Ecore_Audio_Object *obj = _pd;
+
+  eo_do_super(eo_obj, MY_CLASS, eo_constructor());
+
+  obj->volume = 1.0;
+
+}
+
+static void _class_constructor(Eo_Class *klass)
+{
+  const Eo_Op_Func_Description func_desc[] = {
+      /* Virtual functions of parent class implemented in this class */
+      EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
+      //EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_DESTRUCTOR), _destructor),
+
+      /* Specific functions to this class */
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_NAME_SET), 
_name_set),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_NAME_GET), 
_name_get),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_PAUSED_SET), 
_paused_set),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_PAUSED_GET), 
_paused_get),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_VOLUME_SET), 
_volume_set),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_VOLUME_GET), 
_volume_get),
+      EO_OP_FUNC_SENTINEL
+  };
+
+  eo_class_funcs_set(klass, func_desc);
+}
+
+static const Eo_Op_Description op_desc[] = {
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_NAME_SET, "Sets the name of the 
object."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_NAME_GET, "Gets the name of the 
object."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_PAUSED_SET, "Sets the paused 
stated of the object."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_PAUSED_GET, "Gets the paused 
stated of the object."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_VOLUME_SET, "Sets the volume of 
the object."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_VOLUME_GET, "Gets the volume of 
the object."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_SOURCE_SET, "Sets the source of 
the object."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_SUB_ID_SOURCE_GET, "Gets the source of 
the object."),
+    EO_OP_DESCRIPTION_SENTINEL
+};
+
+static const Eo_Class_Description class_desc = {
+    EO_VERSION,
+    MY_CLASS_NAME,
+    EO_CLASS_TYPE_REGULAR,
+    EO_CLASS_DESCRIPTION_OPS(&ECORE_AUDIO_OBJ_BASE_ID, op_desc, 
ECORE_AUDIO_OBJ_SUB_ID_LAST),
+    NULL,
+    sizeof(Ecore_Audio_Object),
+    _class_constructor,
+    NULL
+};
+
+EO_DEFINE_CLASS(ecore_audio_obj_class_get, &class_desc, EO_BASE_CLASS, NULL);
diff --git a/src/lib/ecore_audio/ecore_audio_obj.h 
b/src/lib/ecore_audio/ecore_audio_obj.h
new file mode 100644
index 0000000..f9ca278
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj.h
@@ -0,0 +1,97 @@
+#ifndef ECORE_AUDIO_OBJ_H
+#define ECORE_AUDIO_OBJ_H
+
+#include <Eina.h>
+#include <Eo.h>
+
+#ifdef EAPI
+#undef EAPI
+#endif
+
+#ifdef __GNUC__
+#if __GNUC__ >= 4
+#define EAPI __attribute__ ((visibility("default")))
+#else
+#define EAPI
+#endif
+#else
+#define EAPI
+#endif
+
+/**
+ * @file ecore_audio_obj.h
+ * @brief Audio Object
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * @addtogroup Ecore_Audio_Group
+ * @{
+ */
+
+#define ECORE_AUDIO_OBJ_CLASS ecore_audio_obj_class_get()
+
+const Eo_Class *ecore_audio_obj_class_get() EINA_CONST;
+
+extern EAPI Eo_Op ECORE_AUDIO_OBJ_BASE_ID;
+
+enum
+{
+   ECORE_AUDIO_OBJ_SUB_ID_NAME_SET,
+   ECORE_AUDIO_OBJ_SUB_ID_NAME_GET,
+   ECORE_AUDIO_OBJ_SUB_ID_PAUSED_SET,
+   ECORE_AUDIO_OBJ_SUB_ID_PAUSED_GET,
+   ECORE_AUDIO_OBJ_SUB_ID_VOLUME_SET,
+   ECORE_AUDIO_OBJ_SUB_ID_VOLUME_GET,
+   ECORE_AUDIO_OBJ_SUB_ID_SOURCE_SET,
+   ECORE_AUDIO_OBJ_SUB_ID_SOURCE_GET,
+   ECORE_AUDIO_OBJ_SUB_ID_LAST
+};
+
+#define ECORE_AUDIO_OBJ_ID(sub_id) (ECORE_AUDIO_OBJ_BASE_ID + sub_id)
+
+/*
+ * @def ecore_audio_obj_name_set
+ * @since 1.8
+ *
+ * Sets the name of the object
+ *
+ * @param[in] name
+ */
+#define ecore_audio_obj_name_set(name) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_NAME_SET), EO_TYPECHECK(const char *, 
name)
+
+/*
+ * @def ecore_audio_obj_name_get
+ * @since 1.8
+ *
+ * Gets the name of the object
+ *
+ * @param[out] name
+ */
+#define ecore_audio_obj_name_get(name) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_NAME_GET), EO_TYPECHECK(const char 
**, name)
+
+#define ecore_audio_obj_paused_set(paused) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_PAUSED_SET), EO_TYPECHECK(Eina_Bool, 
paused)
+
+#define ecore_audio_obj_paused_get(ret) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_PAUSED_GET), EO_TYPECHECK(Eina_Bool 
*, ret)
+
+#define ecore_audio_obj_volume_set(volume) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_VOLUME_SET), EO_TYPECHECK(double, 
volume)
+
+#define ecore_audio_obj_volume_get(ret) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_VOLUME_GET), EO_TYPECHECK(double *, 
ret)
+
+#define ecore_audio_obj_source_set(source) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_SOURCE_SET), EO_TYPECHECK(const char 
*, source)
+
+#define ecore_audio_obj_source_get(source) 
ECORE_AUDIO_OBJ_ID(ECORE_AUDIO_OBJ_SUB_ID_SOURCE_GET), EO_TYPECHECK(const char 
**, source)
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/ecore_audio/ecore_audio_obj_in.c 
b/src/lib/ecore_audio/ecore_audio_obj_in.c
new file mode 100644
index 0000000..3cab5ee
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj_in.c
@@ -0,0 +1,213 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_FEATURES_H
+#include <features.h>
+#endif
+#include <ctype.h>
+#include <errno.h>
+
+#include "ecore_audio_private.h"
+
+EAPI Eo_Op ECORE_AUDIO_OBJ_IN_BASE_ID = EO_NOOP;
+
+#define MY_CLASS ECORE_AUDIO_OBJ_IN_CLASS
+#define MY_CLASS_NAME "ecore_audio_obj_in"
+
+static void _speed_set(Eo *eo_obj, void *_pd, va_list *list)
+{
+  Ecore_Audio_Input *obj = _pd;
+
+  double speed = va_arg(*list, double);
+
+  if (speed < 0.2)
+    speed = 0.2;
+  if (speed > 5.0)
+    speed = 5.0;
+
+  obj->speed = speed;
+
+  /* TODO: Notify output */
+
+}
+
+static void _speed_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Input *obj = _pd;
+
+  double *speed = va_arg(*list, double *);
+
+  if (speed)
+    *speed = obj->speed;
+}
+
+static void _samplerate_set(Eo *eo_obj, void *_pd, va_list *list)
+{
+  Ecore_Audio_Input *obj = _pd;
+
+  int samplerate = va_arg(*list, int);
+
+  obj->samplerate = samplerate;
+
+  /* TODO: Notify output */
+
+}
+
+static void _samplerate_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Input *obj = _pd;
+
+  int *samplerate = va_arg(*list, int *);
+
+  if (samplerate)
+    *samplerate = obj->samplerate;
+}
+
+static void _channels_set(Eo *eo_obj, void *_pd, va_list *list)
+{
+  Ecore_Audio_Input *obj = _pd;
+
+  int channels = va_arg(*list, int);
+
+  obj->channels = channels;
+
+  /* TODO: Notify output */
+
+}
+
+static void _channels_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Input *obj = _pd;
+
+  int *channels = va_arg(*list, int *);
+
+  if (channels)
+    *channels = obj->channels;
+}
+
+static void _read(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Input *obj = _pd;
+  int len_read = 0;
+
+  char *buf = va_arg(*list, char *);
+  int len = va_arg(*list, int);
+  int *ret = va_arg(*list, int *);
+
+  if (obj->paused) {
+    memset(buf, 0, len);
+    len_read = len;
+  } else {
+      /* FIXME: Module read func */
+      len_read = 0;
+      /* FIXME: Signals for loop/EOF */
+  }
+
+  if (ret)
+    *ret = len_read;
+}
+
+static void _remaining_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Input *obj = _pd;
+
+  double *ret = va_arg(*list, double *);
+
+  if (ret) {
+    eo_do(eo_obj, ecore_audio_obj_in_seek(SEEK_CUR, 0, ret));
+    *ret = obj->length - *ret;
+  }
+}
+
+static void _output_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Input *obj = _pd;
+
+  Eo **ret = va_arg(*list, Eo **);
+
+  if (ret)
+    *ret = obj->output;
+}
+
+static void _constructor(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
+{
+  Ecore_Audio_Input *obj = _pd;
+
+  eo_do_super(eo_obj, MY_CLASS, eo_constructor());
+
+  obj->speed = 1.0;
+}
+
+static void _destructor(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
+{
+  Ecore_Audio_Input *obj = _pd;
+
+  if(obj->output)
+    eo_do(obj->output, ecore_audio_obj_out_input_detach(eo_obj));
+
+  eo_do_super(eo_obj, MY_CLASS, eo_destructor());
+}
+
+static void _class_constructor(Eo_Class *klass)
+{
+  const Eo_Op_Func_Description func_desc[] = {
+      /* Virtual functions of parent class implemented in this class */
+      EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
+      EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_DESTRUCTOR), _destructor),
+
+      /* Specific functions to this class */
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_SET), 
_speed_set),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_GET), 
_speed_get),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_SET), 
_samplerate_set),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_GET), 
_samplerate_get),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_SET), 
_channels_set),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_GET), 
_channels_get),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_SET), 
NULL),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_GET), 
NULL),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_READ), _read),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SEEK), NULL),
+      EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_OUTPUT_GET), 
_output_get),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_REMAINING_GET), 
_remaining_get),
+
+      EO_OP_FUNC_SENTINEL
+  };
+
+  eo_class_funcs_set(klass, func_desc);
+}
+
+#define S(val) "Sets the " #val " of the input."
+#define G(val) "Gets the " #val " of the input."
+
+static const Eo_Op_Description op_desc[] = {
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_SET, S(speed)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_GET, G(speed)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_SET, S(samplerate)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_GET, G(samplerate)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_SET, S(channels)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_GET, G(channels)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_SET, S(preloaded)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_GET, G(preloaded)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_READ, "Read from the input"),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_SEEK, "Seek within the input"),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_OUTPUT_GET, G(output)),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_IN_SUB_ID_REMAINING_GET, G(remaining)),
+    EO_OP_DESCRIPTION_SENTINEL
+};
+
+static const Eo_Class_Description class_desc = {
+    EO_VERSION,
+    MY_CLASS_NAME,
+    EO_CLASS_TYPE_REGULAR,
+    EO_CLASS_DESCRIPTION_OPS(&ECORE_AUDIO_OBJ_IN_BASE_ID, op_desc, 
ECORE_AUDIO_OBJ_IN_SUB_ID_LAST),
+    NULL,
+    sizeof(Ecore_Audio_Input),
+    _class_constructor,
+    NULL
+};
+
+EO_DEFINE_CLASS(ecore_audio_obj_in_class_get, &class_desc, 
ECORE_AUDIO_OBJ_CLASS, NULL);
diff --git a/src/lib/ecore_audio/ecore_audio_obj_in.h 
b/src/lib/ecore_audio/ecore_audio_obj_in.h
new file mode 100644
index 0000000..9ee04d4
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj_in.h
@@ -0,0 +1,113 @@
+#ifndef ECORE_AUDIO_OBJ_IN_H
+#define ECORE_AUDIO_OBJ_IN_H
+
+#include <Eina.h>
+#include <Eo.h>
+
+#ifdef EAPI
+#undef EAPI
+#endif
+
+#ifdef __GNUC__
+#if __GNUC__ >= 4
+#define EAPI __attribute__ ((visibility("default")))
+#else
+#define EAPI
+#endif
+#else
+#define EAPI
+#endif
+
+/**
+ * @file ecore_audio_obj_in.h
+ * @brief Audio Input Object
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * @addtogroup Ecore_Audio_Group
+ * @{
+ */
+
+#define ECORE_AUDIO_OBJ_IN_CLASS ecore_audio_obj_in_class_get()
+
+const Eo_Class *ecore_audio_obj_in_class_get() EINA_CONST;
+
+extern EAPI Eo_Op ECORE_AUDIO_OBJ_IN_BASE_ID;
+
+enum
+{
+   ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_SET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_GET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_SET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_GET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_SET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_GET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_SET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_GET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_READ,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_SEEK,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_OUTPUT_GET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_REMAINING_GET,
+   ECORE_AUDIO_OBJ_IN_SUB_ID_LAST
+};
+
+#define ECORE_AUDIO_OBJ_IN_ID(sub_id) (ECORE_AUDIO_OBJ_IN_BASE_ID + sub_id)
+
+/*
+ * @def ecore_audio_obj_in_speed_set
+ * @since 1.8
+ *
+ * Sets the playback speed of the input
+ *
+ * @param[in] speed
+ */
+#define ecore_audio_obj_in_speed_set(speed) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_SET), 
EO_TYPECHECK(double, speed)
+
+/*
+ * @def ecore_audio_obj_in_speed_get
+ * @since 1.8
+ *
+ * Gets the playback speed of the input
+ *
+ * @param[out] speed
+ */
+#define ecore_audio_obj_in_speed_get(speed) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SPEED_GET), EO_TYPECHECK(double 
*, speed)
+
+
+#define ecore_audio_obj_in_samplerate_set(samplerate) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_SET), 
EO_TYPECHECK(int, samplerate)
+
+#define ecore_audio_obj_in_samplerate_get(samplerate) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SAMPLERATE_GET), 
EO_TYPECHECK(int *, samplerate)
+
+#define ecore_audio_obj_in_channels_set(channels) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_SET), 
EO_TYPECHECK(int, channels)
+
+#define ecore_audio_obj_in_channels_get(channels) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_CHANNELS_GET), EO_TYPECHECK(int 
*, channels)
+
+#define ecore_audio_obj_in_preloaded_set(preloaded) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_SET), 
EO_TYPECHECK(Eina_Bool, preloaded)
+
+#define ecore_audio_obj_in_preloaded_get(preloaded) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_PRELOADED_GET), 
EO_TYPECHECK(Eina_Bool *, preloaded)
+
+#define ecore_audio_obj_in_read(buf, len, ret) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_READ), EO_TYPECHECK(char *, 
buf), EO_TYPECHECK(int, len), EO_TYPECHECK(int *, ret)
+
+#define ecore_audio_obj_in_seek(mode, offs, ret) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_SEEK), EO_TYPECHECK(int, mode), 
EO_TYPECHECK(double, offs), EO_TYPECHECK(double *, ret)
+
+#define ecore_audio_obj_in_output_get(ret) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_OUTPUT_GET), EO_TYPECHECK(Eo 
**, ret)
+
+#define ecore_audio_obj_in_remaining_get(ret) 
ECORE_AUDIO_OBJ_IN_ID(ECORE_AUDIO_OBJ_IN_SUB_ID_REMAINING_GET), 
EO_TYPECHECK(double *, ret)
+
+
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/src/lib/ecore_audio/ecore_audio_obj_out.c 
b/src/lib/ecore_audio/ecore_audio_obj_out.c
new file mode 100644
index 0000000..f4d39fd
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj_out.c
@@ -0,0 +1,132 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_FEATURES_H
+#include <features.h>
+#endif
+#include <ctype.h>
+#include <errno.h>
+
+#include "ecore_audio_private.h"
+
+EAPI Eo_Op ECORE_AUDIO_OBJ_OUT_BASE_ID = EO_NOOP;
+
+#define MY_CLASS ECORE_AUDIO_OBJ_OUT_CLASS
+#define MY_CLASS_NAME "ecore_audio_obj_out"
+
+static void _input_attach(Eo *eo_obj, void *_pd, va_list *list)
+{
+  Ecore_Audio_Output *obj = _pd;
+  Ecore_Audio_Input *in;
+
+  Eo *input = va_arg(*list, Eo *);
+
+  in = eo_data_get(input, ECORE_AUDIO_OBJ_IN_CLASS);
+
+  if (in->output) eo_do(in->output, ecore_audio_obj_out_input_detach(input));
+  in->output = eo_obj;
+
+  /* TODO: Check type is input
+   * Get private data
+   * Send event */
+
+  obj->inputs = eina_list_append(obj->inputs, input);
+
+}
+
+static void _input_detach(Eo *eo_obj, void *_pd, va_list *list)
+{
+  Ecore_Audio_Output *obj = _pd;
+  Ecore_Audio_Input *in;
+
+  Eo *input = va_arg(*list, Eo *);
+
+  in = eo_data_get(input, ECORE_AUDIO_OBJ_IN_CLASS);
+
+  in->output = NULL;
+
+  /* TODO: Check type is input
+   * Get private data
+   * Send event */
+
+  obj->inputs = eina_list_remove(obj->inputs, input);
+
+}
+
+static void _inputs_get(Eo *eo_obj, void *_pd, va_list *list)
+{
+  const Ecore_Audio_Output *obj = _pd;
+
+  Eina_List **inputs = va_arg(*list, Eina_List **);
+
+  if (inputs)
+    *inputs = obj->inputs;
+}
+
+
+static void _constructor(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
+{
+  const Ecore_Audio_Output *obj = _pd;
+
+  eo_do_super(eo_obj, MY_CLASS, eo_constructor());
+
+}
+
+static void _destructor(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
+{
+  const Ecore_Audio_Output *obj = _pd;
+  Eina_List *cur, *tmp;
+  Eo *in;
+
+  EINA_LIST_FOREACH_SAFE(obj->inputs, cur, tmp, in) {
+      eo_do(eo_obj, ecore_audio_obj_out_input_detach(in));
+  }
+
+  eo_do_super(eo_obj, MY_CLASS, eo_destructor());
+}
+
+static void _class_constructor(Eo_Class *klass)
+{
+  const Eo_Op_Func_Description func_desc[] = {
+      /* Virtual functions of parent class implemented in this class */
+      EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
+      EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_DESTRUCTOR), _destructor),
+
+      /* Specific functions to this class */
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_OUT_ID(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_ATTACH), 
_input_attach),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_OUT_ID(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_DETACH), 
_input_detach),
+      
EO_OP_FUNC(ECORE_AUDIO_OBJ_OUT_ID(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUTS_GET), 
_inputs_get),
+
+      EO_OP_FUNC_SENTINEL
+  };
+
+  eo_class_funcs_set(klass, func_desc);
+}
+
+#define S(val) "Sets the " #val " of the output."
+#define G(val) "Gets the " #val " of the output."
+
+static const Eo_Op_Description op_desc[] = {
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_ATTACH, "Add an 
input."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_DETACH, "Delete an 
input."),
+    EO_OP_DESCRIPTION(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUTS_GET, "Get the 
connected inputs."),
+    EO_OP_DESCRIPTION_SENTINEL
+};
+
+static const Eo_Class_Description class_desc = {
+    EO_VERSION,
+    MY_CLASS_NAME,
+    EO_CLASS_TYPE_REGULAR,
+    EO_CLASS_DESCRIPTION_OPS(&ECORE_AUDIO_OBJ_OUT_BASE_ID, op_desc, 
ECORE_AUDIO_OBJ_OUT_SUB_ID_LAST),
+    NULL,
+    sizeof(Ecore_Audio_Output),
+    _class_constructor,
+    NULL
+};
+
+EO_DEFINE_CLASS(ecore_audio_obj_out_class_get, &class_desc, 
ECORE_AUDIO_OBJ_CLASS, NULL);
diff --git a/src/lib/ecore_audio/ecore_audio_obj_out.h 
b/src/lib/ecore_audio/ecore_audio_obj_out.h
new file mode 100644
index 0000000..cbfd2ea
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj_out.h
@@ -0,0 +1,69 @@
+#ifndef ECORE_AUDIO_OBJ_OUT_H
+#define ECORE_AUDIO_OBJ_OUT_H
+
+#include <Eina.h>
+#include <Eo.h>
+
+#ifdef EAPI
+#undef EAPI
+#endif
+
+#ifdef __GNUC__
+#if __GNUC__ >= 4
+#define EAPI __attribute__ ((visibility("default")))
+#else
+#define EAPI
+#endif
+#else
+#define EAPI
+#endif
+
+/**
+ * @file ecore_audio_obj_out.h
+ * @brief Audio Output Object
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * @addtogroup Ecore_Audio_Group
+ * @{
+ */
+
+#define ECORE_AUDIO_OBJ_OUT_CLASS ecore_audio_obj_out_class_get()
+
+const Eo_Class *ecore_audio_obj_out_class_get() EINA_CONST;
+
+extern EAPI Eo_Op ECORE_AUDIO_OBJ_OUT_BASE_ID;
+
+enum
+{
+   ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_ATTACH,
+   ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_DETACH,
+   ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUTS_GET,
+   ECORE_AUDIO_OBJ_OUT_SUB_ID_LAST
+};
+
+#define ECORE_AUDIO_OBJ_OUT_ID(sub_id) (ECORE_AUDIO_OBJ_OUT_BASE_ID + sub_id)
+
+#define ecore_audio_obj_out_input_attach(input) 
ECORE_AUDIO_OBJ_OUT_ID(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_ATTACH), 
EO_TYPECHECK(Eo *, input)
+
+#define ecore_audio_obj_out_input_detach(input) 
ECORE_AUDIO_OBJ_OUT_ID(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUT_DETACH), 
EO_TYPECHECK(Eo *, input)
+
+#define ecore_audio_obj_out_inputs_get(input) 
ECORE_AUDIO_OBJ_OUT_ID(ECORE_AUDIO_OBJ_OUT_SUB_ID_INPUTS_GET), 
EO_TYPECHECK(Eina_List **, input)
+
+
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to