bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=1a3086b2c20c79a63f266ebf8dfddc05e9bc193e

commit 1a3086b2c20c79a63f266ebf8dfddc05e9bc193e
Author: Marcel Hollerbach <marcel-hollerb...@t-online.de>
Date:   Wed Sep 7 11:02:46 2016 +0200

    mixer: introduce emix_max_volume_get
    
    This lets the module decide what its maximum value is.
    Everything over 100% is considered overloading. And is protected by the
    mixer and the gadget.
---
 src/modules/mixer/e_mod_main.c                    |  8 ++++----
 src/modules/mixer/emixer.c                        | 12 ++++++------
 src/modules/mixer/lib/backends/alsa/alsa.c        | 13 +++++++++++--
 src/modules/mixer/lib/backends/pulseaudio/pulse.c | 13 ++++++++++---
 src/modules/mixer/lib/emix.c                      |  9 +++++++++
 src/modules/mixer/lib/emix.h                      |  7 +++++--
 6 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/src/modules/mixer/e_mod_main.c b/src/modules/mixer/e_mod_main.c
index bff3be4..db7a1d7 100644
--- a/src/modules/mixer/e_mod_main.c
+++ b/src/modules/mixer/e_mod_main.c
@@ -189,10 +189,10 @@ _volume_increase_cb(E_Object *obj EINA_UNUSED, const char 
*params EINA_UNUSED)
    volume.volumes = calloc(s->volume.channel_count, sizeof(int));
    for (i = 0; i < volume.channel_count; i++)
      {
-        if (s->volume.volumes[i] < (EMIX_VOLUME_MAX + 50) - VOLUME_STEP)
+        if (s->volume.volumes[i] < (emix_max_volume_get()) - VOLUME_STEP)
           volume.volumes[i] = s->volume.volumes[i] + VOLUME_STEP;
-        else if (s->volume.volumes[i] < EMIX_VOLUME_MAX + 50)
-          volume.volumes[i] = EMIX_VOLUME_MAX + 50;
+        else if (s->volume.volumes[i] < emix_max_volume_get())
+          volume.volumes[i] = emix_max_volume_get();
         else
           volume.volumes[i] = s->volume.volumes[i];
      }
@@ -463,7 +463,7 @@ _popup_new(Instance *inst)
    evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
    evas_object_show(slider);
-   elm_slider_min_max_set(slider, 0.0, EMIX_VOLUME_MAX + 50);
+   elm_slider_min_max_set(slider, 0.0, emix_max_volume_get());
    evas_object_smart_callback_add(slider, "changed", _slider_changed_cb, NULL);
    evas_object_smart_callback_add(slider, "slider,drag,stop", 
_slider_drag_stop_cb, NULL);
    elm_slider_value_set(slider, volume);
diff --git a/src/modules/mixer/emixer.c b/src/modules/mixer/emixer.c
index 0d5b62e..61ae830 100644
--- a/src/modules/mixer/emixer.c
+++ b/src/modules/mixer/emixer.c
@@ -144,8 +144,8 @@ _emix_sink_add(Emix_Sink *sink)
 
    sl = elm_slider_add(win);
    evas_object_data_set(bxv, "volume", sl);
-   elm_slider_min_max_set(sl, 0.0, EMIX_VOLUME_MAX + 50);
-   elm_slider_span_size_set(sl, (EMIX_VOLUME_MAX + 50) * 
elm_config_scale_get());
+   elm_slider_min_max_set(sl, 0.0, emix_max_volume_get());
+   elm_slider_span_size_set(sl, emix_max_volume_get() * 
elm_config_scale_get());
    elm_slider_unit_format_set(sl, "%1.0f");
    elm_slider_indicator_format_set(sl, "%1.0f");
    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.5);
@@ -324,8 +324,8 @@ _emix_sink_input_add(Emix_Sink_Input *input)
 
    sl = elm_slider_add(win);
    evas_object_data_set(bxv, "volume", sl);
