ecore_audio: Add new eo-based ecore_audio objects
authorDaniel Willmann <d.willmann@samsung.com>
Thu, 11 Apr 2013 17:23:57 +0000 (18:23 +0100)
committerDaniel Willmann <d.willmann@samsung.com>
Thu, 18 Apr 2013 18:12:16 +0000 (19:12 +0100)
Signed-off-by: Daniel Willmann <d.willmann@samsung.com>
src/lib/ecore_audio/ecore_audio_obj.c [new file with mode: 0644]
src/lib/ecore_audio/ecore_audio_obj.h [new file with mode: 0644]
src/lib/ecore_audio/ecore_audio_obj_in.c [new file with mode: 0644]
src/lib/ecore_audio/ecore_audio_obj_in.h [new file with mode: 0644]
src/lib/ecore_audio/ecore_audio_obj_out.c [new file with mode: 0644]
src/lib/ecore_audio/ecore_audio_obj_out.h [new file with mode: 0644]

diff --git a/src/lib/ecore_audio/ecore_audio_obj.c b/src/lib/ecore_audio/ecore_audio_obj.c
new file mode 100644 (file)
index 0000000..fe1d261
--- /dev/null
@@ -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 (file)
index 0000000..f9ca278
--- /dev/null
@@ -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 (file)
index 0000000..3cab5ee
--- /dev/null
@@ -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 (file)
index 0000000..9ee04d4
--- /dev/null
@@ -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 (file)
index 0000000..f4d39fd
--- /dev/null
@@ -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 (file)
index 0000000..cbfd2ea
--- /dev/null
@@ -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
+