2013-04-12 11:11:15 -07:00
|
|
|
#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 <Eo.h>
|
|
|
|
#include "ecore_audio_private.h"
|
|
|
|
#include <math.h>
|
|
|
|
|
2014-06-02 06:47:59 -07:00
|
|
|
#define MY_CLASS ECORE_AUDIO_IN_TONE_CLASS
|
2013-11-07 03:16:01 -08:00
|
|
|
#define MY_CLASS_NAME "Ecore_Audio_In_Tone"
|
2013-04-12 11:11:15 -07:00
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
struct _Ecore_Audio_In_Tone_Data
|
2013-04-12 11:11:15 -07:00
|
|
|
{
|
|
|
|
int freq;
|
|
|
|
int phase;
|
|
|
|
};
|
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
typedef struct _Ecore_Audio_In_Tone_Data Ecore_Audio_In_Tone_Data;
|
2013-04-12 11:11:15 -07:00
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
EOLIAN static ssize_t
|
|
|
|
_ecore_audio_in_tone_ecore_audio_in_read_internal(Eo *eo_obj, Ecore_Audio_In_Tone_Data *obj, void *data, size_t len)
|
2013-04-12 11:11:15 -07:00
|
|
|
{
|
2014-03-27 05:05:41 -07:00
|
|
|
size_t i, remain;
|
2016-08-15 06:44:41 -07:00
|
|
|
Ecore_Audio_Input *in_obj = efl_data_scope_get(eo_obj, ECORE_AUDIO_IN_CLASS);
|
2013-04-12 11:11:15 -07:00
|
|
|
|
|
|
|
float *val = data;
|
|
|
|
|
|
|
|
remain = in_obj->length * in_obj->samplerate * 4 - obj->phase * 4;
|
|
|
|
if (remain > len)
|
|
|
|
remain = len;
|
|
|
|
|
|
|
|
for (i=0; i<remain/4; i++) {
|
|
|
|
val[i] = sin(2* M_PI * obj->freq * (obj->phase + i) / in_obj->samplerate);
|
|
|
|
}
|
|
|
|
|
|
|
|
obj->phase += i;
|
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
return remain;
|
2013-04-12 11:11:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
EOLIAN static double
|
|
|
|
_ecore_audio_in_tone_ecore_audio_in_seek(Eo *eo_obj, Ecore_Audio_In_Tone_Data *obj, double offs, int mode)
|
2013-04-12 11:11:15 -07:00
|
|
|
{
|
|
|
|
int tmp;
|
2016-08-15 06:44:41 -07:00
|
|
|
Ecore_Audio_Input *in_obj = efl_data_scope_get(eo_obj, ECORE_AUDIO_IN_CLASS);
|
2013-04-12 11:11:15 -07:00
|
|
|
|
|
|
|
switch (mode) {
|
|
|
|
case SEEK_SET:
|
|
|
|
tmp = offs * in_obj->samplerate;
|
|
|
|
break;
|
|
|
|
case SEEK_CUR:
|
|
|
|
tmp = obj->phase + offs * in_obj->samplerate;
|
|
|
|
break;
|
|
|
|
case SEEK_END:
|
|
|
|
tmp = (in_obj->length + offs) * in_obj->samplerate;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if ((tmp < 0) || (tmp > in_obj->length * in_obj->samplerate))
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
obj->phase = tmp;
|
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
return (double)obj->phase / in_obj->samplerate;
|
2013-04-12 11:11:15 -07:00
|
|
|
err:
|
2014-03-27 05:05:41 -07:00
|
|
|
return -1.0;
|
2013-04-12 11:11:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_ecore_audio_in_tone_ecore_audio_in_length_set(Eo *eo_obj, Ecore_Audio_In_Tone_Data *_pd EINA_UNUSED, double length)
|
2013-04-17 10:43:51 -07:00
|
|
|
{
|
2016-08-15 06:44:41 -07:00
|
|
|
Ecore_Audio_Input *in_obj = efl_data_scope_get(eo_obj, ECORE_AUDIO_IN_CLASS);
|
2013-04-17 10:43:51 -07:00
|
|
|
in_obj->length = length;
|
|
|
|
}
|
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
EOLIAN static void
|
2016-08-10 07:23:04 -07:00
|
|
|
_ecore_audio_in_tone_efl_object_key_data_set(Eo *eo_obj, Ecore_Audio_In_Tone_Data *obj, const char *key, const void *val)
|
2013-04-17 10:43:51 -07:00
|
|
|
{
|
|
|
|
if (!key) return;
|
|
|
|
|
|
|
|
if (!strcmp(key, ECORE_AUDIO_ATTR_TONE_FREQ)) {
|
|
|
|
obj->freq = *(int *)val;
|
|
|
|
} else {
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_key_data_set(efl_super(eo_obj, MY_CLASS), key, val);
|
2013-04-17 10:43:51 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-05-17 09:02:37 -07:00
|
|
|
EOLIAN static void *
|
2016-08-10 07:23:04 -07:00
|
|
|
_ecore_audio_in_tone_efl_object_key_data_get(Eo *eo_obj, Ecore_Audio_In_Tone_Data *obj, const char *key)
|
2013-04-17 10:43:51 -07:00
|
|
|
{
|
|
|
|
if (!strcmp(key, ECORE_AUDIO_ATTR_TONE_FREQ)) {
|
2014-04-02 06:34:47 -07:00
|
|
|
return (void *) (intptr_t) obj->freq;
|
2013-04-17 10:43:51 -07:00
|
|
|
} else {
|
2016-08-15 06:44:41 -07:00
|
|
|
return efl_key_data_get(efl_super(eo_obj, MY_CLASS), key);
|
2013-04-17 10:43:51 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-19 03:41:27 -07:00
|
|
|
EOLIAN static Eo *
|
2016-08-10 07:23:04 -07:00
|
|
|
_ecore_audio_in_tone_efl_object_constructor(Eo *eo_obj, Ecore_Audio_In_Tone_Data *obj)
|
2013-04-12 11:11:15 -07:00
|
|
|
{
|
2016-08-15 06:44:41 -07:00
|
|
|
Ecore_Audio_Input *in_obj = efl_data_scope_get(eo_obj, ECORE_AUDIO_IN_CLASS);
|
2013-04-12 11:11:15 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
|
2013-04-12 11:11:15 -07:00
|
|
|
|
|
|
|
in_obj->channels = 1;
|
|
|
|
in_obj->samplerate = 44100;
|
|
|
|
in_obj->length = 1;
|
2013-04-19 07:28:00 -07:00
|
|
|
in_obj->seekable = EINA_TRUE;
|
2013-04-12 11:11:15 -07:00
|
|
|
|
|
|
|
obj->freq = 1000;
|
2015-05-19 03:41:27 -07:00
|
|
|
|
|
|
|
return eo_obj;
|
2013-04-12 11:11:15 -07:00
|
|
|
}
|
|
|
|
|
2017-04-26 07:18:49 -07:00
|
|
|
#define ECORE_AUDIO_IN_TONE_EXTRA_OPS \
|
|
|
|
EFL_OBJECT_OP_FUNC(efl_key_data_set, _ecore_audio_in_tone_efl_object_key_data_set), \
|
|
|
|
EFL_OBJECT_OP_FUNC(efl_key_data_get, _ecore_audio_in_tone_efl_object_key_data_get)
|
|
|
|
|
2014-03-27 05:05:41 -07:00
|
|
|
#include "ecore_audio_in_tone.eo.c"
|