-   elm_slider_min_max_set(sl, 0.0, EMIX_VOLUME_MAX + 50);
-   elm_slider_span_size_set(sl, (EMIX_VOLUME_MAX + 50) * 
elm_config_scale_get());
+   elm_slider_min_max_set(sl, 0.0, emix_max_volume_get());
+   elm_slider_span_size_set(sl, (emix_max_volume_get()) * 
elm_config_scale_get());
    elm_slider_unit_format_set(sl, "%1.0f");
    elm_slider_indicator_format_set(sl, "%1.0f");
    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.5);
@@ -476,8 +476,8 @@ _emix_source_add(Emix_Source *source)
 
    sl = elm_slider_add(win);
    evas_object_data_set(bxv, "volume", sl);
-   elm_slider_min_max_set(sl, 0.0, EMIX_VOLUME_MAX + 50);
-   elm_slider_span_size_set(sl, (EMIX_VOLUME_MAX + 50) * 
elm_config_scale_get());
+   elm_slider_min_max_set(sl, 0.0, emix_max_volume_get());
+   elm_slider_span_size_set(sl, (emix_max_volume_get()) * 
elm_config_scale_get());
    elm_slider_unit_format_set(sl, "%1.0f");
    elm_slider_indicator_format_set(sl, "%1.0f");
    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.5);
diff --git a/src/modules/mixer/lib/backends/alsa/alsa.c 
b/src/modules/mixer/lib/backends/alsa/alsa.c
index add473a..063cb23 100644
--- a/src/modules/mixer/lib/backends/alsa/alsa.c
+++ b/src/modules/mixer/lib/backends/alsa/alsa.c
@@ -1,6 +1,8 @@
 #include "emix.h"
 #include <alsa/asoundlib.h>
 
+#define MAX_VOLUME 100
+
 #define ERR(...)      EINA_LOG_ERR(__VA_ARGS__)
 #define DBG(...)      EINA_LOG_DBG(__VA_ARGS__)
 #define WRN(...)      EINA_LOG_WARN(__VA_ARGS__)
@@ -74,7 +76,7 @@ _alsa_channel_volume_get(snd_mixer_elem_t *channel, int *v, 
Eina_Bool capture)
    else
      snd_mixer_selem_get_playback_volume_range(channel, &min, &max);
 
-   divide = 100 + min;
+   divide = MAX_VOLUME + min;
    if (divide == 0)
      {
         divide = 1;
@@ -99,7 +101,7 @@ _alsa_channel_volume_set(snd_mixer_elem_t *channel, int v, 
Eina_Bool capture)
    long int vol, min, max, divide, range;
    snd_mixer_selem_get_playback_volume_range(channel, &min, &max);
 
-   divide = 100 + min;
+   divide = MAX_VOLUME + min;
    range = max - min;
    if (range < 1)
      return;
@@ -503,11 +505,18 @@ _alsa_sink_volume_set(Emix_Sink *sink, Emix_Volume v)
                   (Emix_Sink *)s);
 }
 
