summaryrefslogtreecommitdiff
path: root/src/lib/ecore_audio/ecore_audio_obj_out.c
blob: 141d26bc17a124d5b2100d4f0cc142116305cd2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#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 *);
  Eina_Bool *ret = va_arg(*list, Eina_Bool *);

  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);

  if (ret)
    *ret = EINA_TRUE;
}

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);