This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch fix-release-build
in repository efl.
View the commit online.
commit 8ed2e42b91f8f6a3274274086a9bddc5a2732b70
Author: Carsten Haitzler <[email protected]>
AuthorDate: Tue Sep 8 16:53:34 2026 +0100
ecore-audio - add a system api wrapper that abstracts to system audio
---
src/lib/ecore_audio/Ecore_Audio.h | 1 +
src/lib/ecore_audio/ecore_audio_obj_out_system.c | 150 +++++++++++++++++++++++
src/lib/ecore_audio/ecore_audio_obj_out_system.h | 14 +++
src/lib/ecore_audio/ecore_audio_out_system.eo | 27 ++++
src/lib/ecore_audio/meson.build | 3 +
5 files changed, 195 insertions(+)
diff --git a/src/lib/ecore_audio/Ecore_Audio.h b/src/lib/ecore_audio/Ecore_Audio.h
index 35b59d3c6e..2d7500892f 100644
--- a/src/lib/ecore_audio/Ecore_Audio.h
+++ b/src/lib/ecore_audio/Ecore_Audio.h
@@ -214,6 +214,7 @@ ECORE_AUDIO_API void ecore_audio_obj_name_set(Efl_Object* obj, co
#include <ecore_audio_obj.h>
#include <ecore_audio_obj_in.h>
#include <ecore_audio_obj_out.h>
+#include <ecore_audio_obj_out_system.h>
#include <ecore_audio_obj_in_sndfile.h>
#include <ecore_audio_obj_out_sndfile.h>
diff --git a/src/lib/ecore_audio/ecore_audio_obj_out_system.c b/src/lib/ecore_audio/ecore_audio_obj_out_system.c
new file mode 100644
index 0000000000..30b08795c6
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj_out_system.c
@@ -0,0 +1,150 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "ecore_audio_private.h"
+
+#define MY_CLASS ECORE_AUDIO_OUT_SYSTEM_CLASS
+
+typedef struct
+{
+ Eo *backend;
+ Ecore_Job *ready_job;
+} Ecore_Audio_Out_System_Data;
+
+#if defined(_WIN32) || defined(HAVE_PULSE)
+static void
+_context_ready_cb(void *data, const Efl_Event *event)
+{
+ efl_event_callback_call(data, ECORE_AUDIO_OUT_SYSTEM_EVENT_CONTEXT_READY,
+ event->info);
+}
+
+static void
+_context_fail_cb(void *data, const Efl_Event *event)
+{
+ efl_event_callback_call(data, ECORE_AUDIO_OUT_SYSTEM_EVENT_CONTEXT_FAIL,
+ event->info);
+}
+#endif
+
+#ifdef _WIN32
+static void
+_stop_cb(void *data, const Efl_Event *event)
+{
+ efl_event_callback_call(data, ECORE_AUDIO_OUT_SYSTEM_EVENT_STOP, event->info);
+}
+
+static void
+_ready_job(void *data)
+{
+ Ecore_Audio_Out_System_Data *pd = efl_data_scope_get(data, MY_CLASS);
+
+ pd->ready_job = NULL;
+ efl_event_callback_call(data, ECORE_AUDIO_OUT_SYSTEM_EVENT_CONTEXT_READY, NULL);
+}
+#endif
+
+EOLIAN static Eo *
+_ecore_audio_out_system_efl_object_constructor(Eo *eo_obj, Ecore_Audio_Out_System_Data *pd)
+{
+ eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
+ if (!eo_obj) return NULL;
+
+#ifdef _WIN32
+ pd->backend = efl_add_ref(ECORE_AUDIO_OUT_WASAPI_CLASS, NULL);
+#elif defined(HAVE_PULSE)
+ pd->backend = efl_add_ref(ECORE_AUDIO_OUT_PULSE_CLASS, NULL);
+#else
+ ERR("No system audio output backend was compiled in");
+#endif
+ if (!pd->backend) return NULL;
+
+#ifdef _WIN32
+ efl_event_callback_add(pd->backend, ECORE_AUDIO_OUT_WASAPI_EVENT_CONTEXT_READY,
+ _context_ready_cb, eo_obj);
+ efl_event_callback_add(pd->backend, ECORE_AUDIO_OUT_WASAPI_EVENT_CONTEXT_FAIL,
+ _context_fail_cb, eo_obj);
+ efl_event_callback_add(pd->backend, ECORE_AUDIO_OUT_WASAPI_EVENT_STOP,
+ _stop_cb, eo_obj);
+ /* WASAPI initializes synchronously and does not emit context,ready. */
+ pd->ready_job = ecore_job_add(_ready_job, eo_obj);
+#elif defined(HAVE_PULSE)
+ efl_event_callback_add(pd->backend, ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_READY,
+ _context_ready_cb, eo_obj);
+ efl_event_callback_add(pd->backend, ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_FAIL,
+ _context_fail_cb, eo_obj);
+#endif
+ return eo_obj;
+}
+
+EOLIAN static void
+_ecore_audio_out_system_efl_object_destructor(Eo *eo_obj, Ecore_Audio_Out_System_Data *pd)
+{
+ if (pd->ready_job) ecore_job_del(pd->ready_job);
+ if (pd->backend)
+ {
+#ifdef _WIN32
+ efl_event_callback_del(pd->backend, ECORE_AUDIO_OUT_WASAPI_EVENT_CONTEXT_READY,
+ _context_ready_cb, eo_obj);
+ efl_event_callback_del(pd->backend, ECORE_AUDIO_OUT_WASAPI_EVENT_CONTEXT_FAIL,
+ _context_fail_cb, eo_obj);
+ efl_event_callback_del(pd->backend, ECORE_AUDIO_OUT_WASAPI_EVENT_STOP,
+ _stop_cb, eo_obj);
+#elif defined(HAVE_PULSE)
+ efl_event_callback_del(pd->backend, ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_READY,
+ _context_ready_cb, eo_obj);
+ efl_event_callback_del(pd->backend, ECORE_AUDIO_OUT_PULSE_EVENT_CONTEXT_FAIL,
+ _context_fail_cb, eo_obj);
+#endif
+ efl_unref(pd->backend);
+ pd->backend = NULL;
+ }
+ efl_destructor(efl_super(eo_obj, MY_CLASS));
+}
+
+EOLIAN static void
+_ecore_audio_out_system_ecore_audio_volume_set(Eo *eo_obj EINA_UNUSED, Ecore_Audio_Out_System_Data *pd, double volume)
+{
+ ecore_audio_obj_volume_set(pd->backend, volume);
+}
+
+EOLIAN static double
+_ecore_audio_out_system_ecore_audio_volume_get(const Eo *eo_obj EINA_UNUSED, Ecore_Audio_Out_System_Data *pd)
+{
+ return ecore_audio_obj_volume_get(pd->backend);
+}
+
+EOLIAN static void
+_ecore_audio_out_system_ecore_audio_paused_set(Eo *eo_obj EINA_UNUSED, Ecore_Audio_Out_System_Data *pd, Eina_Bool paused)
+{
+ ecore_audio_obj_paused_set(pd->backend, paused);
+}
+
+EOLIAN static Eina_Bool
+_ecore_audio_out_system_ecore_audio_paused_get(const Eo *eo_obj EINA_UNUSED, Ecore_Audio_Out_System_Data *pd)
+{
+ return ecore_audio_obj_paused_get(pd->backend);
+}
+
+EOLIAN static Eina_Bool
+_ecore_audio_out_system_ecore_audio_out_input_attach(Eo *eo_obj EINA_UNUSED, Ecore_Audio_Out_System_Data *pd, Eo *input)
+{
+ if (!efl_isa(input, ECORE_AUDIO_IN_CLASS)) return EINA_FALSE;
+ return ecore_audio_obj_out_input_attach(pd->backend, input);
+}
+
+EOLIAN static Eina_Bool
+_ecore_audio_out_system_ecore_audio_out_input_detach(Eo *eo_obj EINA_UNUSED, Ecore_Audio_Out_System_Data *pd, Eo *input)
+{
+ if (!efl_isa(input, ECORE_AUDIO_IN_CLASS)) return EINA_FALSE;
+ return ecore_audio_obj_out_input_detach(pd->backend, input);
+}
+
+EOLIAN static Eina_List *
+_ecore_audio_out_system_ecore_audio_out_inputs_get(Eo *eo_obj EINA_UNUSED, Ecore_Audio_Out_System_Data *pd)
+{
+ return ecore_audio_obj_out_inputs_get(pd->backend);
+}
+
+#include "ecore_audio_out_system.eo.c"
diff --git a/src/lib/ecore_audio/ecore_audio_obj_out_system.h b/src/lib/ecore_audio/ecore_audio_obj_out_system.h
new file mode 100644
index 0000000000..b0ba16d8d2
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_obj_out_system.h
@@ -0,0 +1,14 @@
+#ifndef ECORE_AUDIO_OBJ_OUT_SYSTEM_H
+#define ECORE_AUDIO_OBJ_OUT_SYSTEM_H
+
+#include <Eina.h>
+#include <Eo.h>
+
+/**
+ * @file ecore_audio_obj_out_system.h
+ * @brief Ecore_Audio portable system output.
+ */
+
+#include "ecore_audio_out_system.eo.h"
+
+#endif
diff --git a/src/lib/ecore_audio/ecore_audio_out_system.eo b/src/lib/ecore_audio/ecore_audio_out_system.eo
new file mode 100644
index 0000000000..fe6a927531
--- /dev/null
+++ b/src/lib/ecore_audio/ecore_audio_out_system.eo
@@ -0,0 +1,27 @@
+class @beta Ecore.Audio.Out.System extends Ecore.Audio.Out
+{
+ [[Portable audio output using WASAPI on Windows and PulseAudio elsewhere.
+
+ Construction fails if the platform backend is unavailable. Inputs are
+ attached to the owned backend, so Ecore.Audio.In.output returns that
+ backend. Input lists and playback capabilities follow the backend.
+ ]]
+ c_prefix: ecore_audio_obj_out_system;
+ event_c_prefix: ecore_audio_out_system;
+ implements {
+ Efl.Object.constructor;
+ Efl.Object.destructor;
+ Ecore.Audio.volume { set; get; }
+ Ecore.Audio.paused { set; get; }
+ @empty Ecore.Audio.format { set; get; }
+ @empty Ecore.Audio.source { set; get; }
+ Ecore.Audio.Out.input_attach;
+ Ecore.Audio.Out.input_detach;
+ Ecore.Audio.Out.inputs_get;
+ }
+ events {
+ context,ready: void; [[Called when the backend is ready for playback.]]
+ context,fail: void; [[Called when the backend context fails.]]
+ stop: void; [[Forwarded when the backend requests a stop (WASAPI only).]]
+ }
+}
diff --git a/src/lib/ecore_audio/meson.build b/src/lib/ecore_audio/meson.build
index 95ffddf5b5..cea043d18a 100644
--- a/src/lib/ecore_audio/meson.build
+++ b/src/lib/ecore_audio/meson.build
@@ -6,6 +6,7 @@ pub_eo_files = [
'ecore_audio.eo',
'ecore_audio_in.eo',
'ecore_audio_out.eo',
+ 'ecore_audio_out_system.eo',
'ecore_audio_in_sndfile.eo',
'ecore_audio_out_sndfile.eo',
'ecore_audio_out_pulse.eo',
@@ -35,6 +36,7 @@ ecore_audio_header_src = [
'ecore_audio_obj.h',
'ecore_audio_obj_in.h',
'ecore_audio_obj_out.h',
+ 'ecore_audio_obj_out_system.h',
'ecore_audio_obj_in_tone.h',
'ecore_audio_protected.h',
'ecore_audio_obj_out_pulse.h',
@@ -48,6 +50,7 @@ ecore_audio_src = files([
'ecore_audio_obj.c',
'ecore_audio_obj_in.c',
'ecore_audio_obj_out.c',
+ 'ecore_audio_obj_out_system.c',
'ecore_audio_obj_in_tone.c',
'ecore_audio_private.h'
])
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.