+static int
+_max_volume(void)
+{
+   return MAX_VOLUME;
+}
+
 static Emix_Backend
 _alsa_backend =
 {
    _alsa_init,
    _alsa_shutdown,
+   _max_volume,
    _alsa_sinks_get,
    _alsa_support, /*default support*/
    NULL, /*get*/
diff --git a/src/modules/mixer/lib/backends/pulseaudio/pulse.c 
b/src/modules/mixer/lib/backends/pulseaudio/pulse.c
index 40dda05..f558b5b 100644
--- a/src/modules/mixer/lib/backends/pulseaudio/pulse.c
+++ b/src/modules/mixer/lib/backends/pulseaudio/pulse.c
@@ -11,11 +11,11 @@
 #define WRN(...)      EINA_LOG_WARN(__VA_ARGS__)
 
 #define PA_VOLUME_TO_INT(_vol) \
-   ((_vol * EMIX_VOLUME_MAX) / \
+   ((_vol * EMIX_VOLUME_BARRIER) / \
     PA_VOLUME_NORM)
 #define INT_TO_PA_VOLUME(_vol) \
    ((PA_VOLUME_NORM * _vol) / \
-    EMIX_VOLUME_MAX)
+    EMIX_VOLUME_BARRIER)
 
 typedef struct _Context
 {
@@ -491,7 +491,7 @@ _source_changed_cb(pa_context *c EINA_UNUSED,
 
    if (!source)
      {
-        source = calloc(1, sizeof(Source)); 
+        source = calloc(1, sizeof(Source));
         EINA_SAFETY_ON_NULL_RETURN(source);
         ctx->sources = eina_list_append(ctx->sources, source);
      }
@@ -1057,11 +1057,18 @@ _sink_change_support(void)
    return EINA_TRUE;
 }
 
+static int
+_max_volume(void)
+{
+   return 150;
+}
+
 static Emix_Backend
 _pulseaudio_backend =
 {
    _init,
    _shutdown,
+   _max_volume,
    _sinks_get,
    _sink_default_support,
    _sink_default_get,
diff --git a/src/modules/mixer/lib/emix.c b/src/modules/mixer/lib/emix.c
index 41babec..898df3a 100644
--- a/src/modules/mixer/lib/emix.c
+++ b/src/modules/mixer/lib/emix.c
@@ -170,6 +170,15 @@ emix_backends_available(void)
    return ctx->backends_names;
 }
 
+int
+emix_max_volume_get(void)
+{
+   EINA_SAFETY_ON_FALSE_RETURN_VAL((ctx && ctx->loaded &&
+                                    ctx->loaded->ebackend_max_volume_get),
+                                   0);
+  return ctx->loaded->ebackend_max_volume_get();
+}
+
 Eina_Bool
 emix_backend_set(const char *backend)
 {
diff --git a/src/modules/mixer/lib/emix.h b/src/modules/mixer/lib/emix.h
index d177220..1f1ee5e 100644
--- a/src/modules/mixer/lib/emix.h
+++ b/src/modules/mixer/lib/emix.h
@@ -23,7 +23,7 @@
 #endif
 
 
-#define EMIX_VOLUME_MAX 100
+#define EMIX_VOLUME_BARRIER 100
 
 enum Emix_Event {
    EMIX_READY_EVENT = 0,
@@ -79,6 +79,8 @@ typedef struct _Emix_Backend {
    Eina_Bool             (*ebackend_init)(Emix_Event_Cb cb, const void *data);
    void                  (*ebackend_shutdown)(void);
 
+   int                   (*ebackend_max_volume_get)(void);
+
    const Eina_List*      (*ebackend_sinks_get)(void);
    Eina_Bool             (*ebackend_sink_default_support)(void);
    const Emix_Sink*      (*ebackend_sink_default_get)(void);
@@ -118,6 +120,8 @@ E_API Eina_Bool           
emix_event_callback_add(Emix_Event_Cb cb,
                                                  const void *data);
 E_API Eina_Bool           emix_event_callback_del(Emix_Event_Cb cb);
 
+E_API int                 emix_max_volume_get(void);
+
 E_API const Eina_List*    emix_sinks_get(void);
 E_API Eina_Bool           emix_sink_default_support(void);
 E_API const Emix_Sink*    emix_sink_default_get(void);
@@ -141,7 +145,6 @@ E_API void                emix_source_mute_set(Emix_Source 
*source,
                                                   Eina_Bool mute);
 E_API void                emix_source_volume_set(Emix_Source *source,
                                                 Emix_Volume volume);
-
 E_API Evas_Object*        emix_advanced_options_add(Evas_Object *parent);
 
 #endif  /* EMIX_H */

-- 


Reply via email to