ecore_audio: Add tests case

The sounds used are in the public domain and were taken from
freesound.org

Signed-off-by: Daniel Willmann <d.willmann@samsung.com>

SVN revision: 81004
This commit is contained in:
Daniel Willmann 2012-12-14 23:38:40 +00:00 committed by Daniel Willmann
parent 1c68e42f25
commit 6c054fc7ec
9 changed files with 397 additions and 1 deletions

View File

@ -104,20 +104,30 @@ tests_ecore_ecore_suite_CPPFLAGS = \
-I$(top_srcdir)/src/lib/eina \
-I$(top_srcdir)/src/lib/eo \
-I$(top_srcdir)/src/lib/ecore \
-I$(top_srcdir)/src/lib/ecore_audio \
-I$(top_srcdir)/src/lib/ecore_con \
-I$(top_srcdir)/src/lib/ecore_file \
-I$(top_srcdir)/src/lib/ecore_x \
-I$(top_builddir)/src/lib/eina \
-I$(top_builddir)/src/lib/eo \
-I$(top_builddir)/src/lib/ecore \
-I$(top_builddir)/src/lib/ecore_audio \
-I$(top_builddir)/src/lib/ecore_con \
-I$(top_builddir)/src/lib/ecore_file \
-I$(top_builddir)/src/lib/ecore_x \
-DTESTS_SRC_DIR=\"$(top_srcdir)\" \
-DTESTS_SRC_DIR=\"`pwd`/$(top_srcdir)\" \
@CHECK_CFLAGS@
tests_ecore_ecore_suite_LDADD = \
lib/ecore_con/libecore_con.la \
lib/ecore_file/libecore_file.la \
lib/ecore/libecore.la \
lib/eina/libeina.la \
@CHECK_LIBS@
if HAVE_ECORE_AUDIO
tests_ecore_ecore_suite_SOURCES += tests/ecore/ecore_test_ecore_audio.c
tests_ecore_ecore_suite_LDADD += lib/ecore_audio/libecore_audio.la
endif
endif

View File

@ -57,6 +57,7 @@ lib/eina/libeina.la \
@ECORE_EVAS_LIBS@ \
@EFL_COV_LIBS@
lib_ecore_evas_libecore_evas_la_LIBADD += @EFL_COV_LIBS@
lib_ecore_evas_libecore_evas_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
# Engines

View File

@ -48,4 +48,6 @@ lib/ecore/libecore.la \
lib/eo/libeo.la \
lib/eina/libeina.la
lib_ecore_file_libecore_file_la_LIBADD += @EFL_COV_LIBS@
lib_ecore_file_libecore_file_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@

View File

@ -34,6 +34,7 @@ lib/eo/libeo.la \
lib/eina/libeina.la \
@EFL_COV_LIBS@
lib_ecore_input_libecore_input_la_LIBADD += @EFL_COV_LIBS@
lib_ecore_input_libecore_input_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
installed_ecoreinputevasmainheadersdir = $(includedir)/ecore-@VMAJ@

View File

@ -21,6 +21,9 @@ static const Ecore_Test_Case etc[] = {
{ "Ecore", ecore_test_ecore },
{ "Ecore_Con", ecore_test_ecore_con },
{ "Ecore_X", ecore_test_ecore_x },
#if HAVE_ECORE_AUDIO
{ "Ecore Audio", ecore_test_ecore_audio},
#endif
{ NULL, NULL }
};

View File

@ -6,6 +6,7 @@
void ecore_test_ecore(TCase *tc);
void ecore_test_ecore_con(TCase *tc);
void ecore_test_ecore_x(TCase *tc);
void ecore_test_ecore_audio(TCase *tc);
#endif /* _ECORE_SUITE_H */

View File

@ -0,0 +1,378 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <Ecore_Audio.h>
#include "ecore_suite.h"
#include <stdio.h>
#include <Ecore.h>
#include <Ecore_Audio.h>
#define SF_FORMAT_RAW 0x040000
#define SF_FORMAT_PCM_U8 0x0005
#define SOUNDS_DIR TESTS_SRC_DIR"/src/tests/ecore/"
Ecore_Audio_Object *out;
Ecore_Audio_Object *in;
Eina_Bool
seek(void *data)
{
double offs;
fail_if(ecore_audio_input_seek(in, 0, SEEK_SET) != 0);
fail_if(ecore_audio_input_seek(in, 1, SEEK_CUR) != 1);
offs = ecore_audio_input_seek(in, -1, SEEK_END);
fail_if((offs > 1.001) || (offs < 0.999));
fail_if(ecore_audio_input_seek(in, SEEK_CUR, 10) != -1);
fail_if(ecore_audio_input_seek(in, 5, 0) != -1);
fail_if(ecore_audio_input_seek(in, 0, SEEK_SET) != 0);
}
Eina_Bool
input_del(void *data)
{
printf("Deleting input\n");
ecore_audio_input_del(in);
return EINA_FALSE;
}
Eina_Bool
output_add(void *data)
{
out = ecore_audio_output_add(ECORE_AUDIO_TYPE_SNDFILE);
fail_if(!out);
ecore_audio_output_sndfile_filename_set(out, SOUNDS_DIR"tmp.ogg");
printf("Adding input\n");
ecore_audio_output_input_add(out, in);
return EINA_FALSE;
}
Eina_Bool
_quit(void *data)
{
printf("Deleting output\n");
ecore_audio_output_del(out);
printf("Quitting\n");
ecore_main_loop_quit();
}
START_TEST(ecore_test_ecore_audio_cleanup)
{
in = ecore_audio_input_add(ECORE_AUDIO_TYPE_TONE);
fail_if(!in);
ecore_audio_input_tone_frequency_set(in, 1000);
ecore_audio_input_tone_duration_set(in, 2);
ecore_timer_add(1, output_add, NULL);
ecore_timer_add(2, seek, NULL);
ecore_timer_add(3.3, input_del, NULL);
ecore_timer_add(4, _quit, NULL);
ecore_main_loop_begin();
ecore_file_remove(SOUNDS_DIR"tmp.ogg");
}
END_TEST
Eina_Bool
output_add_default(void *data)
{
out = ecore_audio_output_add(ECORE_AUDIO_TYPE_PULSE);
fail_if(!out);
printf("Adding input\n");
ecore_audio_output_input_add(out, in);
return EINA_FALSE;
}
Eina_Bool
input_resume(void *data)
{
double pos;
fail_if(ecore_audio_input_paused_get(in) != EINA_TRUE);
fail_if(ecore_audio_input_seek(in, 0, SEEK_CUR) != 0);
ecore_audio_input_paused_set(in, EINA_FALSE);
ecore_audio_input_looped_set(in, EINA_TRUE);
return EINA_FALSE;
}
Eina_Bool
input_pause_seek(void *data)
{
double pos;
fail_if(ecore_audio_input_paused_get(in) != EINA_FALSE);
ecore_audio_input_paused_set(in, EINA_TRUE);
pos = ecore_audio_input_seek(in, 0, SEEK_CUR);
fail_if(ecore_audio_input_seek(in, 0, SEEK_SET) != 0);
pos = ecore_audio_input_seek(in, 0, SEEK_CUR);
fail_if(pos > 0.01);
ecore_timer_add(0.2, input_resume, NULL);
return EINA_FALSE;
}
Eina_Bool looped(void *data, int type, void *event)
{
Ecore_Audio_Object *in = (Ecore_Audio_Object *)event;
fail_if(!in);
fail_if(!ecore_audio_input_looped_get(in));
ecore_audio_input_looped_set(in, EINA_FALSE);
ecore_audio_input_seek(in, -0.5, SEEK_END);
}
Eina_Bool play_done(void *data, int type, void *event)
{
Ecore_Audio_Object *in = (Ecore_Audio_Object *)event;
Eina_List *ins;
fail_if(!in);
ins = ecore_audio_output_inputs_get(out);
fail_if(eina_list_count(ins) != 1);
fail_if(eina_list_data_get(ins) != in);
ecore_audio_output_input_del(ecore_audio_input_output_get(in), in);
ecore_audio_input_del(in);
ecore_audio_output_del(out);
ecore_main_loop_quit();
}
START_TEST(ecore_test_ecore_audio_default)
{
in = ecore_audio_input_add(ECORE_AUDIO_TYPE_SNDFILE);
ecore_audio_input_name_set(in, "modem.wav");
ecore_audio_input_sndfile_filename_set(in, SOUNDS_DIR"modem.wav");
ecore_timer_add(1, output_add_default, NULL);
ecore_timer_add(1.2, input_pause_seek, NULL);
ecore_event_handler_add(ECORE_AUDIO_INPUT_LOOPED, looped, NULL);
ecore_event_handler_add(ECORE_AUDIO_INPUT_ENDED, play_done, NULL);
ecore_main_loop_begin();
}
END_TEST
START_TEST(ecore_test_ecore_audio_sndfile)
{
double len;
in = ecore_audio_input_add(ECORE_AUDIO_TYPE_SNDFILE);
fail_if(!in);
ecore_audio_input_userdata_set(in, &len);
ecore_audio_input_name_set(in, "sms.ogg");
ecore_audio_input_sndfile_filename_set(in, SOUNDS_DIR"sms.ogg");
fail_if(ecore_audio_input_channels_get(in) != 2);
fail_if(ecore_audio_input_samplerate_get(in) != 44100);
len = ecore_audio_input_length_get(in);
// fail_if(len == 0);
// fail_if(len != ecore_audio_input_remaining_get(in));
fail_if(strcmp("sms.ogg", ecore_audio_input_name_get(in)));
fail_if(ecore_audio_input_userdata_get(in) != &len);
ecore_audio_input_del(in);
}
END_TEST
struct buffer {
int offset;
int length;
unsigned char data[1024];
};
int _get_length(Ecore_Audio_Object *in)
{
struct buffer *buf = ecore_audio_input_userdata_get(in);
return buf->length;
}
int _seek(Ecore_Audio_Object *in, int offs, int whence)
{
struct buffer *buf = ecore_audio_input_userdata_get(in);
switch (whence) {
case SEEK_SET:
buf->offset = offs;
break;
case SEEK_CUR:
buf->offset += offs;
break;
case SEEK_END:
buf->offset = buf->length + offs;
break;
}
return buf->offset;
}
int _tell(Ecore_Audio_Object *in)
{
struct buffer *buf = ecore_audio_input_userdata_get(in);
return buf->offset;
}
int _read(Ecore_Audio_Object *in, void *buffer, int length)
{
struct buffer *buf = ecore_audio_input_userdata_get(in);
if ((buf->offset + length) > buf->length)
length = buf->length - buf->offset;
memcpy(buffer, buf->data + buf->offset, length);
buf->offset += length;
return length;
}
int _write(Ecore_Audio_Object *out, const void *buffer, int length)
{
struct buffer *buf = ecore_audio_output_userdata_get(out);
if ((buf->offset + length) > buf->length)
length = buf->length - buf->offset;
memcpy(buf->data + buf->offset, buffer, length);
buf->offset += length;
return length;
}
Ecore_Audio_Vio vio = {
.get_length = _get_length,
.seek = _seek,
.tell = _tell,
.read = _read,
.write = _write,
};
Eina_Bool sndfile_done(void *data, int type, void *event)
{
Ecore_Audio_Object *in = (Ecore_Audio_Object *)event;
ecore_audio_input_seek(in, 0, SEEK_SET);
ecore_audio_input_del(in);
ecore_audio_output_del(out);
ecore_main_loop_quit();
}
START_TEST(ecore_test_ecore_audio_sndfile_vio)
{
struct buffer indata = {
.length = 1000,
.offset = 0,
};
for (int i=0; i < 1000; i++) {
indata.data[i] = i%256;
}
struct buffer outdata = {
.length = 1000,
.offset = 0,
};
for (int i=0; i < 1000; i++) {
outdata.data[i] = 0;
}
in = ecore_audio_input_add(ECORE_AUDIO_TYPE_SNDFILE);
fail_if(!in);
ecore_audio_input_name_set(in, "tmp");
ecore_audio_input_channels_set(in, 1);
ecore_audio_input_samplerate_set(in, 44100);
ecore_audio_input_userdata_set(in, &indata);
ecore_audio_input_sndfile_format_set(in, SF_FORMAT_RAW | SF_FORMAT_PCM_U8);
ecore_audio_input_sndfile_vio_set(in, &vio);
out = ecore_audio_output_add(ECORE_AUDIO_TYPE_SNDFILE);
fail_if(!out);
ecore_audio_output_name_set(out, "tmp");
ecore_audio_output_sndfile_format_set(out, SF_FORMAT_RAW | SF_FORMAT_PCM_U8);
ecore_audio_output_userdata_set(out, &outdata);
ecore_audio_output_sndfile_vio_set(out, &vio);
ecore_audio_output_input_add(out, in);
ecore_event_handler_add(ECORE_AUDIO_INPUT_ENDED, sndfile_done, NULL);
ecore_main_loop_begin();
// Off-by-one...must be libsndfile float conversion error?!
for (int i = 0; i<1000; i++) {
fail_if(indata.data[i] - outdata.data[i] > 1);
fail_if(indata.data[i] - outdata.data[i] < -1);
}
}
END_TEST
START_TEST(ecore_test_ecore_audio_custom)
{
in = ecore_audio_input_add(ECORE_AUDIO_TYPE_CUSTOM);
ecore_audio_input_del(in);
}
END_TEST
START_TEST(ecore_test_ecore_audio_init)
{
int ret;
ret = ecore_audio_init();
fail_if(ret != 2);
ret = ecore_audio_shutdown();
fail_if(ret != 1);
}
END_TEST
void setup(void)
{
int ret;
ret = eina_init();
ret = ecore_init();
ret = ecore_audio_init();
}
void teardown(void)
{
int ret;
ret = ecore_audio_shutdown();
ret = ecore_shutdown();
ret = eina_shutdown();
}
void
ecore_test_ecore_audio(TCase *tc)
{
tcase_add_checked_fixture (tc, setup, teardown);
tcase_add_test(tc, ecore_test_ecore_audio_init);
tcase_add_test(tc, ecore_test_ecore_audio_default);
tcase_add_test(tc, ecore_test_ecore_audio_sndfile);
tcase_add_test(tc, ecore_test_ecore_audio_sndfile_vio);
tcase_add_test(tc, ecore_test_ecore_audio_custom);
tcase_add_test(tc, ecore_test_ecore_audio_cleanup);
}

BIN
src/tests/ecore/modem.wav Normal file

Binary file not shown.

BIN
src/tests/ecore/sms.ogg Normal file

Binary file not shown.