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.
This commit is contained in:
Marcel Hollerbach 2016-09-07 11:02:46 +02:00
parent 1da2bbcd9c
commit 1a3086b2c2
6 changed files with 45 additions and 17 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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*/

View File

@ -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,

View File

@ -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)
{

View File

@ -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 */