2011-11-04 05:18:13 -07:00
|
|
|
#include "edje_private.h"
|
2013-01-28 08:05:49 -08:00
|
|
|
|
|
|
|
#ifdef ENABLE_MULTISENSE
|
|
|
|
#include "Ecore_Audio.h"
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2013-04-17 12:37:19 -07:00
|
|
|
static Eo *out = NULL;
|
2013-05-09 17:10:58 -07:00
|
|
|
static int outs = 0;
|
2020-03-17 09:07:49 -07:00
|
|
|
static Eina_List *ins = NULL;
|
2013-08-27 07:42:24 -07:00
|
|
|
static Eina_Bool outfail = EINA_FALSE;
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2016-06-20 07:31:31 -07:00
|
|
|
static void
|
2016-08-30 05:34:10 -07:00
|
|
|
_play_finished(void *data EINA_UNUSED, const Efl_Event *event)
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
2020-03-17 09:07:49 -07:00
|
|
|
ins = eina_list_remove(ins, event->object);
|
2018-04-11 10:38:21 -07:00
|
|
|
efl_unref(event->object);
|
2013-01-28 07:15:20 -08:00
|
|
|
}
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2020-02-16 22:35:57 -08:00
|
|
|
#if defined(_WIN32) || defined(HAVE_PULSE)
|
2016-06-20 07:31:31 -07:00
|
|
|
static void
|
2016-08-30 05:34:10 -07:00
|
|
|
_out_fail(void *data EINA_UNUSED, const Efl_Event *event)
|
2013-08-27 07:42:24 -07:00
|
|
|
{
|
|
|
|
outfail = EINA_TRUE;
|
2018-04-11 10:38:21 -07:00
|
|
|
efl_unref(event->object);
|
2013-08-27 07:42:24 -07:00
|
|
|
out = NULL;
|
|
|
|
}
|
2020-02-16 22:35:57 -08:00
|
|
|
#endif
|
2013-08-27 07:42:24 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
struct _edje_multisense_eet_data
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
2015-06-08 11:43:00 -07:00
|
|
|
unsigned int offset, length;
|
|
|
|
Eet_File *ef;
|
|
|
|
const char *data;
|
2013-01-28 07:15:20 -08:00
|
|
|
Ecore_Audio_Vio vio;
|
2011-11-04 05:18:13 -07:00
|
|
|
};
|
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
static int
|
2013-04-17 12:37:19 -07:00
|
|
|
eet_snd_file_get_length(void *data, Eo *eo_obj EINA_UNUSED)
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
2013-04-17 12:37:19 -07:00
|
|
|
struct _edje_multisense_eet_data *vf = data;
|
2013-01-28 07:15:20 -08:00
|
|
|
return vf->length;
|
|
|
|
}
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
static int
|
2013-04-17 12:37:19 -07:00
|
|
|
eet_snd_file_seek(void *data, Eo *eo_obj EINA_UNUSED, int offset, int whence)
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
2013-04-17 12:37:19 -07:00
|
|
|
struct _edje_multisense_eet_data *vf = data;
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
switch (whence)
|
2015-06-08 11:43:00 -07:00
|
|
|
{
|
2013-01-28 07:15:20 -08:00
|
|
|
case SEEK_SET:
|
|
|
|
vf->offset = offset;
|
2015-06-08 11:43:00 -07:00
|
|
|
break;
|
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
case SEEK_CUR:
|
|
|
|
vf->offset += offset;
|
|
|
|
break;
|
2015-06-08 11:43:00 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
case SEEK_END:
|
|
|
|
vf->offset = vf->length + offset;
|
2015-06-08 11:43:00 -07:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2013-01-28 07:15:20 -08:00
|
|
|
return vf->offset;
|
2011-11-04 05:18:13 -07:00
|
|
|
}
|
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
static int
|
2013-04-17 12:37:19 -07:00
|
|
|
eet_snd_file_read(void *data, Eo *eo_obj EINA_UNUSED, void *buffer, int count)
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
2013-04-17 12:37:19 -07:00
|
|
|
struct _edje_multisense_eet_data *vf = data;
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
if ((vf->offset + count) > vf->length)
|
|
|
|
count = vf->length - vf->offset;
|
|
|
|
memcpy(buffer, vf->data + vf->offset, count);
|
|
|
|
vf->offset += count;
|
|
|
|
return count;
|
|
|
|
}
|
2012-05-20 21:47:45 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
static int
|
2013-04-17 12:37:19 -07:00
|
|
|
eet_snd_file_tell(void *data, Eo *eo_obj EINA_UNUSED)
|
2013-01-28 07:15:20 -08:00
|
|
|
{
|
2013-04-17 12:37:19 -07:00
|
|
|
struct _edje_multisense_eet_data *vf = data;
|
2012-05-20 21:47:45 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
return vf->offset;
|
2011-11-04 05:18:13 -07:00
|
|
|
}
|
|
|
|
|
2014-02-09 02:08:12 -08:00
|
|
|
static void
|
|
|
|
_free(void *data)
|
2013-05-09 02:12:44 -07:00
|
|
|
{
|
2013-05-09 17:10:58 -07:00
|
|
|
struct _edje_multisense_eet_data *eet_data = data;
|
2013-05-09 02:12:44 -07:00
|
|
|
|
2013-05-09 17:10:58 -07:00
|
|
|
if (eet_data->ef) eet_close(eet_data->ef);
|
2015-06-08 11:43:00 -07:00
|
|
|
// don't free if eet_data->data comes from eet_read_direct
|
2013-05-09 16:04:14 -07:00
|
|
|
// free(eet_data->data);
|
2013-05-09 17:10:58 -07:00
|
|
|
free(data);
|
|
|
|
outs--;
|
2013-05-09 02:12:44 -07:00
|
|
|
}
|
2014-02-09 02:08:12 -08:00
|
|
|
|
|
|
|
static Eina_Bool _channel_mute_states[8] = { 0 };
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_channel_mute(Edje *ed EINA_UNUSED, int channel)
|
|
|
|
{
|
|
|
|
// ed lets use set mute per object... but for now no api's for this
|
|
|
|
// if all are muted ... then all!
|
|
|
|
if (_channel_mute_states[7]) return EINA_TRUE;
|
|
|
|
if ((channel < 0) || (channel > 7)) return EINA_FALSE;
|
|
|
|
return _channel_mute_states[channel];
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
edje_audio_channel_mute_set(Edje_Channel channel, Eina_Bool mute)
|
|
|
|
{
|
|
|
|
#ifdef ENABLE_MULTISENSE
|
2015-06-08 11:43:00 -07:00
|
|
|
if ((unsigned)channel > 7) return;
|
2014-02-09 02:08:12 -08:00
|
|
|
_channel_mute_states[channel] = mute;
|
|
|
|
#else
|
2015-06-08 11:43:00 -07:00
|
|
|
(void)channel;
|
|
|
|
(void)mute;
|
2013-05-09 02:55:36 -07:00
|
|
|
#endif
|
2014-02-09 02:08:12 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
edje_audio_channel_mute_get(Edje_Channel channel)
|
|
|
|
{
|
|
|
|
#ifdef ENABLE_MULTISENSE
|
2015-06-08 11:43:00 -07:00
|
|
|
if ((unsigned)channel > 7) return EINA_FALSE;
|
2014-02-09 02:08:12 -08:00
|
|
|
return _channel_mute_states[channel];
|
|
|
|
#else
|
2015-06-08 11:43:00 -07:00
|
|
|
(void)channel;
|
2018-08-16 07:16:34 -07:00
|
|
|
return EINA_TRUE;
|
2014-02-09 02:08:12 -08:00
|
|
|
#endif
|
|
|
|
}
|
2013-05-09 02:12:44 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
Eina_Bool
|
2014-02-09 02:08:12 -08:00
|
|
|
_edje_multisense_internal_sound_sample_play(Edje *ed, const char *sample_name, const double speed, int channel)
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
2014-02-09 02:08:12 -08:00
|
|
|
#ifdef ENABLE_MULTISENSE
|
2013-04-17 12:37:19 -07:00
|
|
|
Eo *in;
|
2011-11-04 05:18:13 -07:00
|
|
|
Edje_Sound_Sample *sample;
|
2013-01-28 07:15:20 -08:00
|
|
|
char snd_id_str[255];
|
2011-11-04 05:18:13 -07:00
|
|
|
int i;
|
2014-04-10 02:04:34 -07:00
|
|
|
Eina_Bool ret = EINA_FALSE;
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2014-02-09 02:08:12 -08:00
|
|
|
if (_channel_mute(ed, channel)) return EINA_FALSE;
|
2015-06-08 11:43:00 -07:00
|
|
|
|
2013-08-27 07:42:24 -07:00
|
|
|
if (outfail) return EINA_FALSE;
|
2015-06-08 11:43:00 -07:00
|
|
|
|
2013-08-27 07:42:24 -07:00
|
|
|
if (!sample_name)
|
|
|
|
{
|
|
|
|
ERR("Given Sample Name is NULL\n");
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2011-11-04 05:18:13 -07:00
|
|
|
|
|
|
|
if ((!ed) || (!ed->file) || (!ed->file->sound_dir))
|
2013-01-28 07:15:20 -08:00
|
|
|
return EINA_FALSE;
|
2011-11-04 05:18:13 -07:00
|
|
|
|
2015-06-08 11:43:00 -07:00
|
|
|
for (i = 0; i < (int)ed->file->sound_dir->samples_count; i++)
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
2015-06-08 11:43:00 -07:00
|
|
|
sample = &ed->file->sound_dir->samples[i];
|
|
|
|
if (!strcmp(sample->name, sample_name))
|
|
|
|
{
|
|
|
|
struct _edje_multisense_eet_data *eet_data;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
snprintf(snd_id_str, sizeof(snd_id_str), "edje/sounds/%i", sample->id);
|
|
|
|
|
|
|
|
eet_data = calloc(1, sizeof(struct _edje_multisense_eet_data));
|
|
|
|
if (!eet_data)
|
|
|
|
{
|
|
|
|
ERR("Out of memory in allocating multisense sample info");
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
// open eet file again to esnure we have reference because we
|
|
|
|
// use eet_read_direct to avoid duplicating/copying into memory
|
|
|
|
// by relying on a direct mmap, but this means we need to close
|
|
|
|
// the eet file handle instead of freeing data
|
|
|
|
eet_data->ef = eet_mmap(ed->file->f);
|
|
|
|
if (!eet_data->ef)
|
|
|
|
{
|
|
|
|
ERR("Cannot open edje file '%s' for samples", ed->path);
|
|
|
|
free(eet_data);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
eet_data->data = eet_read_direct(eet_data->ef, snd_id_str, &len);
|
|
|
|
if (len <= 0)
|
|
|
|
{
|
|
|
|
ERR("Sample form edj file '%s' is 0 length", ed->path);
|
|
|
|
eet_close(eet_data->ef);
|
|
|
|
free(eet_data);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
eet_data->length = len;
|
|
|
|
/* action->speed */
|
|
|
|
|
|
|
|
eet_data->vio.get_length = eet_snd_file_get_length;
|
|
|
|
eet_data->vio.seek = eet_snd_file_seek;
|
|
|
|
eet_data->vio.read = eet_snd_file_read;
|
|
|
|
eet_data->vio.tell = eet_snd_file_tell;
|
|
|
|
eet_data->offset = 0;
|
|
|
|
|
2018-04-11 10:38:21 -07:00
|
|
|
in = efl_add_ref(ECORE_AUDIO_IN_SNDFILE_CLASS, NULL, efl_name_set(efl_added, snd_id_str), ecore_audio_obj_in_speed_set(efl_added, speed), ecore_audio_obj_vio_set(efl_added, &eet_data->vio, eet_data, _free), efl_event_callback_add(efl_added, ECORE_AUDIO_IN_EVENT_IN_STOPPED, _play_finished, NULL));
|
2015-06-08 11:43:00 -07:00
|
|
|
if (!out)
|
|
|
|
{
|
2017-12-13 10:06:35 -08:00
|
|
|
|
2018-01-12 01:47:21 -08:00
|
|
|
# ifdef _WIN32
|
2018-04-11 10:38:21 -07:00
|
|
|
out = efl_add_ref(ECORE_AUDIO_OUT_WASAPI_CLASS, NULL, efl_event_callback_add(efl_added, ECORE_AUDIO_OUT_WASAPI_EVENT_CONTEXT_FAIL, _out_fail, NULL));
|
2018-01-12 01:47:21 -08:00
|
|
|
# else
|
|
|
|
# ifdef HAVE_PULSE
|
2018-04-11 10:38:21 -07:00
|
|
|
out = efl_add_ref(ECORE_AUDIO_OUT_PULSE_CLASS, NULL, efl_event_callback_add(efl_added, ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_FAIL, _out_fail, NULL));
|
2018-01-12 01:47:21 -08:00
|
|
|
# endif
|
|
|
|
# endif
|
2015-06-08 11:43:00 -07:00
|
|
|
if (out) outs++;
|
|
|
|
}
|
|
|
|
if (!out)
|
|
|
|
{
|
2018-01-12 01:47:21 -08:00
|
|
|
static Eina_Bool complained = EINA_FALSE;
|
|
|
|
|
|
|
|
if (!complained)
|
|
|
|
{
|
|
|
|
complained = EINA_TRUE;
|
|
|
|
# ifdef _WIN32
|
|
|
|
ERR("Could not create multisense audio out (wasapi)");
|
|
|
|
# else
|
|
|
|
# ifdef HAVE_PULSE
|
|
|
|
ERR("Could not create multisense audio out (pulse)");
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
}
|
2018-04-11 10:38:21 -07:00
|
|
|
efl_unref(in);
|
2015-06-08 11:43:00 -07:00
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2016-03-01 10:06:28 -08:00
|
|
|
ret = ecore_audio_obj_out_input_attach(out, in);
|
2015-06-08 11:43:00 -07:00
|
|
|
if (!ret)
|
|
|
|
{
|
2018-01-12 01:47:21 -08:00
|
|
|
static Eina_Bool complained = EINA_FALSE;
|
|
|
|
|
|
|
|
if (!complained)
|
|
|
|
{
|
|
|
|
complained = EINA_TRUE;
|
|
|
|
ERR("Could not attach input");
|
|
|
|
}
|
2018-04-11 10:38:21 -07:00
|
|
|
efl_unref(in);
|
2015-06-08 11:43:00 -07:00
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2020-03-17 09:07:49 -07:00
|
|
|
ins = eina_list_append(ins, in);
|
2015-06-08 11:43:00 -07:00
|
|
|
}
|
2012-05-20 21:47:45 -07:00
|
|
|
}
|
2013-01-28 07:15:20 -08:00
|
|
|
return EINA_TRUE;
|
2011-11-05 07:03:28 -07:00
|
|
|
#else
|
2012-01-16 04:34:13 -08:00
|
|
|
// warning shh
|
2015-06-08 11:43:00 -07:00
|
|
|
(void)ed;
|
|
|
|
(void)sample_name;
|
|
|
|
(void)speed;
|
|
|
|
(void)channel;
|
2013-01-28 07:15:20 -08:00
|
|
|
return EINA_FALSE;
|
2011-11-04 05:18:13 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
Eina_Bool
|
2014-02-09 02:08:12 -08:00
|
|
|
_edje_multisense_internal_sound_tone_play(Edje *ed, const char *tone_name, const double duration, int channel)
|
2011-11-04 05:18:13 -07:00
|
|
|
{
|
|
|
|
#ifdef ENABLE_MULTISENSE
|
2013-01-28 07:15:20 -08:00
|
|
|
unsigned int i;
|
|
|
|
Edje_Sound_Tone *tone;
|
2014-04-10 02:04:34 -07:00
|
|
|
Eina_Bool ret = EINA_FALSE;
|
2012-05-20 21:47:45 -07:00
|
|
|
|
2013-04-17 12:37:19 -07:00
|
|
|
Eo *in;
|
2012-05-20 21:47:45 -07:00
|
|
|
if (!tone_name)
|
|
|
|
{
|
2013-04-23 09:10:16 -07:00
|
|
|
ERR("Given Tone Name is NULL");
|
2012-05-20 21:47:45 -07:00
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2015-06-08 11:43:00 -07:00
|
|
|
|
2014-02-09 02:08:12 -08:00
|
|
|
if (_channel_mute(ed, channel)) return EINA_FALSE;
|
|
|
|
|
2013-08-27 07:42:24 -07:00
|
|
|
if (outfail) return EINA_FALSE;
|
2015-06-08 11:43:00 -07:00
|
|
|
|
2013-01-28 07:15:20 -08:00
|
|
|
if ((!ed) || (!ed->file) || (!ed->file->sound_dir))
|
|
|
|
return EINA_FALSE;
|
2012-05-20 21:47:45 -07:00
|
|
|
|
2015-06-08 11:43:00 -07:00
|
|
|
for (i = 0; i < ed->file->sound_dir->tones_count; i++)
|
2013-01-28 07:15:20 -08:00
|
|
|
{
|
|
|
|
tone = &ed->file->sound_dir->tones[i];
|
|
|
|
if (!strcmp(tone->name, tone_name))
|
|
|
|
{
|
2018-04-11 10:38:21 -07:00
|
|
|
in = efl_add_ref(ECORE_AUDIO_IN_TONE_CLASS, NULL);
|
2018-02-14 18:14:52 -08:00
|
|
|
efl_name_set(in, "tone");
|
2016-08-10 07:23:04 -07:00
|
|
|
efl_key_data_set(in, ECORE_AUDIO_ATTR_TONE_FREQ, &tone->value);
|
2016-03-01 10:06:28 -08:00
|
|
|
ecore_audio_obj_in_length_set(in, duration);
|
2016-08-10 07:23:04 -07:00
|
|
|
efl_event_callback_add(in, ECORE_AUDIO_IN_EVENT_IN_STOPPED, _play_finished, NULL);
|
2013-01-28 07:15:20 -08:00
|
|
|
|
|
|
|
if (!out)
|
2013-08-27 07:42:24 -07:00
|
|
|
{
|
2018-01-12 01:47:21 -08:00
|
|
|
# ifdef _WIN32
|
2018-04-11 10:38:21 -07:00
|
|
|
out = efl_add_ref(ECORE_AUDIO_OUT_WASAPI_CLASS, NULL, efl_event_callback_add(efl_added, ECORE_AUDIO_OUT_WASAPI_EVENT_CONTEXT_FAIL, _out_fail, NULL));
|
2018-01-12 01:47:21 -08:00
|
|
|
# else
|
|
|
|
# ifdef HAVE_PULSE
|
2018-04-11 10:38:21 -07:00
|
|
|
out = efl_add_ref(ECORE_AUDIO_OUT_PULSE_CLASS, NULL, efl_event_callback_add(efl_added, ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_FAIL, _out_fail, NULL));
|
2018-01-12 01:47:21 -08:00
|
|
|
# endif
|
|
|
|
# endif
|
2013-08-27 07:42:24 -07:00
|
|
|
if (out) outs++;
|
|
|
|
}
|
2013-01-28 07:15:20 -08:00
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
ret = ecore_audio_obj_out_input_attach(out, in);
|
2015-06-08 11:43:00 -07:00
|
|
|
if (!ret)
|
|
|
|
{
|
|
|
|
ERR("Could not attach input");
|
2018-04-11 10:38:21 -07:00
|
|
|
efl_unref(in);
|
2015-06-08 11:43:00 -07:00
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2013-01-28 07:15:20 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return EINA_TRUE;
|
2012-05-20 21:47:45 -07:00
|
|
|
#else
|
2012-01-16 04:34:13 -08:00
|
|
|
// warning shh
|
2015-06-08 11:43:00 -07:00
|
|
|
(void)ed;
|
|
|
|
(void)duration;
|
|
|
|
(void)tone_name;
|
|
|
|
(void)channel;
|
2013-01-28 07:15:20 -08:00
|
|
|
return EINA_FALSE;
|
2011-11-04 05:18:13 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2014-03-19 21:00:20 -07:00
|
|
|
Eina_Bool
|
|
|
|
_edje_multisense_internal_vibration_sample_play(Edje *ed EINA_UNUSED, const char *sample_name EINA_UNUSED, int repeat EINA_UNUSED)
|
|
|
|
{
|
|
|
|
#ifdef ENABLE_MULTISENSE
|
2015-06-08 11:43:00 -07:00
|
|
|
ERR("Vibration is not supported yet, name:%s, repeat:%d", sample_name, repeat);
|
|
|
|
return EINA_FALSE;
|
2014-03-19 21:00:20 -07:00
|
|
|
#else
|
2015-06-08 11:43:00 -07:00
|
|
|
(void)ed;
|
|
|
|
(void)repeat;
|
2014-03-19 21:00:20 -07:00
|
|
|
return EINA_FALSE;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2011-11-04 05:18:13 -07:00
|
|
|
void
|
|
|
|
_edje_multisense_init(void)
|
|
|
|
{
|
|
|
|
#ifdef ENABLE_MULTISENSE
|
2013-01-28 07:15:20 -08:00
|
|
|
ecore_audio_init();
|
2011-11-04 05:18:13 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_edje_multisense_shutdown(void)
|
|
|
|
{
|
|
|
|
#ifdef ENABLE_MULTISENSE
|
2020-03-17 09:07:49 -07:00
|
|
|
Eo *in;
|
2013-05-09 17:10:58 -07:00
|
|
|
if (outs > 0)
|
|
|
|
{
|
|
|
|
WRN("Shutting down audio while samples still playing");
|
|
|
|
}
|
|
|
|
if (out)
|
|
|
|
{
|
2020-03-17 09:07:28 -07:00
|
|
|
efl_unref(out);
|
2013-05-09 17:10:58 -07:00
|
|
|
out = NULL;
|
|
|
|
outs = 0;
|
|
|
|
}
|
2020-03-17 09:07:49 -07:00
|
|
|
EINA_LIST_FREE(ins, in)
|
|
|
|
efl_unref(in);
|
2013-01-28 07:15:20 -08:00
|
|
|
ecore_audio_shutdown();
|
2011-11-04 05:18:13 -07:00
|
|
|
#endif
|
|
|
|
}
|
2015-06-08 11:43:00 -07:00
|
|
|
|