--- /dev/null
+#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);
--- /dev/null
+#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
--- /dev/null
+#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);
--- /dev/null
+#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
+
--- /dev/null
+#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);
--- /dev/null
+#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
+