forked from enlightenment/enlightenment
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:
parent
1da2bbcd9c
commit
1a3086b2c2
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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*/
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue